问答题 [说明]
某机器上需要处理n个作业job1,job2,…,jobn,其中:
(1)每个作业jobi(1≤i≤n)的编号为i,jobi有一个收益值P[i]和最后期限值d[i];
(2)机器在一个时刻只能处理一个作业,而且每个作业需要一个单位时间进行处理,一旦作业开始就不可中断,每个作业的最后期限值为单位时间的正整数倍;
(3)job1~jobn的收益值呈非递增顺序排列,即p[1]≥p[2]≥…≥p[n];
(4)如果作业jobi在其期限之内完成,则获得收益p[i];如果在其期限之后完成,则没有收益。
为获得较高的收益,采用贪心策略求解在期限之内完成的作业序列。图3-25是基于贪心策略求解该问题的流程图。
(1)整型数组J[]有n个存储单元,变量k表示在期限之内完成的作业数,J[1..k]存储所有能够在期限内完成的作业编号,数组J[1..k)里的作业按其最后期限非递减排序,即d[J[1]]≤…≤d[J[k]]。
(2)为了便于在数组J中加入作业,增加一个虚拟作业job0,并令d[0]=0,J[0]=0。
(3)算法大致思想是:先将作业job1的编号1放入J[1],然后,依次对每个作业jobi(2≤i≤n)进行判定,看其能否插入到数组J中。若能,则将其编号插入到数组J的适当位置,并保证J中作业按其最后期限非递减排列;否则不插入。
jobi能插入数组J的充要条件是:jobi和数组J中已有作业均能在其期限之内完成。
(4)流程图中的主要变量说明如下。
i:循环控制变量,表示作业的编号;
k:表示在期限内完成的作业数;
r:若jobi能插入数组J,则其在数组J中的位置为r+1;
q:循环控制变量,用于移动数组J中的元素。
问答题 [问题1]
请将图3-25中的(1)~(3)空缺处的内容填写完整。
【正确答案】[问题1]
这是一道考查贪心算法的流程图分析的试题。(1)空缺处表示第2个作业到第n个作业的主循环的条件判断,由于i是循环控制变量,因此(1)空缺处所填写的内容是i<=h。
注意到题干中给出的关键信息“J[1..k)存储所有能够在期限内完成的作业编号,数组J[1..k]里的作业按其最后期限非递减排序,即[*]”。换言之,数组J中的作业J[i](1≤i≤k)是在其期限之前完成的作业,且[*]。由图3-25给出的算法流程图可知,主循环内嵌套了两个循环,第1个循环判断当前考虑的作业i应该插入到J中的什么位置,用循环控制变量r表示当前考虑的J中的作业。使用虚拟作业J[0],允许作业较方便地插入到第1个位置。为了保证J中的作业期限按升序排序,作业J[r]若比作业i的期限大,则循环控制变量r要自减,因此(2)空缺处所填写的内容是d[J[r]]>d[i]。
d[J[r]]与r的关系只有两种:d[J[r]]>r,表示还可能在J[1]与J[r]之间插入作业“d[J[r]]=r,表示不可以在J[1]~J[r]之间插入作业i。d[J[r]]<r的情况不会存在,因为J中若有r个作业,那么最后一个作业的期限不可能小于r。当作业i大于等于作业J[r]的期限时,此时找到了作业i插入的位置,即r+1。第2个循环的作用是将作业J[r+1]……J[k]依次往后移动,此处用插入排序算法的思想。最后把作业i插入到 J[r+1]处,因此(3)空缺处所填写的内容是J[r+1]=i(或J[q+1]=i)。
【答案解析】
问答题 [问题2]
假设有6个作业job1,job2,…,job6
完成作业的收益数组p=(p[1],p[2],p[3],p[4],p[5],p[6])=(90,80,50,30,20,10);
每个作业的处理期限数组d=(d[1],d[2],d[3],d[4],d[5],d[6])=(1,2,1,3,4,3)。
请应用试题中描述的贪心策略算法,给出在期限之内处理的作业编号序列 (4) (按作业处理的顺序给出),得到的总收益为 (5)
【正确答案】[问题2]
这是一道考查贪心算法实例应用的分析题。6个作业job1,job2,…,job6的收益已经按降序排列,根据图3-25的算法流程,将作业1,2,4和5放入数组J中,并得到总收益为220,具体分析过程见表3-13。

贪心算法实例执行过程

J数组
收益
考虑的作业
期限
操作
φ
0
job1
1
放入J中
1
90
job2
2
放入J中
1,2
170
job3
1
不放入J中
1,2
170
job4
3
放入J中
1,2,4
200
job5
4
不放入J中
1,2,4,5
220
job6
3
220

【答案解析】
问答题 [问题3]
对于本试题的作业处理问题,用图3-25的贪心算法能否求得最高收益? (6) 。(能或不能)
用贪心算法求解任意给定问题时,是否一定能得到最优解? (7) 。(能或不能)
【正确答案】[问题3]
这是一道判断贪心算法是否能求得最优解的应用分析题。对于本试题的作业处理问题,用图3-25的贪心算法策略,能求得最优解(即能求得最高收益)。但不是所有的问题都能通过贪心策略来求得最优解,一个典型的例子是0—1背包问题。例如,有3件物品,背包可容纳50磅重的东西,每件物品的详细信息如表3-14所示,问如何装包使得其价值最大?

表3-14 贪心算法实例执行过程

物品编号
重量(磅)
价值(美元)
单位价值
R
10
60
6
S
20
100
5
T
30
120
4

如果按贪心策略求解该问题,优先选择单位价值最大的物品,则先选择物品R,然后选择物品S。由于此时背包容量还剩下50-10-20=20,不足以容纳物品T,故总价值为60+100=160美元。但若选择物品 S和物品T,容量总和为20+30,小于等于总容量50,得到总价值为100+120=220美元,会得到更优解。此时用贪心策略不能得到最优解。
【答案解析】