多叉查找树和红黑树

多叉查找树和红黑树

image-20201009095034416

上图是一个二叉查找树

  • 二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题:
  • 问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响
  • 问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度.

解决的方法可以使用多叉树

2-3树,2-3-4树就是多叉树,多叉树通过重新组织节点,减少树的高度,能对二叉树进行优化。

二叉树和B树

image-20201009095340937

  • 如图B树通过重新组织节点, 降低了树的高度.
  • 文件系统及数据库系统的设计者利用了磁盘预读原理,将一个节点的大小设为等于一个页(页得大小通常为4k),这样每个节点只需要一次I/O就可以完全载入
  • 将树的度M设置为1024,在600亿个元素中最多只需要4次I/O操作就可以读取到想要的元素, B树(B+)广泛应用于文件存储系统以及数据库系统中

2.1 2-3树

  • 2-3树是最简单的B树结构, 具有如下特点:

  • 2-3树的所有叶子节点都在同一层.(只要是B树都满足这个条件)
    有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点.

  • 有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点.
    2-3树是由二节点和三节点构成的树。

image-20201009095534865

除了23树,还有234树等,概念和23树类似,也是一种B树。 如图:

image-20201009095551307

2.2 B树

除了23树,还有234树都是B树

image-20201009095644344

2-3树是由二节点和三节点构成的树。
B树的阶:节点的最多子节点个数。比如2-3树的阶是3,2-3-4树的阶是4
B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点

关键字集合分布在整颗树中, 即叶子节点和非叶子节点都存放数据.
搜索有可能在非叶子结点结束
其搜索性能等价于在关键字全集内做一次二分查找

2.3 B+树

