当前课程知识点:数据结构(下) > 第八章 高级搜索树(上) > (a2)伸展树:双层伸展 > 08A2-4 点睛之笔
为了切实的感受和领会这只眼睛的神奇之处
我们不妨来看这样一个实例
依然是汉字中的一撇
只不过为了更好的体现效果 我们这里取了更长的一撇
接下来我们不妨恶意的来访问其中最深的那个节点
因为这样的话 所消耗的时间 将会最多
那么按照Tarjan的建议
此时我们不仅要关心节点1的父亲 也就是2
同时还要关注他的祖父 也就是3
我们的第一次旋转 应该在祖父而不是父亲的位置上进行
因此针对这种情况 我们首先对节点3做一次顺时针的zig
接下来才轮到对原先的父亲也就是2 来做一次zig
从而形成这样的一种局面
v还是v 只不过上升了两层
但是他拥有了新的一个父亲和新的一个祖父
继续采用Tarjan建议的方法 具体来说
要对新的这个祖父也就是5 做一次zig旋转
然后再对新的这个父亲4 做一次zig旋转
那么接下来继续采用Tarjan的建议
将会通过怎样的一系列双层调整
最终使目标节点1 伸展到树根呢
连续的看一下这个过程
一次双层调整
又一次双层调整
以及再一次
再一次
以及最终那一次
来看一下最终这棵树的全貌
看到效果了吗?
不出意外 节点1被伸展到了树根
然而这只是最基本的一个任务
我们注意到 作为这样一个调整过程的副产品
整棵树的树高 已经有了本质的变化
你应该还记得 我们此前针对逐层伸展
所举的那个最坏的例子
没错 那个例子之所以很坏
是因为每次尽管它能够将目标节点调整到树根
但是整棵树的高度却会不得不按照算数级数
亦步亦趋的小步的变化
于是呢 使得恶意者每次都可以去
试图访问它最深的那个节点
从而导致累计的平方量级的时间复杂度
以及分摊意义上的线性时间
而现在呢 我们至少可以看出
那种恶意的方法将会失效
因为我们这棵树的形态 得到了有效的优化
具体来说 树的高度大致缩减为原先的一半
接下来如果我们继续恶意的试图去访问
它的新的这个最低点
我们就会发现 他会继续的优化调整
来看一下 调整的过程 以及结果
可以看到 树的高度在此前的基础上又进而缩减了一半
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试