node

二叉搜索树06-第六天

半世苍凉 提交于 2020-02-10 20:42:58
1.一些树的动画演示网站 http://520it.com/binarytrees/ http://btv.melezinek.cz/binary-search-tree.html https://www.cs.usfca.edu/~galles/visualization/Algorithms.html https://yangez.github.io/btree-js/ https://www.codelike.in/ 2.二叉树的遍历 2.1前序遍历 2.2前序非递归遍历 2.3中序遍历 2.5后序遍历 2.6层次遍历 3.相关代码总结 3.1前序遍历 // /** // * 前序遍历 // */ public void preorderTraversal() { preorderTraversal(root); } private void preorderTraversal(Node<E> node) { if (node == null) return; System.out.println(node.element); preorderTraversal(node.left); preorderTraversal(node.right); } View Code 3.2中序遍历 // /** // * 中序遍历 // */ public void

Home Assistant 搭建日志(七)——安装NodeRed

三世轮回 提交于 2020-02-10 19:59:21
教程列表 Home Assistant 搭建日志(一)——安装树莓派系统 Home Assistant 搭建日志(二)——配置树莓派系统 Home Assistant 搭建日志(三)——安装与启动Home Assistant Home Assistant 搭建日志(四)——外网访问Home Assistant Home Assistant 搭建日志(五)——让蓝牙音箱唱歌 Home Assistant 搭建日志(六)——MPD播放器 Home Assistant 搭建日志(七)——安装NodeRed 对于 NodeRed 的安装,最简单的就是直接使用 apt 来安装,但是这样会出现个问题,就是安装 NodeRed 时,要安装依赖 NodeJS 和 NPM ,而当前 buster 源里, NodeJS 的版本是 10.15.2~dfsg-2+rpi1 , NPM 的版本是 5.8.0+ds6-4 ,这两个版本之间并不是完全兼容的,所以使用的时候会一直报警告,使用 npm install 有些情况还出现错误。例如在安装 NeteaseCloudMusicApi 就一直失败。 虽然可以通过命令 npm install -g npm 把 NPM 升级到新版,但是之前 apt 是把 NPM 安装在 /usr/bin 里,升级命令是把新的 NPM 安装到 /usr/local/bin 里

ConcurrentHashMap 1.7/1.8比较

此生再无相见时 提交于 2020-02-10 19:04:10
ConcurrentHashMap JDK7中的实现 1.1 设计思路 1.2 并发度(Concurrency Level) 1.3 创建分段锁 1.4 put/putIfAbsent/putAll 1.5 rehash 1.6 remove 1.7 get与containsKey 1.8 size、containsValue JDK8中的实现 2.1 重要的类 2.2.1 Node 2.2.2 TreeNode 2.2.3 TreeBin 2.2.4 ForwardingNode 2.3 Unsafe与CAS 2.3.1 unsafe静态块 2.3.2 三个核心方法 2.4 初始化方法initTable 2.5 扩容方法 transfer 2.6 Put方法 2.6.1 helpTransfer方法 2.6.2 treeifyBin方法 2.7 get方法 总结 java容器可参见: 集合底层实现原理   并发编程实践中,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求。ConcurrentHashMap大量运用volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响。 JDK7中的实现 1.1 设计思路  

node - koa中间件

不想你离开。 提交于 2020-02-10 17:42:47
koa中的中间件分析: 用输出顺序模拟了了koa的洋葱模型,借着输出结果,分析下输出下边结果的原因: 看到我使用了async和await,会明白中间件参数函数是异步函数,因为里边的next( ) 是异步的 ( next()相当于下一个中间件 ) ,输出2的时机是:必须等到下一个中间件执行完毕后,才能输出2。 const Koa = require('koa') const app = new Koa() // 洋葱模型: 执行顺序是 1 3 4 2 app.use( async (ctx, next) => { console.log('1') await next() console.log('2') }) app.use( async (ctx, next) => { console.log('3') await next() console.log('4') }) app.listen(3000) 其实,next返回的是一个Promise对象,之所以里边为undefined,因为下一个中间件没有返回值。 // 洋葱模型: 执行顺序是 1 3 4 Promise{undefined} 2 app.use((ctx, next) => { console.log('1') const nextPromise = next() console.log(nextPromise)

133. Clone Graph

南笙酒味 提交于 2020-02-10 11:13:47
Given a reference of a node in a connected undirected graph. Return a deep copy (clone) of the graph. Each node in the graph contains a val (int) and a list (List[Node]) of its neighbors. class Node { public int val; public List<Node> neighbors; } Test case format: For simplicity sake, each node's value is the same as the node's index (1-indexed). For example, the first node with val = 1, the second node with val = 2, and so on. The graph is represented in the test case using an adjacency list. Adjacency list is a collection of unordered lists used to represent a finite graph. Each list

jdk8 hashmap 链表resize 源码分析

