计算机算法基础教案,计算机算法基础教学课件ppt作者沈孝钧第7章-PPT-N2课件.pptx...

计算机算法基础教学课件ppt作者沈孝钧第7章-PPT-N2课件.pptx

第 7 章贪心算法又一个从解决小规模问题开始,逐步解决大规模问题的方法。贪心算法通常只发展一个解,而不是一组解。一开始,这个解也许是一个小规模问题的最优解,也可能是一个大规模问题的最原始的、粗略的、不完整的、非最优的解。贪心算法每前进一步,就把当前的解变为一个稍大规模问题的最优解,或把解变为一个更好、更完整、更优的解。当算法结束时,我们会得到一个最初大规模问题的一个最优解,或者一个相当好的近似解。这一章中讨论的例子都产生最优的结果。7-17.1 最佳邮局设置问题n 户人家与街西头的距离是 H[1] < H[2] < H[3] < … < H[n]。街上无邮局。现在,要建一些邮局使得任一户人家到最近一个邮局的距离不超过100米。请设计一个O(n)的算法以确定最少须要建多少邮局,并给出每个邮局到街西头的距离 (距离可以与住家相同)。贪心法的思路先确定,第一个邮局应该建在那里,即确定 P[1] 的位置。为了使邮局数最小,应尽量使P[1]距街西头远一些。但是,因为要使得第一户人家到它的距离不超过100米,因此,P[1] ? H[1] + 100。那么H[1] + 100是不是正确的决定呢?须要证明。7-2P[1] +100P[1] = H[1]+100xH[1]x+100?设在x的邮局的复盖范围设在P[1]的邮局的复盖范围证明:贪心法的证明往往用反证法。对本题而言,如果 P[1] ? H[1] + 100,那么必有P[1] = x < H[1] + 100。让我们比较一下。由图可见,所有能在x处得到服务的住户都可以在P[1]处的邮局得到服务。因此把第一个邮局建在P[1] 处总是正确的。在P[1]确定后,被P[1]复盖的住户可以不考虑。如果在 P[1]+100米外还有人家,则可重复这一过程确定 P[2]、 P[3]、…。7-3算法伪码Post-office (P, H, m, n)P [1] = H[1] + 100.m ? 1//邮局个数for i ? 2 to n if H[i] > P[m] + 100thenm ? m + 1P[m] ? H[i] + 100endifendforif P[m] > H[n] then P[m] ? H[n] //最后一个邮局不须超过H[n]endifreturn P, m End显然这个算法复杂度为 O(n)。7-47.2 最佳活动安排问题n 个活动,a1, a2, …, an,申请使用大礼堂。活动ai (1 ? i ? n) 有一开始时间 si 和一结束时间 fi,0 ? si < fi < ?。因此,一旦 ai 被选中,ai 在时间区间 [si, fi) 里独占大礼堂。假定大礼堂从时间t = 0开始可安排活动,但任何时候允许最多一个话动。 ai 和aj 称为兼容,如果[si, fi) 和 [sj, fj)不相交,即要么 fi ? sj,要么 fj ? si。最佳活动安排问题就是要从这n 个活动中选出一个两两兼容的最大子集。这样,我们可以让尽可能多的活动在大礼堂进行。7-5a10a7a4a1a6a9a114103713223900例7.1假定我们有以下10个活动申请使用大礼堂。i12345678910si01031376910fi24578910111314如果选出{ a1, a6, a9},它们是兼容的,但不是最优的。最优解可以安排4个活动。一个非最优解一个最优解7-6解题思路分治和动态规划都不方便,试用贪心法。如何选取第一个活动?能否选开始时间最早的活动呢?这个设想可立即被反例否定。能否选结束时间最早的活动呢?完全正确!证明用反证法。定理 7.1 给定 n 个活动,a1, a2, …, an,那么,结束时间最早的活动一定包含在某个最优解中。证明:假设am 的结束时间最早而某个最优解S中不含am 。在S中结束时间最早的活动为ak ? a m。因 am结束时间最早,我们有fm ≤ fk。因为S中其他活动与 ak 兼容,他们的开始时间大于等于fk,因而也大于等于fm,所以S中其他活动与am也兼容。因此,集合S’ = S ?{am}–{ak}也是一个最优解且包含am。?7-7一由定理7.1可知,一旦 a1 被选中后,下面做法是:与a1 不兼容的必不可取用同样的办法在所余活动中选取最优解因为每次要找结束时间最早的活动,我们首先把活动按完成时间排序为 f1 < f2 < …< fn。接下来的贪心算法如下。Greedy-Activity-Selection (s[1..n], f[1..n])A ? {a1}//a1 是第一个中选的活动i ? 1for m ? 2 to n if sm ? fi //如果sm < fi,则am与已选中的 ai 不兼容而跳过 th

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值