Android开发

《算法—深入浅出》N叉树的介绍

2021-01-17  本文已影响0人  青叶小小

一、《算法—深入浅出》N叉树的介绍
二、《算法—深入浅出》红黑树的旋转

一、前言

计算机科班生肯定在大一/大二就学过《数据结构》或类似的这样的书,书里有很多最基础的数据结构与算法,如:

等等......

要想学好,或者弄清楚市面上的各种树:

二、二叉搜索树(BST)

特点:

如下图:


BST.png

优点:

当树的左右子树高度接近时,查找的时间效率接近 O(n) = logN,基于没有空间开销 O(1)

但是,在极端情况下,B树会退化成一棵线性树:


BST-Line.png

此时,B树的查找、新增、删除时间复杂度都是 O(n) = N

三、平衡二叉树(AVL)

AVL树的性质:

还是拿BST中的图来阐明:


BST.png

基于 AVL 的特点,在搜索/查找方面,其时间复杂度 O(n) = logN;

但是,由于严苛的平衡要求,当插入或删除节点时,可能会不满足左右子树高度差,因此需要递归调整,可能引起整棵树的递归 + 旋转操作。

四、红黑树(R-B Tree)

红黑树满足 BST 的特性,它不需要像 AVL 那样,要完全的平衡(左右子树高度差不超过1)。
下图中,列出了满足红黑树的 5 条性质,其中,第5点,是针对 AVL 完全平衡的一个宽松条件。

RBT.png

之后会有一系列专门介绍红黑树,以及如何旋转、插入、删除节点来调整红黑树。

五、多叉搜索树 B 树( B-Tree )

B树是 BST 树的一个优化,BST 树只能有最多两棵子树,因此当节点很多时,树的高度就会很高。

大家可能会说,高就高呗,但是效率快!

嗯....确实,但这些都是在内存中操作,当然没有问题;如果是 TB 级数据呢,内存还放的下么?或者数量级更大点?

这时我们可能就需要将数据存到文件中,而文件是在硬盘上,硬盘又有盘片、磁道(柱面)、扇区,硬盘的读写效率取决于数据的连续性(通常一个扇区 128 * 2N次方 字节),如果数据不连续,都是指针控制,那硬盘的磁头需要来回反复切换盘片、磁道(柱面)、扇区,因此,效率就会很低。

B 树以及后面我们会说的 B+ 树,都会应用于数据库中,海量级的数据,都以文件的方式来存储,因此,需要考虑内存、文件、磁盘等因素导致的效率问题。

首先,给出几个概念,B / B+ / B* 都会涉及到:

先来看一下 B 树,如下图(M = 3):


B.png

好了,概念就这 么多,下面来介绍下 B树 的特性:

  1. 定义任意非叶子结点最多只有M个儿子;且M>2;
  2. 根结点的儿子数为[2, M];
  3. 除根结点以外的非叶子结点的儿子数为[M/2, M];
  4. 每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
  5. 非叶子结点的关键字个数=指向儿子的指针个数-1;
  6. 非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
  7. 非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
  8. 所有叶子结点位于同一层;

B树 查找:

  1. B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束;
  2. 否则进入查询关键字所属范围的儿子结点;
  3. 重复1 / 2,直到所对应的儿子指针为空,或已经是叶子结点;

六、B+ 树

B+ 树与 B- 树基本概念相同,除了:

B+ 树如下图(M = 3):


B+.png

再讲 B+ 树特性,再强调一下:
上图中的非叶子节点,其关键字只是告诉你该去哪里去找真正的数据,仅做查找比较使用,真实数据都在叶子节点中。

B+ 树的特性:

七、B* 树

B* 树是基于 B+ 树再次升级,特点是:在B+树的非根和非叶子结点再增加指向兄弟的指针。


B*.png

所以,B* 树分配新结点的概率比 B+ 树要低,空间使用率更高;

八、总结

上一篇下一篇

猜你喜欢

热点阅读