收藏 分享(赏)

伸展树的基本操作与应用.ppt

上传人:lxhqcj 文档编号:7183748 上传时间:2019-05-09 格式:PPT 页数:36 大小:2.19MB
下载 相关 举报
伸展树的基本操作与应用.ppt_第1页
第1页 / 共36页
伸展树的基本操作与应用.ppt_第2页
第2页 / 共36页
伸展树的基本操作与应用.ppt_第3页
第3页 / 共36页
伸展树的基本操作与应用.ppt_第4页
第4页 / 共36页
伸展树的基本操作与应用.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、伸展树的 基本操作与应用,1,引言,二叉查找树(Binary Search Tree) 可以被用来表示有序集合、建立索引或优先队列等。最坏情况下,作用于二叉查找树上的基本操作的时间复杂度,可能达到O(n)。某些二叉查找树的变形,基本操作在最坏情况下性能依然很好,如红黑树、AVL树等。,2,伸展树,伸展树(Splay Tree)是二叉查找树的改进。对伸展树的操作的平摊复杂度是O(log2n)。伸展树的空间要求、编程难度非常低。,3,伸展树,伸展树与二叉查找树一样,也具有有序性。即伸展树中的每一个节点x都满足:该节点左子树中的每一个元素都小于x,而其右子树中的每一个元素都大于x。伸展树可以自我调整

2、,这就要依靠,伸展操作Splay(x,S),4,伸展操作Splay(x,S),伸展操作Splay(x,S)是在保持伸展树有序性的前提下,通过一系列旋转操作将伸展树S中的元素x调整至树的根部的操作。在旋转的过程中,要分三种情况分别处理:1)Zig 或 Zag2)Zig-Zig 或 Zag-Zag3)Zig-Zag 或 Zag-Zig,5,伸展操作Splay(x,S) 情况1,Zig或Zag操作:节点x的父节点y是根节点。,6,伸展操作Splay(x,S) 情况2,Zig-Zig或Zag-Zag操作:节点x的父节点y不是根节点,且x与y同时是各自父节点的左孩子或者同时是各自父节点的右孩子。,7,伸

3、展操作Splay(x,S) 情况3,Zig-Zag或Zag-Zig操作:节点x的父节点y不是根节点,x与y中一个是其父节点的左孩子而另一个是其父节点的右孩子。,8,伸展操作举例,Splay(1,S),9,伸展树的基本操作,求前趋 求后继 合并 分离,查找 插入 删除 求最大值 求最小值,伸展操作是基础!,10,时间复杂度分析,S(x)表示以x为根的子树 |S|表示树S的节点个数 令(S) = log2|S| ( 表示取下整) (x)=(S(x),11,时间复杂度分析,用1元钱表示一个单位时间代价。伸展树不变量:在任意时刻,伸展树中的任意节点x都至少有(x)元的存款。,对某个节点的访问和旋转,会

4、计方法,12,时间复杂度分析,在Splay调整过程中,费用将会用在以下两个方面:(1)为使用的时间付费。也就是每一次单位时间的操作,要支付1元钱。(2)当伸展树的形状调整时,需要加入一些钱或者重新分配原来树中每个节点的存款,以保持不变量继续成立。,13,时间复杂度分析,用(x)和(x)分别表示在进行一次旋转操作前后节点x处的存款。分三种情况分析旋转操作的花费: (1)Zig 或 Zag(2)Zig-Zig 或 Zag-Zag(3)Zig-Zag 或 Zag-Zig,14,时间复杂度分析 情况1,Zig或Zag为了保持伸展树不变量继续成立,需要花费:,此外我们花费另外1元钱用来支付访问、旋转的基

5、本操作。 所以,一次Zig或Zag操作的花费至多为3(S)-(x)+1,15,时间复杂度分析 情况2,Zig-Zig或Zag-Zag为了保持不变量,需要花费:,与情况1一样,也需要花费另外的1元钱来支付单位时间的操作。,16,时间复杂度分析 情况2,Zig-Zig或Zag-Zag当(x) (x) 时,显然2 (x) -(x) +1 3 (x) -(x)也就是进行Zig-Zig操作的花费不超过3 (x) -(x) 当(x) =(x) 时,可以证明:(x) +(y) + (z) (x) +(y) +(z)也就是说我们不需要任何花费保持伸展树不变量,并且可以得到退回来的钱,并用其中的1元支付单位操作

6、的费用。一次Zig-Zig或Zag-Zag的花费至多为3 (x) -(x),17,时间复杂度分析 情况3,Zig-Zag或Zag-Zig与情况2相似,可以证明一次Zig-Zag或Zag-Zig操作的花费至多为3 (x) -(x),18,时间复杂度分析,Zig Zig-Zig Zig-Zag,3(S)-(x)+1 3(x)-(x) 3(x)-(x),Splay(x,S),3(S)-(x)+1,O(log2n),基本操作,19,伸展树的应用,营业额统计Turnover (HNTSC-02),分析公司的营业情况是一项相当复杂的工作。经济管理学上定义了一种最小波动值来衡量营业情况: 每天的最小波动值=

7、 min | 该天以前某一天的营业额-该天的营业额 | 第一天的最小波动值为第一天的营业额。现在给出公司成立以来每天的营业额,编写一个程序计算公司成立以来每天的最小波动值的总和。 数据范围:天数n32767,每天的营业额ai1,000,000。最后结果T231。,例题描述,20,伸展树的应用,本题的关键是要每次读入一个数,并且在前面输入的数中找到一个与该数相差最小的一个。顺序查找前面输入的数用线段树记录输入的数红黑树或平衡二叉树,初步分析,时间复杂度O(n2),不能在时限内出解,空间要求很大,需要一个大数组,编程太复杂,调试不方便,21,伸展树的应用,每次读入一个数p,将p插入伸展树S,同时p

8、也被调整到伸展树的根节点。 求出p点左子树中的最大值和右子树中的最小值,这两个数就分别是有序集中p的前趋和后继。 进而求得最小差值,加入最后结果T。,算法描述,这题中,涉及到对于有序集的三种操作:插入、求前趋、求后继,22,伸展树的应用,使用伸展树算法解决本题,时间复杂度为O(nlog2n),空间要求不大,编程和调试也都非常容易。下面的表格对几种算法做出了比较:,解题小结,23,总结,伸展树有以下三个优点: 1) 时间复杂度低,伸展树的各种基本操作的平摊复杂度都是O(log2n)的。 2) 空间要求不高,伸展树不需要记录任何信息以保持树的平衡。 3) 算法简单。编程容易,调试方便。,24,总结

