二叉堆和应用.pptVIP

  1. 1、本文档共31页,可阅读全部内容。
  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文档。上传文档
查看更多
二叉堆和应用

二叉堆及其应用 雅礼 朱全民 一个基本问题 写一种数据结构,完成以下3种操作: (操作的总次数不超过100000) 1、插入一个数 2、询问最小值 3、删除最小值 要求是这3种操作都要快。。。 输入输出 输入 每行一次操作,有如下三种: 1 x:表示插入X这个数 2 :表示询问当前最小值 3: 表示删除最小值 输出 对于每个询问最小值操作,输出一行,每行仅一个数,表示当前的最小值。 输入: 9 ----- 9次操作 1 20 2 1 30 1 10 2 3 2 3 2 输出: 20 10 20 30 样例 用线性表作为数据结构 无序表: 插入操作 O(1) 询问最小值 O(n) 删除最小值 O(n) 有序表: 插入操作 O(n) 询问最小值 O(1) 删除最小值 O(1) 二叉堆 定义 堆是一棵完全二叉树,对于每一个非叶子结点,它的权值都不大于(或不小于)左右孩子的权值,我们称这样的堆为小根堆(或大根堆)。 描述如下: n个元素的序列{k1,k2,…,kn},当且仅当满足 ki=k2i 并且 ki = k2i+1 或者 ki=k2i 并且 ki = k2i+1 二叉堆肯定是一颗完全二叉树 在堆中插入元素x 首先将元素x放到堆中的最后一个位置(即最底层最右边的位置),然后不断地把x往上调整,直到x调不动为止(即大于它现在的父亲,或者x处于根结点)。 定义一个堆: Var st:array[1..maxn] of longint; //存储堆 n:longint; //堆中元素个数 1 3 5 4 5 7 8 6 2 1 3 5 5 7 8 6 4 (1)将新节点插到最后 (2)把新节点和父亲进行交换 1 5 5 7 8 6 4 (3)继续交换,直到重新满足堆的性质 3 2 2 插入 (实际上是不断向上调整的过程) PROC up (k:longint); {把第k个结点上调} begin while k1 do begin i:=k div 2; {i是k的父亲} if st[i]st[k] then begin swap(i,k); k:=i; {交换结点i和k} end else exit; end; end; 在堆中删除任意一个元素 这里说指的删除任意一个元素,是指在当前堆中位置为w的元素。过程如下:首先把位置w的元素和最后一个位置的元素交换,然后删去最后一个位置,这样w上的元素就被删除了。接着把位置w上的新元素不断下调,直到满足堆的性质。 1 5 5 7 8 6 4 3 1 5 5 7 8 6 4 3 1 5 5 7 8 6 3 4 (1)当前要删除的节点是根节点的左儿子 (2)将根节点的左儿子和最后一个节点交换 (3)将新的节点不断下调,直到满足堆的性质 2 2 删除 (实际上是不断向下调整的过程) PROC down(k:longint);{把第k个结点往下调} begin while k+k=n do begin i:=min{ 2k,2k+1}; {如果2k+1不存在直接返回k+k否则返回2个中间的值较小的元素} if st[i]st[k] then begin swap(i,k); k:=i; end else exit end; end; 堆的构造就是不断插入到堆的过程 6 2 3 5 1 分别插入权为6,2,3,5,1的元素 6 (1) 6 (2) 2 6 (3) 2 3 6 (4) 2 3 5 6 (5) 2 3 5 1 堆的插入.删除 PROC add(x:longint); {添加一个值为x的元素} begin inc(n); st[n]:=x; up(n) end; PROC del(x:longint); {删除一个值为x的元素} begin a[n]:=a[x]; down(x) end; 思考题1:合并果子 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所消耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档