红黑树,B+和B-区别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

红⿊树,B+和B-区别
⼆叉查找树
⼆叉查找树也称为有序⼆叉查找树,满⾜⼆叉查找树的⼀般性质,是指⼀棵空树具有如下性质:
任意节点左⼦树不为空,则左⼦树的值均⼩于根节点的值.
任意节点右⼦树不为空,则右⼦树的值均⼤于于根节点的值.
任意节点的左右⼦树也分别是⼆叉查找树.
没有键值相等的节点.
B/B+树是为了磁盘或其它存储设备⽽设计的⼀种平衡多路查找树(相对于⼆叉,B树每个内节点有多个分⽀),与红⿊树相⽐,在相同的的节点的情况下,⼀颗B/B+树的⾼度远远⼩于红⿊树的⾼度
B+树,B-树区别
1)B+树中只有叶⼦节点会带有指向记录的指针,⽽B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶⼦节点中。

2)B+树中所有叶⼦节点都是通过指针连接在⼀起,⽽B树不会。

3)B+树的所有叶结点构成⼀个有序链表,可以按照关键码排序的次序遍历全部记录,由于数据顺序排列并且相连,所以便于区间查找和搜索。

⽽B 树则需要进⾏每⼀层的递归遍历。

相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

B树的优点:
如果经常访问的数据离根节点很近,⽽B树的⾮叶⼦节点存储关键字数据的地址,所以这种数据检索的时候会要⽐B+树快。

B+树优点:
1. B+树的层级更少:相较于B树B+每个⾮叶⼦节点存储的关键字数更多,树的层级更少所以查询数据更快;
2. B+树查询速度更稳定:B+所有关键字数据地址都存在叶⼦节点上,所以每次查找的次数都相同所以查询速度要⽐B树更稳定;
3. B+树天然具备排序功能:B+树所有的叶⼦节点数据构成了⼀个有序链表,在查询⼤⼩区间的数据时候更⽅便,数据紧密性很⾼,缓存的命中率
也会⽐B树⾼。

4. B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶⼦节点即可,⽽不需要像B树⼀样需要对每⼀层进⾏遍历,这有利于数据库做全表
扫描。

适应场景
通常⽤于数据库和操作系统的⽂件系统中。

红⿊树
⼀种⼆叉查找树,但在每个节点增加⼀个存储位表⽰节点的颜⾊,可以是red或black. 通过对任何⼀条从根到叶⼦的路径上各个节点着⾊的⽅式的限制,红⿊树确保没有⼀条路径会⽐其它路径长出两倍.它是⼀种弱平衡⼆叉树(由于是若平衡,可以推出,相同的节点情况下,AVL树的⾼度低于红⿊树),相对于要求严格的AVL树来说,它的旋转次数变少,所以对于搜索,插⼊,删除操作多的情况下,我们就⽤红⿊树.
性质
1.每个节点⾮红即⿊.
2.根节点是⿊的。

3.每个叶节点(叶节点即树尾端NUL指针或NULL节点)都是⿊的.
4.如果⼀个节点是红的,那么它的两⼉⼦都是⿊的.
5.对于任意节点⽽⾔,其到叶⼦点树NIL指针的每条路径都包含相同数⽬的⿊节点
适⽤场景
1.JAVA中TreeMap就是⽤的红⿊树
现在想想,我的理解红⿊树是让平衡树(AVL)更平衡,结构上更加直观,时间效能针对读取⽽⾔更⾼,但是维护起来⽐较⿇烦(插⼊和删除之后,都需要rebalance)。

但是,红⿊树通过它规则的设定,确保了插⼊和删除的最坏的时间复杂度是O(log N) 。

设计红⿊树的⽬的,就是解决平衡树的维护起来⽐较⿇烦的问题,红⿊树,读取略逊于AVL,维护强于AVL,每次插⼊和删除的平均旋转次数应该是远⼩于平衡树。

⼩结⼀下:
能⽤平衡树的地⽅,就可以⽤红⿊树。

⽤红⿊树之后,读取略逊于AVL,维护强于AVL。

红⿊树和 b+树的⽤途有什么区别?
1. 红⿊树多⽤在内部排序,即全放在内存中的,STL的map和set的内部实现就是红⿊树。

2. B+树多⽤于外存上时,B+也被成为⼀个磁盘友好的数据结构。

为什么b+磁盘友好?
1. 磁盘读写代价更低
树的⾮叶⼦结点⾥⾯没有数据,这样索引⽐较⼩,可以放在⼀个blcok(或者尽可能少的blcok)⾥⾯。

避免了树形结构不断的向下查找,然后磁盘不停的寻道,读数据。

这样的设计,可以降低io的次数。

2. 查询效率更加稳定
⾮终结点并不是最终指向⽂件内容的结点,⽽只是叶⼦结点中关键字的索引。

所以任何关键字的查找必须⾛⼀条从根结点到叶⼦结点的路。

所有关键字查询的路径长度相同,导致每⼀个数据的查询效率相当。

3. 遍历所有的数据更⽅便
B+树只要遍历叶⼦节点就可以实现整棵树的遍历,⽽其他的树形结构要中序遍历才可以访问所有的数据。

题外话:为什么mysql索引使⽤b+树⽽不使⽤红⿊树?
b+树就是为⽂件存储⽽⽣的。

如果数据库⽂件存储在主存中我认为两种结构的查询速度差距不是很⼤,因为主存的查找速度⾮常快。

⽽数据库⽂件实际存储在磁盘中,定位⼀⾏信息需要查找该⾏⽂件所在柱⾯号,磁盘号,扇区号,页号这个阶段是很耗费时间的。

每⼀次的定位请求意味着要做⼀次IO操作,也意味着成倍的时间消耗。

因此减少IO查询的次数是提⾼查询性能的关键。

⽽IO的查询次数就是索引树的⾼度,⾼度越低查询的次数越少。

同样的结点次数红⿊树的⾼度最多为2log(n+1),⽽B+树的⾼度最多为(logt (n+1)/2)+1,随着t增⼤⾼度会更⼩,IO次数也会减少。

相关文档
最新文档