Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit defef98

Browse files
author
lucifer
committed
fix: 更新图片链接
1 parent b71a73d commit defef98

File tree

1 file changed

+11
-14
lines changed

1 file changed

+11
-14
lines changed

thinkings/basic-data-structure.md

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -249,28 +249,20 @@ return, children, sibling 也都是一个 fiber,因此 fiber 看起来就是
249249

250250
## 非线性结构
251251

252-
那么有了线性结构,我们为什么还需要非线性结构呢? 答案是为了高效地兼顾静态操作和动态操作。
253-
大家可以对照各种数据结构的各种操作的复杂度来直观感受一下。
252+
那么有了线性结构,我们为什么还需要非线性结构呢? 答案是为了高效地兼顾静态操作和动态操作。大家可以对照各种数据结构的各种操作的复杂度来直观感受一下。
254253

255254
###
256255

257-
树的应用同样非常广泛,小到文件系统,大到因特网,组织架构等都可以表示为树结构,
258-
而在我们前端眼中比较熟悉的 DOM 树也是一种树结构,而 HTML 作为一种 DSL 去描述这种树结构的具体表现形式。
256+
树的应用同样非常广泛,小到文件系统,大到因特网,组织架构等都可以表示为树结构,而在我们前端眼中比较熟悉的 DOM 树也是一种树结构,而 HTML 作为一种 DSL 去描述这种树结构的具体表现形式。如果你接触过 AST,那么 AST 也是一种树,XML 也是树结构。。。树的应用远比大多数人想象的要得多。
259257

260258
树其实是一种特殊的``,是一种无环连通图,是一种极大无环图,也是一种极小连通图。
261259

262260
从另一个角度看,树是一种递归的数据结构。而且树的不同表示方法,比如不常用的`长子 + 兄弟`法,对于
263261
你理解树这种数据结构有着很大用处, 说是一种对树的本质的更深刻的理解也不为过。
264262

265-
树的基本算法有前中后序遍历和层次遍历,有的同学对前中后这三个分别具体表现的访问顺序比较模糊,
266-
其实当初我也是一样的,后面我学到了一点,你只需要记住:`所谓的前中后指的是根节点的位置,其他位置按照先左后右排列即可`
267-
比如前序遍历就是`根左右`, 中序就是`左根右`,后序就是`左右根`, 很简单吧?
263+
树的基本算法有前中后序遍历和层次遍历,有的同学对前中后这三个分别具体表现的访问顺序比较模糊,其实当初我也是一样的,后面我学到了一点,你只需要记住:`所谓的前中后指的是根节点的位置,其他位置按照先左后右排列即可`。比如前序遍历就是`根左右`, 中序就是`左根右`,后序就是`左右根`, 很简单吧?
268264

269-
我刚才提到了树是一种递归的数据结构,因此树的遍历算法使用递归去完成非常简单,
270-
幸运的是树的算法基本上都要依赖于树的遍历。 但是递归在计算机中的性能一直都有问题,
271-
因此掌握不那么容易理解的"命令式地迭代"遍历算法在某些情况下是有用的。
272-
273-
如果你使用迭代式方式去遍历的话,可以借助上面提到的``来进行,可以极大减少代码量。
265+
我刚才提到了树是一种递归的数据结构,因此树的遍历算法使用递归去完成非常简单,幸运的是树的算法基本上都要依赖于树的遍历。 但是递归在计算机中的性能一直都有问题,因此掌握不那么容易理解的"命令式地迭代"遍历算法在某些情况下是有用的。如果你使用迭代式方式去遍历的话,可以借助上面提到的``来进行,可以极大减少代码量。
274266

275267
> 如果使用栈来简化运算,由于栈是 FILO 的,因此一定要注意左右子树的推入顺序。
276268
@@ -279,6 +271,11 @@ return, children, sibling 也都是一个 fiber,因此 fiber 看起来就是
279271
- 如果树有 n 个顶点,那么其就有 n - 1 条边,这说明了树的顶点数和边数是同阶的。
280272
- 任何一个节点到根节点存在`唯一`路径, 路径的长度为节点所处的深度
281273

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+
282279
### 二叉树
283280

284281
二叉树是节点度数不超过二的树,是树的一种特殊子集,有趣的是二叉树这种被限制的树结构却能够表示和实现所有的树,
@@ -365,7 +362,7 @@ return, children, sibling 也都是一个 fiber,因此 fiber 看起来就是
365362

366363
在这里,平衡指所有叶子的深度趋于平衡,更广义的是指在树上所有可能查找的均摊复杂度偏低。
367364

368-
一些数据库引擎内部就是用的这种数据结构。
365+
一些数据库引擎内部就是用的这种数据结构,其目标也是将查询的操作降低到 logn(树的深度),可以简单理解为`树在数据结构层面构造了二分查找算法`
369366

370367
基本操作:
371368

@@ -391,7 +388,7 @@ return, children, sibling 也都是一个 fiber,因此 fiber 看起来就是
391388

392389
又称 Trie 树,是一种树形结构。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
393390

394-
![trie](../assets/thinkings/trie.jpg)
391+
![](https://tva1.sinaimg.cn/large/006tNbRwly1gajj0g78e6j30al06qwfc.jpg)
395392

396393
(图来自 https://baike.baidu.com/item/%E5%AD%97%E5%85%B8%E6%A0%91/9825209?fr=aladdin)
397394
它有 3 个基本性质:

0 commit comments

Comments
 (0)