算法第四章实践报告
算法第四章实践报告
一、实践题目名称
删数问题
二、问题描述
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最小的删数方案。如果数字最前面有0不输出
三、贪心策略及算法描述
贪心算法的性质:
- 贪心选择性质:删除k位数字所得新的最小数字可以通过一次次删除一个高位的大的数字来得到
- 最优子结构:删除一个符合要求的数字所得新的最小数字是删除k个符合要求的数字所得新的最小数字的子结构
贪心策略:尽量删除高位的大的数字即寻找单调递减的第一个数然后删除,若是一直单调递增则删除单调递增的最后一个数
用字符数组来存n位正整数a,通过while循环删除k个符合要求使得剩余数组成新数最小。像贪心策略那样寻找单调递减的第一个数,找到后删除,后面的数前移;如果找到最后一个数也没找到即说明是一直单调递增的,则删除最后一个。最后输出组成的新数,如果开头是0则不输出,直到不为0的数,记下下标,从该下标开始输出
四、时间复杂度分析
主要算法放在两层循环中,第一层while循环一定循环k次,第二层for循环最坏情况循环n次
即该算法的最终的时间复杂度T(n) = O(k * n) = O(n)
五、对贪心算法的理解
可以运用贪心算法解决的问题即满足贪心算法两个性质的问题
- 贪心选择性质:所求问题的最优解可以通过一系列局部最优解来达到
- 最优子结构性质:所求问题最优解包含其子结构的最优解
运用贪心算法解决问题的基本思想
首先选择某种贪心策略,根据策略做出当前状态的最优选择,然后问题演化成与原问题相同的规模更小的子问题,最后用相同的策略求解子问题得到最终解