实践题目

程序存储

问题描述

设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。

算法描述

贪心选择性质

设程序已经参照长度从小到大排序,(x1, x2, ..., xn)是程序储存问题的一个最优解,设k = min(1<=i<=n) {i | xi = 1},如果给定的程序存储问题有解,则1<=k<=n。

 当k = 1时,(x1, x2, ..., xn)是一个满足贪心选择性质的最优解。

 当k > 1时,取y1 = 1,yk = 0,yi = xi,1<i<=n,i≠k,则(n∑i=1)liyi = l1 - lk + (n∑i=1)lixi <= (n∑i=1)lixi <= L

因此,(y1, y2, ..., yn)是所给程序存储问题的可行解。此外,由(n∑i=1)yi = (n∑i=1)xi知,(y1, y2, ..., yn)是满足贪心选择性质的最优解。所以,程序存储问题具有贪心选择性质。

最优子结构性质

设(x1, x2, ..., xn)是程序存储问题的满足贪心选择性质的最优解,则x1 = 1,(x2, x3, ..., xn)是磁带长度为L-l1、待存放程序为{2, 3, ..., n}时相应程序存储问题的最优解。也就是说,程序存储问题具有最优子结构性质。

算法时间及空间复杂度分析

时间复杂度

算法的关键语句是将程序依照长度从小到大排序的语句,所以算法的时间复杂度为O(nlogn)。

空间复杂度

没有使用辅助空间,空间复杂度为O(1)。

心得体会

这次练习贪心算法第一题没有什么问题,主要是第二题对String类的掌握还不够。