堆与贪心算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

( 2) 堆排序 存贮在数组 a[ ]中的 n 个结点利用堆排序的思想是: ①先将数组 a 整理成堆; ②最小值为根结点 a[1], 将 a[1]与 a[n]交换, 此时 a[n]已 到 排 序 后 位 置 ; ③修改待排序元素个数 n(n=n- 1), 如果待排序元 素个数为零, 结束; ④树中仅根结点不满足堆的条件, 调整使之为堆; ⑤跳转到②。
4 应用实例
( 1) 多机作业调度问题 有 n 个作业, 每个作业都需要一定 的 时 间 ( t1,t2, ..., tn) 才 能 完 成 , 由 性 能 相 似 的 m 台 计 算 机 来 完 成 , 每个作业只能交一台计算机来完成, 问如何调度这些 作业, 才能在最短的时间内完成全部的任务。 ( 2) 用贪心算法求解多机作业调度问题 事实上, 这个问题的极限时间是平均时间( 总作 业时间被计算机平均分) , 可每个作业是不能分开给 两台以上的计算机来完成的, 所以, 最佳调度的目标 应该是各个计算机实际完成的作业最“平均”, 也就是 说, 计算机间实际完成的作业差别最小。 为此, 我们使用贪心算法来实现全部任务的“平 均”分配: ①任务量大的作业优先分配; ②总将当前作业优先分配给目前任务最少的计 算机。 一句话: 总是将工作量最大的作业调度给任务最
引言
堆是一种特殊的树, 简单地说, 它是一种按层有 序的完全二叉树。以小顶堆为例, 从根到叶结点, 各结 点关键字的值( 为简单见, 以后的叙述中就直接说其 值) 按层不递减。也就是说, 最小值一定是根结点。倘 或根结点之值发生变化, 再要将其整理成堆, 最多的 比较及移动的次数不会超过树的深度 ( 约 log2n) 。贪 心算法是计算机常用的算法策略, 在贪心算法中常常 要找到一组值中的最小( 大) 值, 并对最小值进行相关 的处理( 此时最小值往往不再是最小值了) , 再找最小 值, 再……。我们知道在一个无序表中进行顺序查找 的 时 间 复 杂 性 为 o(n), 虽 然 有 序 表 中 可 以 提 高 性 能 , 但 却 要 求 先 对 其 进 行 排 序 。我 们 注 意 到 每 次 对 上 一 轮 的最小值进行处理时有序性的破坏并不大, 只是最小 ( 大) 值发生了变化, 有没有更好的查找或重排序方法 呢? 本文重点介绍了堆在贪心算法中的运用思想, 并 分析了它的时间优越性。
少的计算机。 若按一般的顺序查找, 对于 n 个作业 m 台计算
而言, 时间复杂性为 o(mn)。若是引入堆的思想, 可以 大大提高效率, 时间复杂性可以降到 o(nlog2m)。利用 贪心算法求解多机分配问题的 N- S 图如图 1 所示。
图 1 贪心算法求解多机分配问题的 N- S 图 由于查找是在循环的内部, 故整个程序的运行效 率得到了很大的改善。
等都用的是此策略求的解。贪心算法通过一系列的选 二 择来得到一个问题的解。它所做的每一次选择都是当 四
一 前状态下某种意义的最好选择, 即贪心选择。希望通 期
MO D E R N C OMP U T E R 2006.8 !"# )
实践与经验
过 问 题 的 局 部 最 优 解 来 求 出 整 个 问 题 的 最 优 解 。当 然 这种策略也并不能保证总有效, 但许多情况下却能达 到预期目的, 而且方法也比较简洁。

of special tree. Heapsort is a kind of quick sort algorithm, the minimum(or maximum) can be found

by the greedy algorithm. The heap and the greedy algorithm are combined in this paper. The applying
结语
堆是一种特殊的树, 在堆中找最值的时间复杂性 是 o(1), 而在堆的首或尾添加一个元素整理成堆的时 间复杂性仅为 o(log2n), 在一些特殊的问题中 , 利用堆 可以提高找最值或数据重排序的效率。
参考文献 [1]谭浩强. C 程序设计. 北京: 清华大学出版社, 1999 [2]严蔚敏. 数据结构. 北京: 清华大学出版社, 2004 [3]王晓东. 计算算法设计与分析( 第二版) . 北京: 电子工业

Biblioteka Baidu
of heap in the greedy is studied, and the advantage in the time complexity is analysed as well.

Key words : Heap; Heapsort; Time Cmplexity; Greedy Algorithm


!"# MO D E R N C OMP U T E R 2006.8
2 堆排序的时间复杂性
含 n 个结点的完全二叉树中, 如果仅根结点不满
足堆的条件, 将它整理成堆, 只需从根结点, 沿着它的
较小子树向叶结点探索, 将所有比根结点小的结点都
一一上移到其交结点处即可, 最多的比较及移动的次
数不会超过树的深度( 约 log2n) , 也就是说, 整理一次 的时间复杂性为 o(log2n)。而将一个任意的完全二叉 树整理成堆则需要从最后一个非叶结点为根的子树
1 堆与堆排序
( 1) 堆 堆 是 以 顺 序 结 构 存 贮 的 特 殊 完 全 二 叉 树 。以 小 顶 堆为例, 树中父结点的关键字总不大于子结点的关键 字。若用顺序数组 a[ ]来存贮一个堆, 且设根结点的下 标为 1 ( 零下标单元未用) , 则下标为 i 的结点的左 ( 右) 孩子如果存在的话, 下标一定为 2i(2i+1), 而下标 为 i 的结点的父结点如果存在的话, 下标一定为 i/2。 故从数组的角度看, 堆应该满足: ai≤a2i 且 ai≤a2i+1, 其 中 i=1,2,…, n。
到整个树的 n/2 棵子树都一一进行整理( 上面的第①
步) , 再考虑到每个结点还要进行一次交换及整理( 上 现
面的②到④步) , 故堆排序的时间复杂性 为 o(nlog2n)。 代
自然是一种比较快的排序方法。


3 贪心算法

贪心算法是计算机算法策略中常用的一个, 我们 (总
比较熟悉的哈夫曼树、最小生成树、最短路 径问题等 第
贪心算法可以简单描述为: 对一组数据进行排 序, 找出最小值, 处理, 再找出最小值, 再处理。其中多 次要找取小值, 在此我们要讨论的也就是如何提高查 找效率。由于数据不能保证有序性, 使用一般的查找 算法, 时间复杂性是 o(n), 若利用堆来进行处理, 查找 的时间复杂性可以达到 o(log2n)。
出版社, 2004 [4]王 晓 东. 算 法 设 计 与 分 析 . 北 京 : 清 华 大 学 出 版 社 , 2004
( 收稿日期: 2006- 05- 18)
The S tudy on the He a p
a nd the Gre e dy Algorithm


GONG Xiong- xing
实践与经验
堆与贪心算法
龚雄兴
( 湖北襄樊学院, 襄樊 441003) 摘 要: 堆是一种特殊的树, 堆的首元素常常是堆中结点的最小或最大值。堆排序是一种比较快的
排序方法, 贪心算法中常常要找到最小( 大) 值。本文介绍了堆在贪心算法中的运用, 并分析 了其时间优越性。 关键词: 堆; 堆排序; 时间复杂性; 贪心算法


(Hubei Xiangfan University, Xiangfan 441003 China)

(总
Abs tract: With its first element usually being the minimum or the maximum of all the elements, heap is a kind
相关文档
最新文档