B树与B+树以及红黑树

1、B树与B+树

(1)B树与B+树的区别

  1)B+树中只有叶子节点会带有指向记录的指针;而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。

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

(2)B树与B+树的优缺点

  1)B树优点:由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。

   a、因为磁盘查找存取的次数往往由树的高度所决定,磁盘IO是非常耗时的操作,计算机操作系统对此做了优化:预读;每一次IO时,不仅仅把当前磁盘地址的数据加载到内存,同时也把相邻数据也加载到内存缓冲区中。因为局部预读原理说明:当访问一个地址数据的时候,与其相邻的数据很快也会被访问到。每次磁盘IO读取的数据我们称之为一页(page)。一页的大小与操作系统有关,一般为4k或者8k。这也就意味着读取一页内数据的时候,实际上发生了一次磁盘IO。

  2)B+树优点:

   a、非叶子节点不会带上指向记录的指针,这样,一个块中可以容纳更多的索引项,一是可以降低树的高度。二是一个内部节点可以定位更多的叶子节点。

   b、B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

   c、在B+树上增加了顺序访问指针,也就是每个叶子节点增加一个指向相邻叶子节点的指针;另外一般来说,索引很大的话往往会以索引文件的形式存储的磁盘上,索引查找时产生磁盘I/O消耗相对于内存存取更加耗时,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的时间复杂度。树高度越小,I/O次数越少。因为B+树内节点不存储data,这样一个节点就可以存储更多的key。

2、红黑树与B+树的区别:

(1)红黑树用在内部排序,即全放在内存中的,map和set的内部实现就是红黑树;B+树多用于外存上时,B+被称为一个磁盘友好的数据结构。

(2)红黑树的思想

  1)设计红黑树目的:主要针对于平衡二叉树的维护问题,红黑树读取略逊于AVL,维护强于AVL,每次插入和删除的平均旋转次数应该是远小于平衡树。所以自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态。

  2)红黑树不是一个完美平衡二叉查找树,根结点的左子树与右子树的层数差可以大于1,但左子树和右子树的黑结点的层数是相等的,红黑树叫黑色完美平衡树。

              

  3)红黑树的特点:

   a、每个节点要么是黑色,要么是红色(节点非红即黑)

   b、根节点是黑色.

   c、每一个叶子节点是黑色

   d、如果一个节点是红色,则它的子节点必须是黑色的.(也就是说父子节点不能同时为红色)

   e、从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

  4)红黑树能自平衡的操作:局部的左旋、右旋和变色。红黑树总是通过旋转和变色达到自平衡。

   a、左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变

   b、右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。

   c、变色:结点的颜色由红变黑或由黑变红。

  5)红黑树的查找:查找不会破坏树的平衡,所以查找跟二叉排序树的查找无异。

   a、从根结点开始查找,把根结点设置为当前结点;若当前结点为空,返回null;

   b、若当前结点不为空,用当前结点的key跟查找key作比较;

   c、若当前结点key等于查找key,那么该key就是查找目标,返回当前结点;

   d、若当前结点key大于查找key,把当前结点的左子结点设置为当前结点,重复步骤2;

   e、若当前结点key小于查找key,把当前结点的右子结点设置为当前结点,重复步骤2;

  6)红黑树的插入:插入操作包括两部分工作:一查找插入的位置;二插入后自平衡。查找插入的父结点很简单,跟查找操作区别不大;

   a、插入结点是红色时,把插入结点放到正确的位置即可

   b、如果插入结点是黑色,那么插入位置所在的子树黑色结点总是多1,必须做自平衡。

      

 

posted on 2020-04-14 20:51  hdc520  阅读(3860)  评论(0编辑  收藏  举报

导航