伸展树的基本操作与应用【信息技术】.docVIP

伸展树的基本操作与应用【信息技术】.doc

  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文档。上传文档
查看更多
伸展树的基本操作与应用 安徽省芜湖市第一中学 杨思雨 目录 【关键字】 2 【摘要】 2 【引言】 2 【伸展树的基本操作】 2 伸展操作Splay(x,S) 3 伸展树的基本操作 4 时间复杂度分析 5 【伸展树的应用】 7 【总结】 8 【参考书目】 9 【附录】 9 【】【】【】【】 图 1 情况二:节点x的父节点y不是根节点,y的父节点为z,且x与y同时是各自父节点的左孩子或者同时是各自父节点的右孩子。这时,我们进行一次Zig-Zig操作或者Zag-Zag操作。如图2所示 图 2 情况三:节点x的父节点y不是根节点,y的父节点为z,x与y中一个是其父节点的左孩子而另一个是其父节点的右孩子。这时,我们进行一次Zig-Zag操作或者Zag-Zig操作。如图3所示 图 3 如图4所示,执行Splay(1,S),我们将元素1调整到了伸展树S的根部。再执行Splay(2,S),如图5所示,我们从直观上可以看出在经过调整后,伸展树比原来“平衡”了许多。而伸展操作的过程并不复杂,只需要根据情况进行旋转就可以了,而三种旋转都是由基本得左旋和右旋组成的,实现较为简单。 图 4 Splay(1,S) 图 5 Splay(2,S) 伸展树的基本操作 利用Splay操作,我们可以在伸展树S上进行如下运算: (1)Find(x,S):判断元素x是否在伸展树S表示的有序集中。 首先,与在二叉查找树中的查找操作一样,在伸展树中查找元素x。如果x在树中,则再执行Splay(x,S)调整伸展树。 (2)Insert(x,S):将元素x插入伸展树S表示的有序集中。 首先,也与处理普通的二叉查找树一样,将x插入到伸展树S中的相应位置上,再执行Splay(x,S)。 (3)Delete(x,S):将元素x从伸展树S所表示的有序集中删除。 首先,用在二叉查找树中查找元素的方法找到x的位置。如果x没有孩子或只有一个孩子,那么直接将x删去,并通过Splay操作,将x节点的父节点调整到伸展树的根节点处。否则,则向下查找x的后继y,用y替代x的位置,最后执行Splay(y,S),将y调整为伸展树的根。 (4)Join(S1,S2):将两个伸展树S1与S2合并成为一个伸展树。其中S1的所有元素都小于S2的所有元素。 首先,我们找到伸展树S1中最大的一个元素x,再通过Splay(x,S1)将x调整到伸展树S1的根。然后再将S2作为x节点的右子树。这样,就得到了新的伸展树S。如图6所示 图 6 (5)Split(x,S):以x为界,将伸展树S分离为两棵伸展树S1和S2,其中S1中所有元素都小于x,S2中的所有元素都大于x。 首先执行Find(x,S),将元素x调整为伸展树的根节点,则x的左子树就是S1,而右子树为S2。如图7所示 图 7 除了上面介绍的五种基本操作,伸展树还支持求最大值、求最小值、求前趋、求后继等多种操作,这些基本操作也都是建立在伸展操作的基础上的。 时间复杂度分析 由以上这些操作的实现过程可以看出,它们的时间效率完全取决于Splay操作的时间复杂度。下面,我们就用会计方法来分析Splay操作的平摊复杂度。 首先,我们定义一些符号:S(x)表示以节点x为根的子树。|S|表示伸展树S的节点个数。令μ(S) = [ log|S| ],μ(x)=μ(S(x))。如图8所示 图 8 我们用1元钱表示单位代价(这里我们将对于某个点访问和旋转看作一个单位时间的代价)。定义伸展树不变量:在任意时刻,伸展树中的任意节点x都至少有μ(x)元的存款。 在Splay调整过程中,费用将会用在以下两个方面: (1)为使用的时间付费。也就是每一次单位时间的操作,我们要支付1元钱。 (2)当伸展树的形状调整时,我们需要加入一些钱或者重新分配原来树中每个节点的存款,以保持不变量继续成立。 下面我们给出关于Splay操作花费的定理: 定理:在每一次Splay(x,S)操作中,调整树的结构与保持伸展树不变量的总花费不超过3μ(S)+1。 证明:用μ(x)和μ’(x)分别表示在进行一次Zig、Zig-Zig或Zig-Zag操作前后节点x处的存款。 下面我们分三种情况分析旋转操作的花费: 情况一:如图9所示 图 9 我们进行Zig或者Zag操作时,为了保持伸展树不变量继续成立,我们需要花费: μ’(x) +μ’(y) -μ(x) -μ(y) = μ’(y) -μ(x) ≤ μ’(x) -μ(x) ≤ 3(μ’(x) -μ(x)) = 3(μ(S) -μ(x)) 此外我们花费另外1元钱用来支付访问、旋转的基本操作。因此,一

文档评论(0)

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

1亿VIP精品文档

相关文档