image-20201009095744803

  • B+树的搜索与B树也基本相同,区别是B+树只有达到叶子结点才命中(B树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找
  • 所有关键字都出现在叶子结点的链表中(即数据只能在叶子节点【也叫稠密索引】),且链表中的关键字(数据)恰好是有序的。
  • 不可能在非叶子结点命中
  • 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层
  • 更适合文件索引系统
  • B树和B+树各有自己的应用场景,不能说B+树完全比B树好,反之亦然.

2.4 B*树

image-20201009095845132

B树定义了非叶子结点关键字个数至少为(2/3)M,即块的最低使用率为2/3,而B+树的块的最低使用率为B+树的1/2。

从第1个特点我们可以看出,B*树分配新结点的概率比B+树要低,空间使用率更高

3.1、2-3树的性质

2-3树类似于一棵完美二叉树(满二叉树),不过就是2-3树允许一个节点有三个孩子,正如其名字一样。2-3树为了维持这种完美的平衡性的愿景。具备如下要求:

1 2节点有且只能有两个孩子节点,并只能包含一个数据项。
2 3节点必有三个孩子,并只能包含两个数据项,从左至右依次递增
3 插入节点时不能将该节点插入到一个空节点上,新的节点只能通过分裂或者融合产生4 当2-3树只有2节点的时候,其只能是一棵满二叉树(完美二叉树)

我们通过图解详细理解一下以上三个性质。

2节点必有两个孩子节点,并只能包含一个数据项:如图1所示,2节点只能有且只能有2个孩子节点,5节点和8节点。并且2直接只能包含一个数据项即6;

img

3节点必有三个孩子,并只能包含两个数据项,从左至右依次递增:如图2所示,5 < 6< 7< 8< 9;

img

插入节点时不能将该节点插入到一个空节点上,新的节点只能通过分裂或者融合产生:关于这一条的解释,我们下面通过2-3树的插入操作好好体会。

返回目录

3.2、2-3树的插入

本章节从2-3树的插入理解“插入节点时不能将该节点插入到一个空节点上,新的节点只能通过分裂或者融合产生”这句话。

在前文《二分搜索树》的分析中我们可知,当我们依次插入(1, 2, 3, 4, 5, 6, 7, 8 …)连续节点时,二分搜索树将退化为链表。本章节我们看看2-3树是如何保持平衡的。

img

如上图3所示,我们一次插入(1,2,3,4,5)五个元素。

插入元素1,创建一个2节点(元素为1)。

插入元素2,1,2元素融合暂时形成一个3节点。为什么2元素不能生成一个节点作为1元素所在节点的右孩子?因为“插入节点时不能将该节点插入到一个空节点上,新的节点只能通过分裂或者融合产生”

插入元素3,1,2,3元素暂时融合形成一个4节点。

分裂,因为这是一棵2-3树,不能存在4节点,所以暂时形成的4节点要进行分裂,将中间的元素作为根节点,左右两个元素各为其左右孩子节点。这时可见形成了一棵满二叉树。

插入元素4,根据元素的大小关系其将会找到元素3所在的节点。因为新插入的节点不能插入到一个空节点上,所以4元素将根据搜索树的性质找到最后一个节点与其融合。即3,4元素将融合为一个三节点。并且4元素要位于3元素的右侧。

插入元素5,同插入元素4,元素5一路查找到3,4元素所在的三节点,与其融合,暂时形成一个4节点。

分裂,3,4,5元素所在的4节点同上面1,2,3元素形成的4节点一样,进行分裂操作。根据大小关系,4元素将会作为根节点,3,5元素各为其左右孩子节点。

融合,前面的分裂操作已经导致该2-3树不满足其第四条性质“当2-3树只有2节点的时候,其只能是一棵满二叉树(完美二叉树)”,所以该2-3树将要向上融合以满足2-3树的性质。我们只需要将4元素所在节点与其父节点即元素2所在的节点进行融合即可。这时,2,4元素就形成了一个3节点。

img

继续插入,6,7元素,最终形成的2-3树如上图4所示。可见,2-3树维护平衡的机制是如此的神奇。整个过程我们是一次插入了(1,2,3,4,5,6,7)7个元素,如果是二分搜索树,该二分搜索树将会退化为一个链表,但是2-3树却神奇的生成了一个满二叉树。

返回目录

三,红黑树

前面恶补了2-3树的知识,接下来我们就进入正题。

红黑树的定义:

1 每个节点或者是红色的,或者是黑色的;
2 根节点是黑色的;
3 每个叶子结点(红黑树中叶子节点为最后的空节点)是黑色的;
4 如果一个节点是红色的,那么他的孩子都是黑色的;
5 从任意一个节点到叶子节点经过的黑色节点是一样的。

上面的5点定义是建立在红黑树是一个二分搜索树的基础上的。所以红黑树具备二分搜索树的所有性质。

看着定义是不是感觉无法理解红黑树?大部分的教材或者博文中对红黑树的讲解都是生硬的根据这5条定义开始。真的是一头雾水,不知所以然。接下来我们根据2-3树的插入过程结合红黑树的性质,看看红黑树的旋转和变色过程。

4.1、2-3树到红黑树的转换规则

前面详细介绍了2-3树的分裂和融合过程,本小节,我们来看看2-3树向红黑树转换的过程。2-3树有两类节点,1节点和2节点。还有一个临时的节点3节点。下面看看2-3树的这三种节点对应于红黑树的节点情况。

img

如上所示:

1节点:对应于红黑树的黑色节点。

2节点:对应于红黑树黑色的父节点和红色的左孩子节点。

3节点:对应于红色的父节点和黑色的左右孩子节点。这里需要说一下,为什么是红色的父节点而不是黑色的呢?主要是因为2-3树的3节点需要将分裂后的父节点进行向上融合,红色的符合我们向红黑树中插入任何一个节点默认都是红色的实现方式(后面会介绍)。如果该父节点是红黑树的根节点的话,那他肯定需要变色,这一点就不属于2-3树向红黑树的变换规则了,而属于红黑树的性质。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值