数据结构专题——1.从BST到BBST

BST——树家族之祖。

BST以(key,value)pair为节点,以树结构来组织数据。

特点1.每个节点的左子树节点都比他小,而右子树节点都比他大,即具有左小右大的顺序性;(此处采用无重复key的BST,有重复时加上“可以=”的条件即可)

特点2.BST的中序遍历即为一个sorted的元素序列。这也是BST的充要条件。

查找是BST操作的基础,插入和删除都要先执行查找操作,它们的复杂度也同查找操作。

因为有顺序性,BST的查找类似于二分查找,是O(logn)的,就树而言即为O(h)。注:h为树的高度。

极端坏的情况下,树高h可能就为n,那么O(logn)变成O(n)是不能接受的,就需要限制h而又保持BST形式的新形式,于是BBST家族诞生了。

BBST家族:

1.AVL树:BST与“平衡因子”之子,以平衡因子来限制树高h:条件是-1<=左子树高度-右子树高度<=1,即平衡因子只能取{-1,0,1}。若因动态操作平衡因此不是这三个数,就叫做“失衡”,则采用zig、zag旋转使其“复衡”,但这种亦步亦趋的方式又有点慢,所以更快的复衡办法是“3+4重构”。

        在代码实现时注意:insert(e)之后可能会有祖先失衡,但经过一次复衡操作即可解决,此时可break;退出循环查找,即若找到一个就不需再查找其余祖先;但remove(e)操作带来的失衡可能会向上传递,具体会不会传递取决于该祖先节点的另一侧子树高度是否长于被remove的一侧1以上(短没事),于是所有的祖先都可能会失衡,就需要遍历所有祖先,不能中途结束。这种失衡传播特性导致在实测时效率下降,不能令人满意。(平衡因子的定义是失衡会传播的根子,即remove造成的高度改变可能引起平衡因子超界,所以是没办法根治的,于是remove算法的复杂度会达到O(logn),主要来自于拓扑结构的频繁调整,我们希望这种调整能达到O(1),所以继续开发新结构。)

2.伸展树:BST与“局部性”之子。伸展树在查找时会顺便将该节点(查找成功时)或失败前的一个节点(查找失败时)直接推送至树根节点,并且这一过程采用了双层伸展的方法,在推送节点的同时优化了树高(接近折半),大幅提升了坏情况下的查找速度(平均复杂度O(logn),而单层伸展平均复杂度为O(n))。

        代码实现注意:search接口也得重写,因为有推送至树根的操作改变了树结构,和BST的查找已经不同了。

3.B树:BST与“I/O”之子,逻辑上是BST,而形式上已经不是“二叉”而是“多叉”了,又名“平衡多路搜索树”或“m路搜索树”。每个节点是超级节点,拥有[m/2取上整,m]个分支和m-1个关键码,在从外存读取数据时采用这种数据结构,为的是减少I/O次数,因为通常外存的读取时间是内存的10^5--10^6倍,所以实践中一般一个超级节点中有256个关键码即1个Page,一次性从硬盘读到内存中。如读取1G数据,可从30次I/O降低至4次。

B树特点:1.更宽更矮的外观

                 2.底层节点深度一致,是一种理想平衡的搜索树。

                 3.超级节点可以看成是由单元素节点合并而来——每个单元素节点有两个指针,一个粘合相邻元素而另一个做分支,所以三个关键码节点有四个分支、四个关键码节点具有五个分支以此类推。

m阶B树:分支数为[m/2取上整,m],如m=5又称(3,5)树,m=8又称(4,8)树。在实现时最重要的就时当分支数超出区间范围时如何调整回来。

实现注意:

1.BTNode——B树的节点由一组关键码(m-1个)和一组分支(m个)组成。用两个向量保存。

2.查找由“节点内的顺序查找”和向下I/O交替组成。节点内用顺序查找比用二分查找在实践中更快。

4.B+树(预留)

5.红黑树:BST与“历史版本”之子,可以查询保存的历史状态记录。经“提升变换”的红黑树与(2,4)的B树是等价的,后者又叫前者的影子B树。

红黑树有3条规则:1.根为黑;

                                2.红黑律。(即红父亲只能有黑孩子,违反它则为“双红缺陷”。)

                                3.黑高度相等。(即所有叶节点到根节点的path中黑节点数目相等,违反它则称“双黑缺陷”。双黑缺陷只在remove()时出现,它是指被删除节点和其替代者——其子同为黑色时,删除操作必然会导致黑高度-1的情况。)

红黑树在拓扑关系的调整方面优于AVL树,全部情况都只要O(1)(仅需常数次的旋转或3+4重组),虽然会代之以代价较小的染色操作 ——O(logn)的。

以下来看实现要点:

1.双红修正的insert()算法:1.插入必须是红节点;

                                        2观察其叔父颜色: 黑叔叔:用3+4重构,再重染色“3”为“红黑红”即可;

                                                                        红叔叔:重染色:p、u转黑而g转红即可。黑叔叔重构1次,而红叔叔重构0次(虽然染色是O(logn)的。),总的拓扑结构变化为O(1)。

2.双黑修正的remove()算法:此时删除节点必然降低黑高度。被删除节点为x,分为以下三种情况:

BB1(红侄子,重构它,染色解决黑p黑):父亲p不定而x有“红侄子”,其他家庭成员全黑时(也许还有另一个颜色不定的红侄子,但它不会影响任何事),则进行3+4重构并重染色a、b、c的颜色为黑、p(继承父亲p颜色)、黑即可。

BB2(父亲不怕全家黑,孩子变红自己黑):父亲p不定而p以下全黑时,重染色s红、p黑即可。(在实现时是分红父亲和黑父亲两种的,黑父亲需要循环判断,此处按同样的染色方法合并看待。)

BB3(红兄弟麻烦大,父亲低头红扒下,完了(liao)还得看一下):s兄弟为红,其他家庭成员全黑时,先旋转父亲p(zig\zag都行,让兄弟上位),重染色s为黑,p为红。此时会化为BB1或BB2情况,再解即可。

总之双黑缺陷解法只有三种——重构黑p黑、红黑、旋转黑红。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值