一、实践题目
程序存储问题
二、问题描述
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。
三.算法描述
贪心选择性质:
证明:
设A是最优解,且A中最先放入磁带的是程序k。
若k = 1,则最优解包含程序1,即A是一个以贪心选择开始的最优解。
若k>1 最优解不包含程序1,令B=A–{k}∪{1},因为程序 1 的长度小于程序 k 的长度,且 A中的程序个数与B相同,故B也是一个最优解,而B包含程序1,故总存在以贪心选择开始的最优存储方案。
最优子结构性质:
证明:
假设A‘ 不是P’ 的最优解,设B’ 是P‘ 的最优解,且 | B' | > | A' |, 则 B’ ∪ {1} 是 P的解,且| B' | + 1 > | A |, 这与A是最优解矛盾,故A‘ = A - {1}是 P’ = {2, 3, ...,n}的一个最优解。
四、算法时间及空间复杂度分析
由程序存储问题的贪心选择性质和最优子结构性质,容易证明算法的正确性,算法的主要计算量在于将程序依照长度从小到大排序,所以算法的时间复杂度为O(nlogn)。没有使用辅助空间,空间复杂度为O(1)。
五、心得体会
本次上机实验是为了巩固对贪心算法的掌握程度,用该算法解决问题时最重要的是贪心策略的确定,只要确定了贪心策略,每次根据贪心策略选择目前最优的解即可得到整体最优解。