@@ -249,28 +249,20 @@ return, children, sibling 也都是一个 fiber,因此 fiber 看起来就是
249
249
250
250
## 非线性结构
251
251
252
- 那么有了线性结构,我们为什么还需要非线性结构呢? 答案是为了高效地兼顾静态操作和动态操作。
253
- 大家可以对照各种数据结构的各种操作的复杂度来直观感受一下。
252
+ 那么有了线性结构,我们为什么还需要非线性结构呢? 答案是为了高效地兼顾静态操作和动态操作。大家可以对照各种数据结构的各种操作的复杂度来直观感受一下。
254
253
255
254
### 树
256
255
257
- 树的应用同样非常广泛,小到文件系统,大到因特网,组织架构等都可以表示为树结构,
258
- 而在我们前端眼中比较熟悉的 DOM 树也是一种树结构,而 HTML 作为一种 DSL 去描述这种树结构的具体表现形式。
256
+ 树的应用同样非常广泛,小到文件系统,大到因特网,组织架构等都可以表示为树结构,而在我们前端眼中比较熟悉的 DOM 树也是一种树结构,而 HTML 作为一种 DSL 去描述这种树结构的具体表现形式。如果你接触过 AST,那么 AST 也是一种树,XML 也是树结构。。。树的应用远比大多数人想象的要得多。
259
257
260
258
树其实是一种特殊的` 图 ` ,是一种无环连通图,是一种极大无环图,也是一种极小连通图。
261
259
262
260
从另一个角度看,树是一种递归的数据结构。而且树的不同表示方法,比如不常用的` 长子 + 兄弟 ` 法,对于
263
261
你理解树这种数据结构有着很大用处, 说是一种对树的本质的更深刻的理解也不为过。
264
262
265
- 树的基本算法有前中后序遍历和层次遍历,有的同学对前中后这三个分别具体表现的访问顺序比较模糊,
266
- 其实当初我也是一样的,后面我学到了一点,你只需要记住:` 所谓的前中后指的是根节点的位置,其他位置按照先左后右排列即可 ` 。
267
- 比如前序遍历就是` 根左右 ` , 中序就是` 左根右 ` ,后序就是` 左右根 ` , 很简单吧?
263
+ 树的基本算法有前中后序遍历和层次遍历,有的同学对前中后这三个分别具体表现的访问顺序比较模糊,其实当初我也是一样的,后面我学到了一点,你只需要记住:` 所谓的前中后指的是根节点的位置,其他位置按照先左后右排列即可 ` 。比如前序遍历就是` 根左右 ` , 中序就是` 左根右 ` ,后序就是` 左右根 ` , 很简单吧?
268
264
269
- 我刚才提到了树是一种递归的数据结构,因此树的遍历算法使用递归去完成非常简单,
270
- 幸运的是树的算法基本上都要依赖于树的遍历。 但是递归在计算机中的性能一直都有问题,
271
- 因此掌握不那么容易理解的"命令式地迭代"遍历算法在某些情况下是有用的。
272
-
273
- 如果你使用迭代式方式去遍历的话,可以借助上面提到的` 栈 ` 来进行,可以极大减少代码量。
265
+ 我刚才提到了树是一种递归的数据结构,因此树的遍历算法使用递归去完成非常简单,幸运的是树的算法基本上都要依赖于树的遍历。 但是递归在计算机中的性能一直都有问题,因此掌握不那么容易理解的"命令式地迭代"遍历算法在某些情况下是有用的。如果你使用迭代式方式去遍历的话,可以借助上面提到的` 栈 ` 来进行,可以极大减少代码量。
274
266
275
267
> 如果使用栈来简化运算,由于栈是 FILO 的,因此一定要注意左右子树的推入顺序。
276
268
@@ -279,6 +271,11 @@ return, children, sibling 也都是一个 fiber,因此 fiber 看起来就是
279
271
- 如果树有 n 个顶点,那么其就有 n - 1 条边,这说明了树的顶点数和边数是同阶的。
280
272
- 任何一个节点到根节点存在` 唯一 ` 路径, 路径的长度为节点所处的深度
281
273
274
+ 实际使用的树有可能会更复杂,比如使用在游戏中的碰撞检测可能会用到四叉树或者八叉树。以及 k 维的树结构 ` k-d 树 ` 等。
275
+
276
+ ![ ] ( https://tva1.sinaimg.cn/large/006tNbRwgy1gajhqov8pjj306y06mweo.jpg )
277
+ (图片来自 https://zh.wikipedia.org/wiki/K-d%E6%A0%91)
278
+
282
279
### 二叉树
283
280
284
281
二叉树是节点度数不超过二的树,是树的一种特殊子集,有趣的是二叉树这种被限制的树结构却能够表示和实现所有的树,
@@ -365,7 +362,7 @@ return, children, sibling 也都是一个 fiber,因此 fiber 看起来就是
365
362
366
363
在这里,平衡指所有叶子的深度趋于平衡,更广义的是指在树上所有可能查找的均摊复杂度偏低。
367
364
368
- 一些数据库引擎内部就是用的这种数据结构。
365
+ 一些数据库引擎内部就是用的这种数据结构,其目标也是将查询的操作降低到 logn(树的深度),可以简单理解为 ` 树在数据结构层面构造了二分查找算法 ` 。
369
366
370
367
基本操作:
371
368
@@ -391,7 +388,7 @@ return, children, sibling 也都是一个 fiber,因此 fiber 看起来就是
391
388
392
389
又称 Trie 树,是一种树形结构。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
393
390
394
- ![ trie ] ( ../assets/thinkings/trie .jpg)
391
+ ![ ] ( https://tva1.sinaimg.cn/large/006tNbRwly1gajj0g78e6j30al06qwfc .jpg)
395
392
396
393
(图来自 https://baike.baidu.com/item/%E5%AD%97%E5%85%B8%E6%A0%91/9825209?fr=aladdin )
397
394
它有 3 个基本性质:
0 commit comments