- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Chap4 堆和不相交集数据结构
第四章 堆和不相交集数据结构 堆 什么是堆? 是一棵几乎完全二叉树 每个内部结点的值都大于或等于它所有子结点的值 特别地,根结点的值都大于或等于它的子结点的值 如果一个结点的值被修改,可以通过向上筛选或向下筛选恢复堆的性质 Shift-up 运算 Procedure SIFT-UP Input: An array H[1…n] and an index i between 1 and n. Output : H[i] is moved up, if necessary, so that it is not larger than its parents. 1. done?false 2. if i=1 then exit {node i is the root} 3. repeat 4. if key (H[i])key(H [?i/2?]) then H[i] ? H [?i/2?] 5. else done?true 6. i? ?i/2? 7. until i=1 or done SIFT-DOWN 运算 Procedure SIFT-DOWN Input: An array H[1…n] and an index i between 1 and n. Output : H[i] is percolated down, if necessary, so that it is not smaller than its children. 1. done?false 2. if 2in then exit {node i is a leaf} 3. repeat 4. i?2i 5. if i+1 ?n and key(H[i+1])key(H[i]) then i?i+1 6. if key(H [?i/2?]) key (H[i]) then H[i] ? H [?i/2?] 7. else done?true 8. end if 9. until 2in or done Algorithm 4.1 INSERT Input: A heap H[1…n] and a heap element x. Output: A new heap H[1…n+1] with x being one of its elements. 1. n?n+1 {increase the size of H} 2. H[n]?x 3. SIFT-UP(H,n) Algorithm 4.2 DELETE Input: A nonempty heap H[1…n] and an index i between 1 and n. Output: A new heap H[1…n-1] after H[i] is removed. 1. x?H[i]; y?H[n] 2. n?n-1 {decrease the size of H} 3. if i=n+1 then exit {done} 4. H[i]?y 5. if key(y) ? key(x) then SIFT-UP(H,i) 6. else SIFT-DOWN(H,i) 7. end if Algorithm 4.3 DELETEMAX Input: A heap H[1…n]. Output: An element x of maximum key is returned and deleted from the heap. 1. x?H[1] 2. DELETE(H,1) 3. return x 创建堆 方法1: 给出一个有n个元素的数组A[1..n],从空的堆开始,不断向堆中插入每一个元素,直到A中元素完全被转移到堆中为止 分析: 插入第 j 个键值用时O(log j),故总的时间为O(nlogn) 例: A[1..10]={4,3,8,10,11,13,7,30,17,26} 创建堆 方法2: 将堆看作一棵完全二叉树,从最后一个分支结点开始到根结点,根据需要,每一次将以当前结点为根的子树转换成堆 A[?n/
文档评论(0)