网站大量收购独家精品文档,联系QQ:2885784924

国家集训队2005-论文集 黄源河.docVIP

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
国家集训队2005-论文集 黄源河

左偏树的特点及其应用 广东省中山市第一中学 黄源河 【摘要】 本文较详细地介绍了左偏树的特点以及它的各种操作。 第一部分提出可并堆的概念,指出二叉堆的不足,并引出左偏树。第二部分主要介绍了左偏树的定义和性质。第三部分详细地介绍了左偏树的各种操作,并给出时间复杂度分析。第四部分通过一道例题,说明左偏树在当今信息学竞赛中的应用。第五部分对各种可并堆作了一番比较。最后总结出左偏树的特点以及应用前景。 【关键字】 左偏树 可并堆 优先队列 【目录】 一、引言 2 二、左偏树的定义和性质 2 2.1 优先队列,可并堆 2 2.1.1 优先队列的定义 2 2.1.2 可并堆的定义 2 2.2 左偏树的定义 3 2.3 左偏树的性质 4 三、左偏树的操作 5 3.1 左偏树的合并 5 3.2 插入新节点 7 3.3 删除最小节点 8 3.4 左偏树的构建 8 3.5 删除任意已知节点 9 3.6 小结 12 四、左偏树的应用 13 4.1 例——数字序列(Baltic 2004) 13 五、左偏树与各种可并堆的比较 15 5.1 左偏树的变种——斜堆 15 5.2 左偏树与二叉堆的比较 16 5.3 左偏树与其他可并堆的比较 16 六、总结 18 2.1 优先队列,可并堆 2.1.1 优先队列的定义 优先队列(Priority Queue)是一种抽象数据类型(ADT),它是一种容器,里面有一些元素,这些元素也称为队列中的节点(node)。优先队列的节点至少要包含一种性质:有序性,也就是说任意两个节点可以比较大小。为了具体起见我们假设这些节点中都包含一个键值(key),节点的大小通过比较它们的键值而定。优先队列有三个基本的操作:插入节点(Insert),取得最小节点(Minimum) 和删除最小节点(Delete-Min)。 2.1.2 可并堆的定义 可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),还支持一个额外的操作——合并操作: H ← Merge(H1,H2) Merge( ) 构造并返回一个包含H1和H2所有元素的新堆H。 前面已经说过,如果我们不需要合并操作,则二叉堆是理想的选择。可惜合并二叉堆的时间复杂度为O(n),用它来实现可并堆,则合并操作必然成为算法的瓶颈。左偏树(Leftist Tree)、二项堆(Binomial Heap) 和Fibonacci堆(Fibonacci Heap) 都是十分优秀的可并堆。本文讨论的是左偏树,在后面我们将看到各种可并堆的比较。 2.2 左偏树的定义 左偏树(eftist Tree)是一种可并堆的实现。左偏树是一棵二叉树,它的节点除了和二叉树的节点一样具有左右子树指针( leftight )外,还有两个属性:键值和距离(dist)。键值上面已经说过,是用于比较节点的大小。距离则是如下定义的:节点i称为外节点external node),当且仅当节点;的距离是节点到外节点特别的,如果节点本身是外节点,则它的距离为0;而空节点的距离规定为-1。 左偏树满足下面两条基本性质: [性质1] 节点的键值小于或等于它的左右子节点的键值。 即key(i)≤key(parent(i)) 这条性质又叫堆性质。符合该性质的树是堆有序的(Heap-Ordered)。有了性质1,我们可以知道左偏树的根节点是整棵树的最小节点,于是我们可以在O(1) 的时间内完成取最小节点操作。 [性质2] 节点的左子节点的距离不小于右子节点的距离。 即dist(left(i))≥dist(right(i)) 这条性质称为左偏性质。性质2是为了使我们可以以更小的代价在优先队列的其它两个基本操作(插入节点、删除最小节点)进行后维持堆性质。在后面我们就会看到它的作用。 这两条性质是对每一个节点而言的,因此可以简单地从中得出,左偏树的左右子树都是左偏树。 由这两条性质,我们可以得出左偏树的定义:左偏树是具有左偏性质的堆有序二叉树。 下图是一棵左偏树: 2.3 左偏树的性质 在前面一节中,本文已经介绍了左偏树的两个基本性质,下面本文将介绍左偏树的另外两个性质。 我们知道,一个节点必须经由它的子节点才能到达外节点。由于性质2,一个节点的距离实际上就是这个节点一直沿它的右边到达一个外节点所经过的边数,也就是说,我们有 [性质3] 节点的距离等于它的右子节点的距离加1即 dist( i ) = dist( right( i ) ) + 1 外节点的距离为0,由于性质2,它的右子节点必为空节点。为了满足性质3,故前面规定空节点的距离为-1。 证明:由性质2可知,当且仅当对于一棵左偏树中的每个节点i,都有 dist(left(i)) = di

文档评论(0)

317960162 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档