妖精的绣舞 提交于 2020-02-10 10:52:17
重点看这部分代码 for (int j = 0; j < oldCap; ++j) { Node<K,V> e; if ((e = oldTab[j]) != null) { oldTab[j] = null; if (e.next == null) newTab[e.hash & (newCap - 1)] = e; else if (e instanceof TreeNode) ((TreeNode<K,V>)e).split(this, newTab, j, oldCap); else { // preserve order Node<K,V> loHead = null, loTail = null; Node<K,V> hiHead = null, hiTail = null; Node<K,V> next; do { next = e.next; if ((e.hash & oldCap) == 0) { if (loTail == null) loHead = e; else loTail.next = e; loTail = e; } else { if (hiTail == null) hiHead = e; else hiTail.next = e; hiTail = e; } } while ((e = next) != null); if (loTail !

OpenCV FileStorage 使用记录

北城余情 提交于 2020-02-10 09:03:59
FileStorage OpenCV 中的 FileStorage 类能够读写硬盘中的 .xml 和 .yaml 文件,这里我们只讨论对 .xml 的以下几种操作: 写入( FileStorage::WRITE ,覆盖写) 追加( FileStorage::APPEND ,追加写) 读取( FileStorage::WRITE ) FileStorage 以 FileNode 为单位存储数据,且 无法删改 某个已有 FileNode 的内容,想实现删改功能,得自己造轮子…… 写入FileNode FileNode 有两种类型, seq 和 map : FileStorage fs("data.xml", FileStorage::WRITE); // seq_node 是一个 seq 型的节点, 以它为父节点,存入10个数据 fs << "seq_node" << "["; for(size_t i = 0; i < 10; ++i){ fs << i; } fs << "]"; // map_node 是一个 map 型节点, 以它为父节点,存入10个数据 fs << "map_node" << "{"; for(size_t i = 0; i < 10; ++i){ fs << "node_" + to_string(i) << i; } fs << "}"; fs

字典树存在的意义

喜你入骨 提交于 2020-02-10 08:22:01
1. 字典树   曾经遇到这样一个问题:很多单词,这些单词只含小写字母,并且不会有重复的单词出现,现在要统计出以某个字符串为前缀的单词数量,单词本身也是自己的前缀。先看看用常规的方法解决这个问题的复杂度。假设单词表容量为M,需要统计的前缀数量为N,前缀的平均长度是L,则常规算法思路是:对于每个前缀搜索每个单词,看看这个前缀是不是这个单词的前缀,如果是数量+1。这样的话时间复杂度为O(N*M*L),如果N相当大的话,这个算法的复杂度将无法接受啦。其实这就是字典树的典型应用啦。   我们先学习一下字典树,在解决上面的问题。字典树又称trie树,从名字上看很显然是一种树形结构了。字典树有以下几个特点:1.利用串的公共前缀,节约内存;2.根结点不包含任何字母;3.其余结点仅包含一个字母;4.每个结点的子节点包含字母不同。看看一个例子吧:下面就是一个字典树(图片来自百度百科)    上面的树就是一颗典型的字典树了,字典树中存储的单词包括:abc、abcd、abd、b、bcd、efg、hig,即:所有标记为红心的才是单词的结尾字母。对比上面的trie树的特点仔细看一下,理解一下到底什么是字典树。实际上字典树包括常见的两种种操作是:查找和插入操作。我觉得有必要看看字典树的基础代码:( 代码 ) View Code 1 //字典树的每个节点 2 struct node 3 { 4 bool

vs2015 cordova环境安装

大兔子大兔子 提交于 2020-02-10 04:51:16
原文: vs2015 cordova环境安装 1.参照其他高手的来 http://www.songker.com/index.php/post/151.html VS2015安卓开发Apache Cordova环境安装 正常环境下,下面几个环境都安装成功了 jdk-7u55-windows-x64.exe Android SDK Tools Node.js apache-ant-1.9.3-bin 可以利用下面按钮检测缺失项: 注意点: Android Sdk包的下载,有可能老不完全 图中Obselete勾上,Android Support Library 这个安装上 http://stackoverflow.com/questions/38522681/error-visual-studio-2015-cordova-android-package-extra-android-support 2. Vs新建一个cordova项目,来生成 错误详情 : "C:\Users\songs\AppData\Roaming\Microsoft\VisualStudio\MDA\vs-npm\2.14.9\nodevars.bat" �����..... 解决方法: 下载安装NodeJs。 nodeJs默认安装目录:C:\Program Files (x86)\nodejs\。

线性数据结构案例4 —— 合并两个有序的单链表 合并之后依然有序

我与影子孤独终老i 提交于 2020-02-10 01:38:04
一、介绍 emsp; 我们定义一个新链表然后,将两个链表的元素依次比较,放入比较最小的放到新链表前面。 二、代码 public static Node mergeByOrder(Node l1, Node l2) { if(l1.next == null || l2.next == null) { return l1.next == null ? l2 : l1; } Node newLinkedHead = new Node(0, ""); l1 = l1.next; // 头节点没有数据我们不要 l2 = l2.next; // 头节点没有数据我们不要 Node temp = newLinkedHead; while (l1 != null && l2 != null) { if (l1.no <= l2.no) { temp.next = l1; temp = temp.next; l1 = l1.next; } else { temp.next = l2; temp = temp.next; l2 = l2.next; } } if (l1 == null) { temp.next= l2; // 连接剩余节点 } if (l2 == null) { temp.next= l1; // 连接剩余节点 } return newLinkedHead; } } 来源: https