算法第四章上机实践报告

组员:高珞洋,何汶珊

实践题目

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

问题描述

这个问题要求的是,要在容量一定的磁带里,放下尽量多的程序。那么我们就会想到,既然程序只有大小不一样,且只有唯一要求,存储尽可能多的程序,那么只要从最小的程序开始存储,就可以满足题目的要求。

算法描述

贪心策略

在还未存储进磁带的程序中,选择其中最小的,将其存储进磁带。

贪心选择

设程序集合E = {x1, x2, ...., xn}已按程序长度升序排列,x1为长度最短的程序。
则最优解一定包含x1。
假设有最优解A,其中长度最短的程序为k,若k=x1,则最优解A包含x1;若k>1,则x1与A中除k以外的程序相容,则存在一个解B=(A-{k})∪{x1},使得B也是最优解。因此可得最优解一定包含x1,即一定包含长度最短的程序。
因此以程序长度为依据的贪心选择成立。

最优子结构性质

已知A是原问题包含最短程序x1的最优解,假设有程序集合E' = {x2, ...., xn}已按程序长度升序排列。
则有A'=A - {x1}是集合E'的一个最优解。
假设存在B' > A', 则有B = B'∪{1}是E的解且B > A' + 1 = A,则B是E的最优解。
这与A是E的最优解矛盾,因此不存在这样的B和B'。
因此A'作为A的最优子结构,仍是E'的最优解。证得其有最优子结构性质

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

时间复杂度

主要的时间耗费在与数组的升序排序上,直接应用sort()方法,其内部为快排,因此时间复杂度T(n) = O(nlogn)

空间复杂度

除了存储输入程序的数组外,仅需要有限个变量存储结果等数据,因此空间复杂度S(n) = O(1)

心得体会

这次上机终于做了一次打题的人,虽然是很简单的题目,感觉其实打题也是很有意思的,至少这次上机做到了上次立的flag“尝试做负责打题的人”。

然后就是第二题,删数问题,这个题一直想不到什么贪心算法,后来百度搜索到了,是根据逆序数对来删除,但是一直忽略了删除0的情况,所以一直没有通过,后来就直接用了珞洋的代码。

感觉对贪心算法还不是理解的很好,反证法和最优子结构的运用也不是很好,就是靠尬想,所以后面还需要再多思考多锻炼吧。

posted @ 2019-11-19 21:33  有只泉仔  阅读(129)  评论(0编辑  收藏  举报