9、,在信息学竞赛中,我们不能一味的追求算法有很高的时间效率,而应该合理的选择算法,找到时间复杂度、空间复杂度、编程复杂度三者之间的平衡点,反复琢磨,多做比较,灵活应用,25,谢谢,26,希望能和大家多交流,E-mail:DeadFishYSY,27,一些解释,伸展操作 例1 伸展操作 例2 合并操作 分离操作 情况2时间效率 平摊复杂度 Splay Tree vs AVL Tree,28,伸展操作 例1,Splay(1,S),29,伸展操作 例2,Splay(2,S),30,合并操作,Join(S1,S2):将两个伸展树S1与S2合并。其中S1的所有元素都小于S2的所有元素。 首先,找到伸展树S

10、1中的最大元素x,再通过Splay(x,S1)将x调整为S1的根。然后将S2作为x节点的右子树。这样,就得到了新伸展树S。,31,分离操作,Split(x,S):以x为界,将伸展树S分离为两棵伸展树S1和S2,其中S1中所有元素都小于x,S2中的所有元素都大于x。 首先执行Find(x,S),将元素x调整为伸展树的根节点,则x的左子树就是S1,而右子树为S2。,32,情况2的时间效率分析,花费不超过2 (x) -(x) +1 当(x) (x) 时,显然不超过3 (x) -(x) 当(x) =(x) 时,可证明(x) +(y) + (z) (x) +(y) +(z),图中,(x) =(x) =(

11、z)。 显然(x) =(y) =(z)。并且可以得出(x) =(z) =(z)。 令a = 1 + |A| + |B|,b = 1 + |C| + |D| 。那么 log a = log b = log (a+b+1),不妨设ba,则有 log (a+b+1) log (2a)= 1+log a log a,33,关于时间复杂度,伸展树操作中,被访问越多的节点越接近根节点。一个结论:对于伸展树的一系列n个操作,其中关于节点x的有m个,那么这m条操作的平摊复杂度为O(log2(n/m)。,34,伸展树 Vs 平衡二叉树,不需要记录其他信息 编程复杂度低 合并、分离操作时间复杂度O(log2n),要记录平衡因子 编程较复杂 不支持直接的合并操作和分离操作,35,Thank you,36,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报