堆与优先权队列-新教材.pptxVIP

  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文档。上传文档
查看更多
树;目录;回顾;场景; 一个大小为n的堆是一棵包含n个结点的完全二叉树,该树中每个结点的关键字值大于等于其双亲结点的关键字值 完全二叉树的根称为堆顶,它的关键字值是整棵树上最小的-最小堆 最大堆:完全二叉树中每个结点的关键字值大于等于其孩子结点的关键字值 ;回顾;?;完全二叉树中的结点可以按层次顺序存储在一片连续的存储单元中。根结点保存在编号为0的位置上。         ;优先权队列————堆数据结构 堆数据结构————完全二叉树 完全二叉树————顺序存储;;完全二叉树可以以顺序方式存储 堆是n个元素的序列(k0,k1,…,kn-1), 当且仅当满足 (1) 2i+1 n时, ki? k2i+1 (2) 2i+2 n时,ki? k2i+2 ;考查1 给定序列,判断是否最小堆?;判断序列(23,53,34,65,83,74)是最小堆吗 ;判断方法 先将序列画成完全二叉树形式 判断最小堆条件是否成立;判断序列(23,98,34,65,83,74)是最小堆吗? ;考查2 给定序列不是最小堆 如何改造成唯一的最小堆?;1.将序列画成堆(完全二叉树)的形式 2.将堆调整为最小堆: 从完全二叉树最后一个叶子的双亲开始往前访问直到根结点 每访问一个结点,判断是否满足最小堆条件 IF 不满足,将该结点与最小孩子交换(向下调整) 交换完后再判断该结点是否满足最小堆条件 IF 不满足,继续向下调整,直到满足;3.将获得的最小堆中元素按照层次遍历顺序依次编号,并表示为一个序列;动作分解 任给定一个不满足最大堆的结点 如何向下调整;;程序5.5 向下调整运算。 void AdjustHeap(int Heap[],int s,int m) {//假设Heap[s+1…m]已经是堆,将Heap[s…m]调整成以Heap[s]为根的最大堆 int Temp= Heap[s]; for(j=2*s;j=m;j*=2) //沿关键字值较大的孩子结点向下调整 { if(jm Heap[j] Heap[j+1]) j++; //j为关键字值较大的记录的下标 if(Temp Heap[j]) break; //Temp插入在位置s上 Heap[s]=Heap[j]; s=j; } Heap[s]=Temp; };程序5.6 建堆运算。 void CreateHeap(int heap[],int n) { for(int i=(n-2)/2;i=0;i--) AdjustHeap(heap,i,n); };优先权队列的抽象数据类型;ADT PQueue{ 数据: n?0个元素的最小堆。 运算: Initialize( int maxNumber ):构造一棵空的优先权队列,其元素最大个数为maxNumber。 Destroy(H ):销毁优先权队列H。 MakeEmpty(H ):创建空的优先权队列H。 Insert(ElemType X, H ):在优先权队列H中插入元素值为X的元素。 DeleteMin(H ):删除优先权队列H的最小值。 FindMin(H ):查找优先权队列H的最小值。 IsEmpty(H ):判断优先权队列H是否为空。 IsFull(H ):判断优先权队列H是否为满。 } ; 优先权队列中插入一个新元素的算法步骤: 1.首先将新元素插入到优先权队列的最后 2.检查新元素插入后,队列是否保持优先权队列的特点,若不能则需调整: 调整过程是由下向上,与双亲结点比较 若双亲结点大则新元素上浮,双亲结点下沉。 注:这一过程中与AdjustHeap相反的比较路径 AdjustHeap中调整结点与其孩子比较,不断下沉 本算法中调整结点与双亲比较,不断上浮 ;例1:向优先权队列中插入一个新元素24;从空队列开始,依此向队列中插入元素的过程;; 优先权队列中删除堆顶元素的算法步骤: 1. 将堆顶元素赋值给x,然后将堆底元素覆盖堆顶元素 2.检查堆顶元素被覆盖后,新堆顶元素是否保持优先权队列的特点,若不能则需调整: 调整过程是由上向下,与孩子结点比较 若堆顶结点大则堆顶元素下沉,孩子中小者上浮 注:这一过程中即AdjustHeap过程 ;作业:

文档评论(0)

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

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

1亿VIP精品文档

相关文档