贪心算法
(参考的资料: https://blog.csdn.net/effective_coder/article/details/8736718)
1、贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。
贪心算法的基本要素:
1.贪心选择性质。所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
2. 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。
贪心算法的基本思路:
从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。
该算法存在问题:
1. 不能保证求得的最后解是最佳的;
2. 不能用来求最大或最小解问题;
3. 只能求满足某些约束条件的可行解的范围。
实现该算法的过程:
从问题的某一初始解出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解;
删数问题 :给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
1、拿到这一道题目做的时候想法是循环 k 次,把 序列里面 k 个最大的数标记一下,然后输出的时候输出没有被标记过的数字,但是这样子做就有个问题,就是当输入 209 1 的时候,按照之前的算法设置,会把9标记出来,最后输出的 20, 与最终希望的 结果 9不符合。
2、后面就换了一种方法,每次选择首次出现的逆序对,删除逆序对的首元素,然后退出循环,直到匹配的逆序对个数 = k 时,如果没有匹配完成,那么说明此时的序列有序,从后面开始删。
证明当前的贪心策略是有效的:
假设当前的最优选择为Sn[a1, a2, a3, a4 .......]
b1 为与 a2 相邻的字符,且当前 b1 < a2, 那么将 b1 与 a2 进行替换,得到 Sn'序列,Sn' < Sn, 说明当前的最优解释是包含贪心选择的,所以该贪心策略是安全的。
总结
贪心的策略有很多种,怎么从这么多种选择出一种合法的我觉得还是有点难的,对于贪心策略的证明其实我还不是太熟悉,看的时候感觉还行,但是真正从 0开始自己证明的话还是不知道从哪里下手比较好,
所以这个我还得去加强一下。这周的结队辩证我们讨论的不是太多,可能更多地会分开地去考虑问题,这个可能与想要的结队效果不一致,但是我觉得分开去思考,然后在大家同时都有思路的时候再去讨论可能会好一些,这样子我觉得可能会提升得更快。