算法第四章上机实践报告

算法第四章上机实践报告

组员:高珞洋,何汶珊

实践题目

程序存储问题

设有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)

心得体会

本章学习的是贪心算法,因此解题时会默认直接用贪心算法求解,而跳过了求证步骤。在明确用贪心算法求解后解题会变得简单许多,至少会比动态规划简单。
但其实求证的过程还是略微复杂的,当搞懂了一个题目是如何求证才能明确其可用贪心算法求解才算真正掌握了贪心算法。

除了判断是否贪心求解,还需要进一步明确贪心的依据是什么,比如在非0-1背包的问题中,选择的依据是物品单位重量的价值,而非单纯的重量或者价值。
确定依据后,无非是对当前可选物品进行排序、选择,单独并不大。因此感觉对问题进行证明才是难点。

posted @ 2019-11-18 16:41  BlackDn  阅读(170)  评论(0编辑  收藏  举报
https://blog-static.cnblogs.com/files/luoyang0515/live2d.js https://files.cnblogs.com/files/kousak/waifu.css
Live2D