第四章——贪心算法
一、对贪心算法的理解
贪心算法就是每一次面临选择的时候都优先选择当前最优的选择,也就是只是选择局部最优,而不考虑全局情况。
但是在某些应用场景下(如活动安排问题、背包问题、哈夫曼编码问题)也即具有贪心选择性质和最优子结构性质的问题,利用贪心算法可以得到整体最优解(可用数学归纳法/反证法证明)。
二、4-3 会场安排问题 ——贪心选择性质分析
1. 问题分析:要使得安排的会场数最少,则应该使得每个会场尽量多的利用起来。可选择的贪心策略可能有最早结束、最晚开始、最短时间以及最早开始。
2. 贪心策略选择:
(1)最早结束、最晚开始、最短时间3种贪心选择策略不可取。反例如下图,这种3种情况下,最少会场数是2,但利用这3种策略的结果是3。
(2)最早开始贪心选择策略可取
证明:假设每个会场安排活动时,最优解不是选最早开始的活动
对任意最优最少会场安排集合,对每个会场选择的活动替换为最早开始的活动,(如果活动相同无需替换,而活动不相同,替换为最早开始,可以充分利用好一个会场的使用时间),
那么替换后会场数安排数会小于或等于最优最少会场安排数。说明每次安排会场时选最早开始的活动这种贪心策略得到的贪心解不劣于最优解,说明采用该策略可以得最优解。
三、本章学习过程中遇到的问题
1. 在选择贪心策略的时候,有的贪心策略想不到反例,但是又不知道怎么证明这个策略错在哪。
2. 用对一些题目用对贪心策略基本是误打误撞对的,没有在选择贪心策略时就先证明用这个策略就是能得到整体的最优解。
四、结对编程的情况
1. 结对编程搭档:蔡晓娜
2. 实践课结对编程
(1)第一题4-1 程序存储问题很简单,每次选择放在磁带上长度最小的程序就可以了。依旧是晓娜打代码,然后我在旁边看。(不过课后我有自己重新打代码提交)
(2)第三题4-3 最优合并问题,一开始是没有对前两个合并后得到的新的长度与剩下的序列长度重新进行排序,导致错误,解决这个问题就正确了。
(3)第二题4-2 删数问题,实践课上我们没找到正确的贪心策略。
课后经过讨论查找得知,对于这个问题,首先要考虑怎么使得组合后的数最小,而对于一个数高位数越大,这个数就越大,所以我们要从高位入手。(注意:不要对数字串进行排序,题目要求剩下的数字按原次序排列组成一个新的正整数)
贪心策略:每次删数,从数字串首位开始找,找出局部最大数并删掉(找第一个递减区间并删掉递减区间的首位)
分析:对长为len的数字串要删n个数,则要进行n轮查数删数。每一轮从数字串首开始查,每次比较i位与i+1为(i: 0~len-1),找到第一个递减区间(i位大于i+1位),删掉递减区间的首位(第i位)。没找到递减区间说明序列呈递增,那么序列最后一位则为最大的数,序列长度减1则删掉了最大数;再对0进行处理,最后得到的数就是组合后最小的数了。