第4章 贪心算法(0-算法思想)

第四章-贪心算法(模拟试题)

计算机与信息科学学院2010-2011学年第2学期模拟试卷 计算机算法设计与分析—第四章.贪心算法 本卷满分100分 完卷时间120分钟 一. 简答题(每小题2分,共20分) 1. 当一个问题具有 且具有 时可用贪心算法,如最小生成树问题(背包问题,活动安排问题等)。 2. 在动态规划可行的基础上满足 才能用贪心。 3. 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的 选择。 4. 动态规划算法通常以 的方式解各子问题,而贪心算法则通常 以 的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题 5. 贪心算法和动态规划算法都要求问题具有 性质,这是2类算法的一个共同点。 6. 当一个问题的最优解包含其子问题的最优解时,称此问题具有 。 7. 对于具有n 个顶点和e 条边的带权有向图,如果用带权邻接矩阵表示这 个图,那么Dijkstra 算法的主循环体需要 时间。这个循环需要执行n-1次,所以完成循环需要 时间。算法的其余部分所需要时间不超过 。 8. 0-1背包问题指:给定n 种物品和一个背包。物品i 的重量是Wi ,其价值为Vi ,背包的容量为C 。应如何选择装入背包的物品,使得装入背包中物品的 最大。 9. 有一批集装箱要装上一艘载重量为c 的轮船。其中集装箱i 的重量为Wi 。最优装载问题要求确定在 不受限制的情况下,将 装上轮船。 10. 多机调度问题要求给出一种作业调度方案,使所给的n 个作业在 由m 台机器加工处理完成。 二. 综合题(1-6题每题7分,7-8题每题9分,共60分) 1. 有4个物品,其重量分别为(4, 7, 5, 3),物品的价值分别为(40, 42, 25, 12),背包容量为10。试设计3种贪心策略,并给出在每种贪心策略下背包问题的解。 )(n O

第四章贪心算法

第四章贪心算法 一、课本+作业 DIJKSTRA的主要思想 算法的思想是把中心定在起始顶点,向外层结点扩展,最终在目标顶点结束,停止扩展。设顶点集合为S,通过贪心选择,逐步扩充这个集合。一开始,集合S中所包含顶点仅为源点。设u为图G的某一结点,把从开始顶点到结点u,且中间经过的顶点均在集合S内的线路称为从源点到u的特殊路径。 创建一个数组SD,用于储存每个顶点所对应的最短特殊路径的长度。算法每次从u∈V-S 中取出具有最短特殊路长度的顶点u,将u添加到集合S中,与此同时,修改数组SD。当S包含了所有V中顶点时,SD就记录了从源到所有其它顶点之间的最短路径长度。 Dijkstra算法的时间复杂度为O(n2),空间复杂度随着选择的存储方式不同而有所变化,若存储方式为邻接矩阵时为O(n2)。在求解单源最短路径问题时,Dijkstra算法可以得到最优解,但由于它需要遍历众多结点,所以效率低。

历年试题 1.(2011年)试用Prim算法求解下面无向赋权图的最小生成树,指出最小生成树及该树中各边被选中的先后次序;写出算法的基本步骤。

2. (2010)1.分析Kruskal 算法的时间复杂度; 2. 试用下面的例子说明用Kruskal 算法求解最优生成树问题,并总结出算法的 基本步骤: 3.(2009)(原理习题有) 4. (2006) 设n p p p ,,,21 是准备存放到长为L 的磁带上的n 个程序,程序i p 需要的带 长为i a 。设L a n i i >∑=1,要求选取一个能放在带上的程序的最大子集合(即其中含有 最多个数的程序)Q 。构造Q 的一种贪心策略是按i a 的非降次序将程序计入集合。 1). 证明这一策略总能找到最大子集Q ,使得∑∈≤Q p i i L a 。

算法分析习题参考答案第四章

