堆与贪心算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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