数据结构与算法之高级搜索树(连载中~)

继续邓俊辉老师的数据结构和算法课程,这篇博客记录的是高级搜索树的相关内容,视频资源如下:https://www.bilibili.com/video/av25421628

如果是没有接触过二叉树或者二叉搜索树的话,可以先看看邓俊辉老师第五章和第七章的内容,第七章的内容我做了一些笔记,相关博客链接:
https://blog.csdn.net/hongpei9627/article/details/81840397

接下来进入正题,这章的内容很多,我计划先将整章的内容写在一起再考虑分P~

第八章 高级搜索树

伸展树(splaytree),局部性:
这里写图片描述

自适应调整,将某些经常被访问到的元素移动到接近树根的位置,相当于降低它们的深度:
这里写图片描述

逐层伸展,使用zag和zig旋转:
这里写图片描述

一步一步往上爬的最坏情况:
这里写图片描述

伸展树的双层伸展
这里写图片描述

子孙异侧的情况,这种情况下和AVL树双旋还有伸展树逐层伸展没有区别:
这里写图片描述

到了子孙同侧的情况下,就有了改善,即双层伸展:
这里写图片描述

上述情况的点睛之笔:
这里写图片描述
根据双层伸展后的效果:
这里写图片描述
可以看出,树高减少了一半~

折叠效果:
这里写图片描述
这里写图片描述

伸展树相关算法的实现:
(有待补充~)

B树
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

B树的多路平衡:
这里写图片描述

为何要引入B树呢:
这里写图片描述

深度统一,在下图中,external nodes为叶节点中数值为空的并不存在的孩子节点
这里写图片描述
这里写图片描述

紧凑表示:
这里写图片描述

B树的代码定义和实现(BTNode):
这里写图片描述
使用了向量的方式表示~

B树的代码接口:
这里写图片描述

B树的查找函数过程与实现,若查找失败必终止于外部节点
这里写图片描述
这里写图片描述

B树最大高度h,要推算最大高度,即每个超级节点里关键码的数量要足够少,但是不能小于m/2,其中m为B树的阶次:
这里写图片描述

B树的最小高度:
这里写图片描述
从B树的最大高度和最小高度推算可以分析出,B树的高度变化幅度有限~

B树的插入算法实现:
这里写图片描述

当插入后出现上溢(overflow),需要进行分裂处理:
这里写图片描述
分裂后若仍然上溢,便进行再分裂:
这里写图片描述

第46集为B树插入后分裂,再分裂,分裂到根的实例演示,可以看看~

B树删除:
这里写图片描述
删除节点后会出现下溢情况~

若出现下溢情况,可以考虑使用旋转的方式,如下图右子树出现下溢情况,而其左兄弟中的关键码数量满足不小于m/2取上限,则可以补充右子树中得关键码数量,但实现这方式条件比较苛刻~可能其左兄弟不存在或者根本无法借出关键码~
这里写图片描述

采取合并的方式~
这里写图片描述

第50集是B树删除操作的实例演示,有旋转与合并操作~

B树设计成比较矮且宽的结构,是因为让外存操作的代价和内存操作的代价大致相等~在水平方向是内存操作,而在垂直方向做磁盘操作,每下降一层都要付出一次I/O代价
这里写图片描述

红黑树
终于到了揭开红黑树的面纱了~
这里写图片描述

红黑树特性:持久性
这里写图片描述

为了让任何一次的动态操作引发的结构变化量不至于超过O(1),引入了红黑树~

红黑树的结构,红黑树是一种BBST:
这里写图片描述

提升变换,变换前:
这里写图片描述
变换后,红色节点提升到和其父亲节点同样的高度:
这里写图片描述

红黑树为(2,4)B树:
这里写图片描述

红黑树接口定义:
这里写图片描述

红黑树的插入算法之双红缺陷
这里写图片描述
这里写图片描述

双红缺陷根据插入节点的uncle节点(即其祖父节点的另一个孩子节点)的颜色,分两种情况分析,下图为若uncle节点为黑,考虑zagzag和zigzag情况:
这里写图片描述
这里写图片描述
以上的调整是一蹴而就的,不用进行进一步的调整~

若uncle节点为红,则:
这里写图片描述
出现了上溢的情况,因此先以修复上溢问题的方法做处理~

在理解下图的过程中,老师在此前也讲过将红黑树看作B树去对待,转化完成后再看成红黑树,在理解上更加简明~
这里写图片描述

双红修正复杂度的分析:
这里写图片描述

红黑树的删除算法,关注重构操作的次数(reconstruction),其不会超过常数:
这里写图片描述

双黑缺陷:
这里写图片描述
分四种情况处理~情况一:
这里写图片描述
为何会有这种操作呢,接下来反观这情况:
这里写图片描述

情况二,三:
这里写图片描述
这里写图片描述

情况四:
这里写图片描述

红黑树删除总结:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值