1. 实践题目 —— 程序存储问题

2. 问题描述

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

3. 算法描述

贪心策略:以程序存放在磁带上的长度最短优先

贪心选择性质证明(反证法):

设程序集合E={1,2,...,n}按长度大小的非减顺序排列,程序1长度最短

首先最优解必须包含程序1,设AE是最优解且A中最短的程序是k。若k=1,则最优解包含程序1,若k>1,则程序1必比程序k短,可以代替程序k,令B=A-{K}+{1},则B也是一个最优解。

其次,若A是原问题的包含程序1的最优解,则A'=A-{1}是活动集合E'=E-{1}的最优解。设B'是E'的解且|B'|>|A'|,则B'∪{1}是E的解且|B'|+1>|A|,此与A是最优解相矛盾。

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

 

时间复杂度:初始化数组时使用了for循环语句,时间复杂度为O(n),在将程序填入磁带时,使用了for循环语句,时间复杂度也为O(n),所以整个算法的时间复杂度为O(n)。

 

空间复杂度:因为需要用到一维数组来存储程序长度,所以空间复杂度为O(n)。

5. 心得体会

通过此次实践对贪心算法思想有了更深入的了解,贪心算法大多会使用排序算法进行升序或降序排序,可能会用到结构体、优先队列等特殊的数据结构。贪心算法有两个基本要素:最优子结构性质和贪心选择性质。在思考第二题时,一开始使用了排序,由于排序后就不能按照原序输出,后来另外使用一个数组进行存储,但是又发现把最大的几个数字删除后,忽略了部分情况,因此在这道题上花费了很多时间。究其原因就是练的题目太少,见过的情形太少,导致考虑欠缺,因此还需加大练习力度。后来才知道,改题目不能整个数组直接排序,但可以进行局部的比较以及删除操作。

 

 posted on 2019-11-13 20:00  Seper  阅读(100)  评论(0编辑  收藏  举报