算法第四章上机实践报告
实践题目名称:删数问题
问题描述:
给定一个n位正整数a和一个正整数k,求从a中删去k个数后得到的新数的最小值。
Hint:
1.从a中删去k个数是指去掉a中任意k个数字,剩下的数字按原次序排列组成一个新的正整数。
2.若得到的新数有前导零,需要删去。
3.若得到的新数全为0,则输出0。
算法描述:
1.采用贪心法。贪心策略是:删除从左到右第一个递减序列的第一个数,(特别地,当序列是非递减时,删除最后一个数)。
2.循环第一步k次。
3.删除前导零并输出。
算法时间及空间复杂度分析:
时间复杂度:O(nk)
// 需要重复执行k次删除第一个递减序列的第一个数。
空间复杂度:O(1)
// 算法在实现的过程中只需要用到固定的几个变量作为辅助变量。
心得体会(对本次实践收获及疑惑进行总结):
本次实验课没能做出第2题即删数问题,我认为原因归结于没有想到一个比较好的贪心策略。一开始,我们想到的贪心策略是“每次删除序列中最大的数”,经验证,这种贪心策略不可行,之后一直没有想到一个合适的贪心策略。查了题解后,才恍然大悟。我们觉得自己还需要多思考、多打题,多积累贪心策略的选择方法。
贪心法的个人体会和思考:
1.我感觉在很多时候,采用贪心法解题,不仅能大大提高解题的效率,而且在代码实现时比较容易。
2.并非所有问题都适合用贪心法解题,采用贪心法解决的问题需要具有最优子结构性质和贪心选择性质。
3.在用贪心法解题时,采用合适正确的贪心策略非常重要,因此常常需要对提出的贪心策略进行证明,在证明某个贪心策略不正确时,常常可以采用举反例的方法。