算法合集之《左偏树的特点和其应用》.pptVIP

算法合集之《左偏树的特点和其应用》.ppt

  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文档。上传文档
查看更多
Winter Camp 2004 演讲稿 左偏树的特点及其应用 广东省中山市第一中学 黄源河 左偏树的定义 左偏树(Leftist Tree)是一种可并堆(Mergeable Heap) ,它除了支持优先队列的三个基本操作(插入,删除,取最小节点),还支持一个很特殊的操作——合并操作。 左偏树是一棵堆有序(Heap Ordered)二叉树。 左偏树满足左偏性质(Leftist Property)。 左偏树的定义 —— 左偏性质 定义一棵左偏树中的外节点(External Node) 为左子树或右子树为空的节点。 定义节点 i 的距离(dist(i)) 为节点 i 到它的后代中,最近的外节点所经过的边数。 任意节点的左子节点的距离不小于右子节点的距离(左偏性质)。 由左偏性质可知,一个节点的距离等于以该节点为根的子树最右路径的长度。 左偏树的性质 定理:若一棵左偏树有N个节点,则该左偏树的距离不超过 ?log(N+1)? -1。 左偏树的操作 左偏树支持下面这些操作: MakeNull —— 初始化一棵空的左偏树 Merge —— 合并两棵左偏树 Insert —— 插入一个新节点 Min —— 取得最小节点 DeleteMin —— 删除最小节点 Delete —— 删除任意已知节点 Decrease —— 减小一个节点的键值 左偏树的操作 —— 合并 合并操作是递归进行的 左偏树的操作 —— 合并 合并操作是递归进行的 左偏树的操作 —— 合并 合并操作是递归进行的 左偏树的操作 —— 合并 合并操作的代码如下: Function Merge(A, B) If A = NULL Then return B If B = NULL Then return A If key(B) key(A) Then swap(A, B) right(A) ← Merge(right(A), B) If dist(right(A)) dist(left(A)) Then swap(left(A), right(A)) If right(A) = NULL Then dist(A) ← 0 Else dist(A) ← dist(right(A)) + 1 return A End Function 左偏树的操作 —— 合并 下面是一个合并的例子: 左偏树的操作 —— 合并 下面是一个合并的例子: 左偏树的操作 —— 合并 下面是一个合并的例子: 左偏树的操作 —— 合并 下面是一个合并的例子: 左偏树的操作 —— 合并 下面是一个合并的例子: 左偏树的操作 —— 合并 下面是一个合并的例子: 左偏树的操作 —— 合并 下面是一个合并的例子: 左偏树的操作 —— 合并 下面是一个合并的例子: 左偏树的操作 —— 合并 合并操作都是一直沿着两棵左偏树的最右路径进行的。 一棵N个节点的左偏树,最右路径上最多有 ?log(N+1)? 个节点。 因此,合并操作的时间复杂度为: O(log N1 + log N2) = O(log N) 左偏树的操作 —— 插入 插入一个新节点 把待插入节点作为一棵单节点左偏树 合并两棵左偏树 时间复杂度:O(log N) 左偏树的操作 —— 删除 删除最小节点 删除根节点 合并左右子树 时间复杂度:O(log N) 例题:数字序列 给定一个整数序列 a1 , a2 , … , an,求一个不下降序列 b1≤b2≤…≤bn,使得数列 {ai} 和 {bi} 的各项之差的绝对值之和 |a1 - b1| + |a2 - b2| + … + |an - bn| 最小。 数据规模:1≤n≤106, 0≤ai≤2*109 例题:数字序列 —— 算法分析 假设数列 a1,a2, … ,ak 的最优解为 b1,b2, … ,bk 合并 {bi} 中相同的项,得到 m 个区间和数列 s1,s2, … ,sm 显然,si 为数列 a 中,下标在第 i 个区间内的各项的中位数。 例题:数字序列 —— 算法分析 若ak+1sm,直接令sm+1=ak+1,得到前k+1项的最优解; 否则,将ak+1并入第m个区间,并更新sm 不断 检查最后两个区间的解 sm-1和 sm,若 sm-1≥sm,合并最后两个区间,并令新区间的解为该区间内的中位数。 例题:数字序列 —— 算法分析 下面考虑数据结构的选取 我们需要维护若干个有序集,并能够高效完成下面两个操作: 合并两个有序集 查询某个有序集的中位数 进一步分析,加入一个元素后,发生一连串合并操作,合并后有序集的中位数不会比原来大 因此,每个有序集内只保存较小的一半元素,查询中位数操作转化为取最大元素操作。

文档评论(0)

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

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

1亿VIP精品文档

相关文档