红黑树、B树和B+树

B+树插入、删除和搜索动态化:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html


几种树的主要区别:

  • 红黑树为二叉自平衡搜索树,深度大,多用于内存排序;
  • B树为多路搜索树,深度低,搜索数据时磁盘IO较少,多用于索引外存数据,只支持随机访问,不支持顺序访问;
  • B+树是对B树的改进,内节点不保存数据地址指针(可保存更多关键字),内节点可看做为外节点的索引,所有数据地址存储在外节点,数据搜索效率一致。外节点依关键字组成顺序链表,支持区间搜索,且空间局部性好,缓存命中率高;

红黑树(Red Black Tree,RBT)

红黑树是一种自平衡二叉搜索树,通过在插入和删除时调整二叉树结构,保持二叉树深度平衡,提高查找效率。

红黑树的五点特性

  1. 每个节点的颜色是黑色或者红色;
  2. 根节点为黑色;
  3. 叶节点(NULL)是黑节点,实际不存在;
  4. 红节点的子节点是黑节点;
  5. 从一个节点到叶节点的路径上包含相同数目的黑节点,黑色平衡树

特性5保证红黑树从根节点到叶节点的最长路径不大于最短路径的两倍,保证黑色平衡的特性。由于这一约束的存在,将插入节点的颜色标记为红色,能够尽可能避免自平衡,插入黑色节点必须做自平衡红黑色通过旋转和变色保持自平衡!

红黑树的高度

定理1:含n个节点的红黑树的高度最多为 2 log 2 ( n + 1 ) 2\log_2(n+1) .

定理1的逆否命题是:高度为 h h 的红黑树,至少至少含 2 h / 2 1 2^{h/2}-1 个节点。由特性5知,从根节点到叶节点的路径 x x 中黑节点数不小于红节点数,路径 x x 中黑节点数 b h ( x ) h / 2 bh(x)\geq h/2 ,只需证明 高度为h的红黑树,至少含 2 b h ( x ) 1 2^{bh(x)}-1 个节点,使用数学归纳法证明:

  • 当树高度为 h = 0 h=0 时,命题显然成立;
  • 当树高度为 h 1 h-1 时,且 h > 0 h>0 ,根节点至叶节点路径中黑高度至少为 b h ( x ) 1 bh(x)-1 ,假设红黑树至少包含 2 b h ( x ) 1 1 2^{bh(x)-1}-1 个节点;
  • 当树高度为 h h 时,路径 x x 中根节点的左右子树的黑高度至少为 b h ( x ) 1 bh(x)-1 ,因此节点数至少为
    ( 2 b h ( x ) 1 1 ) + ( 2 b h ( x ) 1 1 ) + 1 = 2 b h ( x ) 1 (2^{bh(x)-1}-1)+(2^{bh(x)-1}-1)+1=2^{bh(x)}-1
    得证.

红黑树的插入和删除

插入红色节点,插入场景(详见https://www.jianshu.com/p/e136ec79235c):


B-树(Balanced Tree)

当数据足够小可以整驻内存时,使用红黑树等一些平衡树能够获得较好的查询性能,当数据较大时,数据存在外部磁盘,需要设计新的数据结构存储和索引数据。

索引顺序访问(Indexed sequential access method, ISAM) 对顺序和随机访问都具有良好的时间性能,ISAM方法中,磁盘被分为多个块,元素以升序方式存在各个块。

顺序访问时,块按序输入,块中m个元素按升序排列,搜索单元素的磁盘访问次数为1/m。随机访问时,维护一个索引,索引中存储每个块的最大关键字,索引关键字数与块数相同,如果每个块存储元素数m较大,则整个索引可以常驻内存,一次磁盘访问即可完成随机访问。

由于ISAM本质是一种数组描述方法,插入和删除会面临很大问题,如果在每个块预留一些空间,可以适当解决这些难题,但是顺序访问的代价提高了,而B树是一种适用于索引磁盘数据的数据结构。

B树是一种 多路搜索树m阶/度B树 的特点:

  • 根节点至少含2个孩子;
  • 除根节点外的内部节点至少有(m+1)/2个孩子、至多m-1个孩子;
  • 所有外部节点在同一层;

特殊地,二阶B树是满二叉树,三阶B树内部节点有2个或3个孩子。

B树的阶(节点元素个数)取决于磁盘块的大小和元素的大小,不同元素大小占用空间不同:

  • 阶小于磁盘块元素个数,每次访问都是读/写一个块;
  • 阶大于磁盘块个数,会带来多重磁盘访问,查询一个节点中的元素需要访问多次磁盘;

B树的高度

高度为h的m阶B树,令d=(m+1)/2,根节点至少有两个孩子,第2层的两个孩子至少有d个孩子,因此第3层至少有2d个节点,依次类推第4层至少有2d*d个节点,外部(第h+1层)至少有2d^(h-1)个节点,内部元素数等于外部节点数减1,因此内部节点数:
2 d h 1 1 n m h 1 2d^{h-1}-1\leq n\leq m^h-1

根据m阶的限制,节点的上限很容易推得,可见,高度为5,200阶的B树,至少含2*10^8-1个元素

B树的搜索和插入

B树搜索时,最多访问磁盘的次数等于B树的高度。

插入已经存在的key,需要替换key对应的value为新的value。当一个节点饱和时,需要以中间元素分裂节点,将中间元素插入父节点,再判断父节点是否满足,递归检查,


B+树

B+树 内部节点不存储关键字指向的数据地址,数据地址全部存储在叶节点,必须遍历到叶节点才能获得数据地址,所有数据的查询效率一致,查询稳定,而B树内部节点保存有关键字指向的数据地址,靠近根节点的数据查询效率较高。

B+树内节点不保存数值指针,内节点占用空间较小(增加了所有内节点读取到内存的可能),树的阶/度更大,深度更低,读取索引文件进行的IO次数也更小。外节点顺序排序,具备良好的空间局部性,缓存命中率高

B+树内节点关键字数等于孩子指针数,指针指向包含当前关键字的孩子节点,因此 B+树各内节点关键字可能出现重复,B树内节点关键字数等于孩子指针数减一,指针指向大于或小于当前关键字的孩子节点,B树关键字不重复。

B+树内部节点相当于叶节点的索引,叶节点中的关键字组成有序链表,便于区间搜索和遍历,B+树搜索性能几乎等价于二分搜索。

猜你喜欢

转载自blog.csdn.net/sinat_34072381/article/details/107197754