本来贪心证明是件玄学的事,然而在听了C先生的贪心证明后,受益匪浅。
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,TA所做出的仅是在某种意义上的局部最优解。
贪心算法每一步需要满足3个条件:
1.可行性:即必须满足问题的约束。
2.局部最优:它是当前步骤中所有可行选择中最佳的局部选择。
3.不可取消:选择一旦做出,在后面的步骤中就无法改变。
贪心算法的基本要素:
1.贪心选择性质:指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
2.最优子结构性质:指一个问题的最优解包含其子问题的最优解。
所以贪心可以是这个样子:
从问题的某一初始解出发;
while (能朝给定总目标前进一步)
{
利用可行的决策,求出可行解的一个解元素;
}
由所有解元素组合成问题的一个可行解;
非常重点的一个问题来了:贪心的证明。
C先生便告诉我一个叫做交换参数(Exchange Argument )证明的方法。
Exchange Argument的主要的思想也就是先假设存在一个最优的算法和我们的贪心算法最接近,然后通过交换两个算法里的一个步骤(或元素),得到一个新的最优的算法,同时这个算法比前一个最优算法更接近于我们的贪心算法,从而得到矛盾,原命题成立。
下面来看一个更为formal的解释:
步骤:
Step0: 给出贪心算法A的描述
Step1: 假设O是和A最相似(假设O和A的前k个步骤都相同(k可以是0),第k+1个开始不同,通常这个临界的元素最重要)的最优算法
Step2: [Key] 修改算法O(用Exchange Argument,交换A和O中的一个元素),得到新的算法O’
Step3: 证明O’是feasible的,也就是O’是对的
Step4: 证明O’至少和O一样,即O’也是最优的
Step5: 得到矛盾,因为O’比O更和A 相似。
到了这里我还是不懂(毕竟人傻),于是简单解释一下。就是假设我们自己的贪心算法为A,假设不是最优的,于是有与A最相似的最优算法O(相似指前K-1个选择都相同,第K个是不同的)。现在我们构造一个O',O' = O-(a的决策,b的决策)之和。
1)很显然,O'是这个问题的一个解,也就是说O'中的intervals没有重叠的。
2)O'是一个最优解,因为他的intervals的个数和O一样
综上,我们找到了一个最优解O',它和A具有的共同的intervals有K个,这和我们前提假设最多有k-1个相矛盾,所以,A是最优的。证毕。
有点呢:系统性,统一性。
因为这种抽象的证明方法可以适用于许多贪心算法。
缺陷:决策状态太多,太复杂的话。此方法就不能很简便的解决了。