伸展树的原理及应用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
伸展树的原理及应用 常州市第一中学 林厚从 【摘要】 本文介绍了伸展树的基本概念、基本操作及其应用,全文分为四个部分: 第一部分引言,主要说明了二叉查找树在信息学竞赛中的重要地位,并且指出二叉查找树在某些情况下时间复杂度较高的缺点,以及平衡树编程复杂度又过高的困惑,从而引入时间复杂度和编程复杂度都更为优秀的伸展树。 第二部分介绍了伸展树的基本操作,并给出了伸展树操作时间复杂度的分析和证明,指出伸展树的各种基本操作的平摊时间复杂度均为O(log2n),说明伸展树是一种较平衡的二叉查找树。 第三部分通过一个例子介绍了伸展树在解题中的应用,并将它与其它树状数据结构进行了对比。 第四部分指出了伸展树的优点,总结全文,给出本文的一些附录。 【第一部分 引言】 二叉查找树(Binary Search Tree)能够支持多种动态集合操作。因此,在信息学竞赛中,二叉查找树有着非常重要的作用,它可以被用来表示有序集合、建立索引或优先队列等。 作用于二叉查找树上的基本操作的时间复杂度是与树的高度成正比的。对一棵n个结点的二叉树,这些操作在最优情况下运行时间为O(log2n)。但如果二叉树退化成n个结点的线性链,则这些操作在最坏情况下的运行时间为O(n)。有些二叉查找树的变形,其基本操作在最坏情况下性能依然很好,如平衡树(AVL)等。但是需要额外的空间来存储平衡信息,且实现起来比较复杂。同时,如果访问模式不均匀,平衡树的效率就会受到影响。而伸展树却可以克服这些问题。 伸展树(Splay Tree),是由Daniel Sleator和Robert Tarjan创造,也是对二叉查找树的一种改进。虽然它并不能保证树一直是“平衡”的,但对于它的一系列操作,可以证明其每一步操作的“平摊时间”复杂度都是O(log2n),平摊时间是指在一系列最坏情况的操作序列中单次操作的平均时间。所以从某种意义上说,伸展树也是一种平衡的二叉查找树。而在各种树状数据结构中,伸展树的空间要求(不需要记录用于平衡的冗余信息)和编程复杂度也都是很优秀的。 获得较好平摊效率的一种方法就是使用“自调整”的数据结构。与平衡结构或有明确限制的数据结构相比,自调整的数据结构有以下几个优点: 1、从平摊角度来说,它们忽略常量因子,因此绝对不会差于有明确限制的数据结构。而且由于它们可以根据具体使用情况进行调整,所以在使用模式不均匀的情况下更加有效; 2、由于无需存储平衡信息或者其它限制信息,所以所需的存储空间更小; 3、它们的查找和更新算法概念和操作都很简单,易于实现。 当然,自调整结构也有其潜在的缺点: 1、它们需要更多的局部调整,尤其是在查找期间。而那些有明确限制的数据结构仅需要在更新期间进行调整,查找期间则不用; 2、一系列查找操作中的某一个可能会耗时较长,这在实时应用程序中可能是一个不足之处。 【第二部分 伸展树的基本操作】 伸展树是对二叉查找树的一种改进。与二叉查找树一样,伸展树也具有有序性,即伸展树中的每一个结点x都满足:该结点左子树中的每一个元素都小于x,而其右子树中的每一个元素都大于x。但是与普通二叉查找树不同的是,伸展树可以“自我调整”,这就要依靠伸展树的核心操作——伸展操作Splay(x,S)。 一、伸展操作Splay(x,S) 伸展操作Splay(x,S)是在保持伸展树有序性的前提下,通过一系列旋转,将伸展树S中的元素x调整至树的根部。在调整的过程中,要分以下三种情况分别处理: 情况一:结点x的父结点y是根结点。这时,如果x是y的左孩子,则我们进行一次Zig(右旋)操作;如果x是y的右孩子,则我们进行一次Zag(左旋)操作。经过旋转,使x成为二叉查找树S的根结点,调整结束。如图1所示: 图 SEQ 图 \* ARABIC 1、ZIG或ZAG 图 SEQ 图 \* ARABIC 2、ZIG-ZIG 情况二:结点x的父结点y不是根结点。则我们设y的父结点为z,且x与y同时是各自父结点的左孩子、或者同时是各自父结点的右孩子。这时,我们进行一次Zig-Zig操作、或者Zag-Zag操作。如图2所示: 情况三:结点x的父结点y不是根结点。则我们设y的父结点为z,且x与y中一个是其父结点的左孩子、而另一个是其父结点的右孩子。这时,我们进行一次Zig-Zag操作、或者Zag-Zig操作。如图3所示: 图 SEQ 图 \* ARABIC 3、ZIG-ZAG 下面举一个例子来体会上面的伸展操作。如图4所示,最左边的一个单链先执行Splay(1,S),我们将元素1调整到了伸展树S的根部。如图5所示,再执行Splay(2,S),将元素2调整到了伸展树S的根部。从直观上可以看出在经过调整后,伸展树比原来“平衡”了许多。而伸展操作的过程并不复杂,只需

文档评论(0)

寒傲似冰 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8071104010000026

1亿VIP精品文档

相关文档