NOIP普及讲座堆及其应用.ppt

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
堆及其应用 江苏省华罗庚中学 杨志军 堆的定义 01 堆的性质 02 堆的基本操作 03 堆的应用 04 Table of Contents 内容大纲 预备知识 ? 完全二叉树: 如果一棵深度为 K 的二叉树, 1 至 K-1 层的结点都是满的,即满足 2 i-1 (1=i=k- 1), 只有最下面的一层的结点数小于等于 2 k- 1 ,并且最下面一层的结点都集中在该层最 左边的若干位置,则此二叉树称为完全二 叉树。 预备知识 1 2 3 4 5 6 7 满二叉树 1 2 3 4 5 完全二叉树 堆的定义 ? 堆也称二叉堆,结构上是一种数组,本质 上是一棵完全二叉树。树中每个结点与数 组中存放该结点中值的那个元素相对应。 堆的性质 ? 树根为 A[1] ,利用完全二叉树的性质,可 以求出第 i 个结点的父结点、左孩子结点、 右孩子结点的下标分别为: trunc(i/2) 、 2i 、 2i+1 。 堆的性质 ? 二叉堆还具有这样一个重要的性质:对除根以外 的每个结点 i ,A[parent(i)]≥A[i],即所有结点 的值都不得超过其父结点的值,称为大根堆。小 根堆就是要求:A[parent(i)]≤A[i] 。 堆的基本操作 ? 使用堆的关键部分是两个基本操作: Put 操作:即往堆中加入一个结点。 方法是往堆尾加入一个结点,并通过从下往上 的调整法,使其继续保持堆的性质; Get 操作:即从堆中取出根结点。 方法是从堆中取出堆头结点,并删除该结点 ( 堆尾覆盖 ) ,再通过从上往下的调整法,使其继 续保持堆的性质; Put 操作 5 7 5 6 4 4 3 2 1 1 4 2 5 6 4 3 7 5 heap Put 操作 5 5 7 5 6 1 4 4 3 2 1 1 4 2 5 6 4 3 7 5 1 heap Put 操作 6 1 5 7 5 6 1 4 4 3 2 1 heap 1 4 2 5 1 4 3 7 5 6 son Put 操作 4 1 5 7 5 1 6 4 4 3 2 1 heap 1 1 2 5 4 4 3 7 5 6 son Put 操作 1 1 2 5 4 4 3 7 5 6 5 7 5 4 6 1 4 3 2 1 heap son Put 操作 procedure put(x:longint); var fa,son,tmp:longint; begin len:=len+1; heap[len]:=x; son:=len; while (son1) and (heap[son div 2]heap[son]) do begin temp:=heap[son div 2]; heap[son div 2]:=heap[son]; heap[son]:=temp; son:=son div 2; end; Put 操作 void put(int x) { int fa,son,tmp; len++; heap[len]=x; son=len; while (son!=1 heap[son/2]heap[son]) { tmp=heap[son/2]; heap[son/2]=heap[son]; heap[son]=tmp; son=son/2; } } Get 操作 1 1 2 5 4 4 3 7 5 6 5 7 5 4 6 1 4 3 2 1 heap Get 操作 1 6 5 7 5 4 6 1 4 3 2 1 heap 6 1 2 5 4 4 3 7 5 Get 操作 6 1 5 7 5 4 1 4 3 2 6 heap 1 6 2 5 4 4 3 7 5 pa Get 操作 6 4 5 7 5 4 6 4 3 2 1 heap 1 4 2 5 6 4 3 7 5 pa Get 操作 1 4 2 5 6 4 3 7 5 5 7 5 6 4 4 3 2 1 heap pa function get:longint; var pa,son,tmp:longint; begin get:=heap[1]; heap[1]:=heap[len]; len:=len-1; pa:=1; while pa*2=len do begin if (pa*2+1len) or (heap[pa*2]heap[pa*2+1]) then son:=pa*2 else son:=pa*2+1; if heap[pa]heap[son] then begin tmp:=heap[pa]; heap[pa]:=heap[son]; heap[son]:=tmp; pa:=son; end else break; end; end; int get() { int p=heap[1],pa=1,son,t

文档评论(0)

sandajie + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档