贪心算法
一、概念:总是选择当前最好的。【局部最优】
二、使用考虑:
具有最优子结构性质且动态规划略复杂时可以考虑使用。
(最优子结构性质:问题的最优解包含的子问题的解也是最优的。)
(使用动态规划的分析思路:证明原问题具有最优子结构性质,证明原问题的最优解可以由子问题的最优解构造而成)
(动态规划的耗时:递归式求解中,每次有i种选择,每种选择产生m个子问题,再考虑外层循环则计算量较大)
三、基本要素:
1、贪心准则:选择的最优评价函数
2、基本步骤:
1)将问题转换为:每做一次选择,只剩下一个子问题需要解决
3)证明贪心选择后,原问题总存在最优解(贪心选择总是安全的)
4)证明贪心选择后,剩余子问题的最优解与贪心解组合可得到原问题的最优解(最优子结构)
✨3、基本要素【贪心正确性证明思路】
1)贪心选择性质:每一步的贪心选择都能生成全局最优-》对每一个子问题假设有个最优解,用贪心选择的解替换,证明替换后的性质与之前相同,即也是最优解
2)最优子结构性质:证明剩余子问题的最优解与贪心解组合可得到原问题的最优解(or若X是原问题的最优解,则x-x1为子问题的最优解),类似对子问题数学归纳法(反证或数学归纳法)
四、范例:
1、找零钱:每次选择面值最大且不超过剩余要找面值的硬币。
2、活动安排问题
3、小数背包问题
4、最优装载
5、哈夫曼编码
证明:
(1)贪心选择性质
证明每次选最小的两个是最优的
(2)最优子问题性质
证明该问题最优解对应的子问题的解也是最优解(去掉最小的两个换成一个合并频率的字母表得到一个最优树,再转为原问题字母表得到的树也是最优的)
6、找钱问题
7、单源最短路径Dijkstra O(n2)
8、最小生成树
(1)Prim O(V lgV +E lgV ) =O(E lgV )
(2)Krustal O(ElogE)