第四章作业 部分参考答案 1. 设有n 个顾客同时等待一项服务。顾客i 需要的服务时间为n i t i ≤≤1,。应该如何安排n 个顾客的服务次序才能使总的等待时间达到最小?总的等待时间是各顾客等待服务的时间的总和。试给出你的做法的理由(证明)。 策略: 对 1i t i n ≤≤进行排序,,21n i i i t t t ≤≤≤ 然后按照递增顺序依次服务12,,...,n i i i 即可。 解析:设得到服务的顾客的顺序为12,,...,n j j j ,则总等待时间为 ,2)1(121n n j j j j t t t n nt T +++-+=- 则在总等待时间T 中1j t 的权重最大,jn t 的权重最小。故让所需时间少的顾客先得到服务可以减少总等待时间。 证明:设,21n i i i t t t ≤≤≤ ,下证明当按照不减顺序依次服务时,为最优策略。 记按照n i i i 21次序服务时,等待时间为T ,下证明任意互换两者的次序,T 都不减。即假设互换j i ,)(j i <两位顾客的次序,互换后等待总时间为T ~ ,则有 .~ T T ≥ 由于 , ))(())(()2)(2()1)(1(21n j i i i i i i t j t j n i t i n t n t n T +--++--++--+--=,))(())(()2)(2()1)(1(~ 21n i j i i i i i t j t j n i t i n t n t n T +--++--++--+--= 则有 .0))((~ ≥--=-i j i i t t i j T T 同理可证其它次序,都可以由n i i i 21经过有限次两两调换顺序后得到,而每次交换,总时间不减,从而n i i i 21为最优策略。 2. 字符h a ~出现的频率分布恰好是前8个Fibonacci 数,它们的Huffman 编码是什么?将结果推广到n 个字符的频率分布恰好是前n 个Fibonacci 数的情形。Fibonacci 数的定义为:1,1,11210>+===--n if F F F F F n n n

ch4_贪心算法

78 第四章 贪心算法 §1.贪心算法基本思想 找零钱 假如售货员需要找给小孩67美分的零钱。现在,售货员手中只有25美分、10美分、5美分和1美分的硬币。在小孩的催促下,售货员想尽快将钱找给小孩。她的做法是:先找不大于67美分的最大硬币25美分硬币,再找不大于67-25=42美分的最大硬币25美分硬币,再找不大于42-25=17美分的最大硬币10美分硬币,再找不大于17-10=7美分的最大硬币5美分硬币,最后售货员再找出两个1美分的硬币。至此,售货员共找给小孩6枚硬币。售货员的原则是拿尽可能少的硬币个数找给小孩。 从另一个角度看,如果售货员将捡出的硬币逐一放在手中,最后一起交给小孩,那么售货员想使自己手中的钱数增加的尽量快些,所以每一次都尽可能地捡面额大的硬币。 装载问题 有一艘大船用来装载货物。假设有n 个货箱,它们的体积相同,重量分别是,货船的最大载重量是c。目标是在船上装更多个数的货箱该怎样装?当然,最简单的作法是“捡重量轻的箱子先往上装”,这是一种贪心的想法。如果用表示装第个货箱,而n w w w ,,21"1=i x i 0=i x 表示不装第i 个货箱,则上述问题是解优化问题: 求,使得 n x x x ,,,21" (4.1.1) ∑=n i i x 1max 满足条件 (4.1.2) 1 w ,0n i i i i x c x =≤=∑,1贪心算法,顾名思义,是在决策中总是作出在当前看来是最好的选择。例如找零钱问题中,售货员每捡一个硬币都想着使自己手中的钱尽快达到需要找钱的总数。在装载问题中,每装一个货箱都想着在不超重的前提下让船装更多的箱子。但是贪心方法并未考虑整体最优解,它所作出的选择只是在某种意义上的局部最优选择。当然,在采用贪心算法时未必不希望结果是整体最优的。事实上,有相当一部分问题,采用贪心算法能够达到整体最优,如前面的找零钱问题以及后面将要讲到的单点源最短路径问题、最小生成树问题、工件排序问题等。为了更好理解贪心算法,我们将装载问题稍加推广,考虑可分割的背包问题。 背包问题 已知容量为M 的背包和件物品。第i 件物品的重量为,价值 n i w

第四章算法作业

骆吉洲作业: 1. 设有n种不同面值的硬币,个个硬币的面值存于数组T[1:n]中。现在用这些硬币来找钱。各种硬币使用的各数不限。 (1)当只用面值为T[1]、T[2],…,T[i]来找出钱j时,所用的硬币的最小个数记为C(i,j),写出C(i,j)的递推式。 (2)设计一个动态规划算法以计算C(n,j),1≤j≤L,并且只使用一个规模为L的数组,并分析该算法的复杂度。 (3)设C(n,j),1≤j≤L已经计算出来,对任意钱数m(小于等于L),确定用最少硬币数找出钱m的策略。证明该问题有贪心选择性,设计解该问题的贪心算法,并分析其复杂度。 答: (1)递推式: C(i,j)={ 0 j=0 j/T[1] j>0且i=1 min 1≤k≤j/T[i] {k+C(i?1,j?k×T[i])} j>0且i≠1 (2)算法设计:根据(1)中的递推公式,计算C(i,j)时只可能会用到C(i-1,x),其中x的取值区间为[1,j-1]。不会使用x>j的元素数值。假设一个n×L阶矩阵,只需要从左往右计算,每列从上往下计算C(i,j),并使用一个规模为L的数组即可。 算法伪代码: Input:硬币面值数组T[1:n],待找钱数L Output:使用硬币的最小个数x的数组 GET-CHANGE(T,L)

1 n←length(T) 2 create array x[1:L] 3 for j←1 to L 4 d o x[j]←j/T[1] 5 for i←2 to n 6 do for j←L to 1 7 do for k←1 to j/T[i] 8 do if x[j-k*x]+k

相关主题
相关文档
最新文档