分析程序存储问题。内容包括:
- 实践题目 :4-1 程序储存问题
- 问题描述:设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。程序存储问题要求确定这n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。输入文件个数n和磁带长度L,再输入n个程序分别存放在磁带上的长度,输出最多可以存储的程序数。
- 算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质)
贪心策略:先分别把存放n个程序需要的磁带长度从小到大进行排序,再循环按次序选择最小的程序加入磁带,若程序加入后所需磁带长度之和小于磁带总长度,则可储存数加一。
证明:
贪心选择:设E={1,2,…n}为所给定的程序存放序列。E中程序按存储长度的非降序排列,故最先存放入磁带是第一个程序长度为程序1。设A(A包含于E)是最优解,k为最小 程序,若k为程序1,则最优解A中包含k即程序1,若k不为程序1,则程序1一定比k更小,与假设矛盾。
最优子结构性质:设A是包含程序1的最优解,则A'=A-{1}是活动集合E'=E-{1}的最优解,设B'是E'的解,且|B'|>|A'|,则B'∪{1}是E的解且|B'|+1>|A|,此与A是最优解相矛盾。
代码如下:
void loading(int a[],int l,int n){
sort(a,a+n);
int k=0;
for(int i=0;i<n;i++)
{
if(l>=a[i]){
l = l - a[i];
k++;
}
}
cout<<k;
}
4.算法时间及空间复杂度分析(要有分析过程)
时间复杂度:sort的时间复杂度为O(nlogn),遍历排好序的数组根据实际情况最少执行循环1次,最多n次,时间复杂度为O(n)。综上所述,时间复杂度为O(nlogn)。
空间复杂度:一个长度为n的一维数组,空间复杂度为O(n)。
5.心得体会(对本次实践收获及疑惑进行总结)
本次实践让我了解到贪心算法在编程问题上的运用,且与之前学习的数据结构知识如栈、队列、哈夫曼编码等结合,熟悉了这些数据结构的用法。在第二题删数问题的贪心算法的实现中,我也明白了通过贪心算法得到最优解不能一味从小到大或从大到小排序,而要考虑实际情况,灵活运用。