题目:磁带的最优存储:假定有n个程序需存放在长度为L的磁带上,每一个程序i有长度l(i),1<=i<=n,l(1)+l(2)+….+l(n)<=L.假定无论什么时候,检索该带上的某个程序时,带的位置都处于始端。因此,若程序按I=i(1),i(2)…i(n)存放时,则检索时间i(j)的时间t(j)为l[i(1)]+l[i(2)]+…+l[i(j)],如果各程序的检索机会相等,则期望检索时间为[t(1)+t(2)+…+t(n)]/n.试给出一个贪心算法,找出n个程序的一种排列,证明当他们按此顺序存放时,能使期望检索时间最少。<?xml:namespace prefix = o ns = “urn:schemas-microsoft-com:office:office” />
算法思想:
最短时间设想:(贪心策略)
因为程序长度和检索该程序的时间成正比,输入个程序后,先按程序长度由小到大序,即程序短的放前面。则由题意的检索方法可知该方法检索时间最短。
算法过程:
1、输入n和L[1] 、L[2] 、… 、L[n] 。
2、将L数组从小到大排序。
3、计算出各个程序的从头查找的检索时间T[i]
4、计算出最优存储的平均检索时间 ST
算法证明:
假设排序后的理想最优序列为:A1、A2、…、An
则对于检索的平均调度时间为:
ST=(0+A1+(A1+A2)+(A1+A2+A3)+…+(A1+A2+…+An-1)) / n
=((n-1)A1+(n-2)A2+…+An-1) / n
利用反正法思想
假设存在一个序列B1、B2、…、Bn的平均调度时间小于上面的贪心策略时间,则至少存在A1,A2,…,Aj,…,Ai,…An,使得Aj>Ai, 且j>i 。
那么(n-i)Aj+(n-j)Ai>(n-i)Ai+(n-j)Aj,
与最优解矛盾,故贪心解为最优解。