当前课程知识点:数据结构(下) > 第八章 高级搜索树(上) > (a1)伸展树:逐层伸展 > 08A1-3 自适应调整
我们不妨先来考察一个简单的实例
也就是典型的线性结构 列表
我们知道在列表结构中
所有的元素都按照他们之间的逻辑关系
可以排列成一个线性的序列
相邻的元素通过引用 确立前驱和后继关系
我们知道 在这样的一个结构中
对任何一个元素的访问效率
将主要取决于它在这个序列中所具有的秩
具体来说 秩越小 也就是越靠前的元素 访问的效率越高
秩越大 也就是越靠后的元素 访问的效率越低
如果对于各元素的访问是完全理想随机的
我们恐怕只得如此
而不能奢望有什么实质的改进
然而如我们刚才所说的
如果对这个集合中的元素的访问具有局部性
甚至有极强的局部性 我们就可以通过简明的策略
来实现对整个数据集合的更高效访问
比如一种行之有效的办法就是
一旦有某个元素刚刚接受访问
我们就立即将它移动到这个序列的最前端
这种技巧背后的策略 不难理解
因为根据局部性 我们接下来将要访问的元素
很可能就是我们刚刚访问的那个元素
而这个元素就在此前刚刚被移送到这个序列的最前端
而对于这样一个最前端的元素而言
我们的访问是唾手可得最为便捷的
从整个数据结构的生命周期而言 这样一个列表结构
即便最初是完全随机分布的
那么在经过了足够长时间的使用之后
在某一段时间内 被集中访问的那些元素
都会不约而同的 集中到这个列表的前端去
我们已经知道 这个区域的访问效率是相应更高的
因此我们因此就可以在一个足够长的时间跨度之内
获得比此前更高的访问效率
好了 现在我们可以回到我们的二叉查找树
为便于对比 我们不妨将BST的画法旋转90度
具体来说 也就是将树的顶部与树的底部
分别与列表的头部与尾部 对应起来
这种对应是有道理的
因为在BST中位于顶部的元素
相对于位于其他位置 尤其是底部的元素而言
访问效率要高得多
因此如果我们希望借助局部性
对BST的访问效率做进一步的优化
就不妨参照列表的这种技巧
将在某一段时间内 经常要访问到的元素 通过某种方式
尽可能的移送到更加接近树根的位置
也就是等效的说 要尽可能的降低他们的深度
那么这样一种构思是否真的可行呢?
如果可行的话 具体的方法又是如何的呢?
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试