贪心算法证明问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/eric47777/article/details/49749393

0,交换参数?感觉听起来挺别扭的不像是一个方法的名字~o╯□╰)o

下面来看一个更为formal解释:

Step0:给出贪心算法A描述

Step2:[Key]修改算法O用ExchangArgument交换A和O中的一个元素)得到新的算法O

Step4:证明O至少和O一样,即O也是最优的

证毕。

Step0: 给出贪心算法A描述

Step2:找出O和A中的一个不同。当然这里面的不同可以是一个元素在O不再A或者是一个pair顺序在A和在O不一样。这个要根据具体题目)

Step4:Argue这样的不同一共有Polynomi个,然后我exchangPolynomi次就可以消除所有的不同,同时保证了算法的质量不比O差。这也就是说Aasgoodas一个O因为Oarbitrari选的所以Aoptim

下面给几个例子:

例 MaximumCardinDisjointIntervalProblem

GreediAlgorithm:每次都选所有interv中bi最小的那个,把(aibi加入S然后把(aibiT中删除,同时把T中所有和(aibi有交叉的interv删除,然后再在T中找最小的bj循环上面的操作,直到没有可以在添加的

下面就用第一个证明的方法来证。

假设对于AA第k个选择的aibi而O第K个选择的ajbj从A定义我可以直到bi<=bj

1很显然,O'这个问题的一个解,也就是说O'中的interv没有重叠的

2O'一个最优解,因为他interv个数和O一样。

问题描述:有一系列的tasks{a1a2an}每个task需要在cpu上跑{p1p2pn}个unit时间,cpu非抢占式的也就是task一旦获得cpu就运行直到完成,{c1c2cn}每个task完成时间,现在要minim就是c1+c2++cn/n所有的task一起releas

证明上面说的GreediAlgorithm最优的

假设A不是最优的那么一定存在一个最优的O和A最接近,选择的前k-1个task相同的

No.123k

O ajai

现在就来构造O'当然,O'就是把O中的ai和aj两个元素交换一下,即

A   aiaj

O'aiaj

还是用上面的5个例子算了对于a2,a1,a3,a5,a4知道总时间其实是5个a2时间,即p24个a1时间,即p1依次类推,所以总时间是5*p2+4*p1+3*p3+2*p5+p4

问题描述:对于边集合E先按每个边的cost排序,从小到大,然后按如下方法构造一个MST每次选cost最小的那个边,添加进我MST如果一个边使我现有的MST呈现环路,则把这条边舍弃,然后重复上面的操作。感觉现在表达越来越搓了没看明白怎么回事的童鞋看这里吧 http://en.wikipedia.org/wiki/Kruskal's_algorithm

假设我graphGV,E有一个optim算法O生成的MSTT1Kruskal生成的树是T2这样,因为T2=T1如果相等我Kruskal就最优了就不用证了所以至少有一条边eeT1中,同时e不在T2中。这个与众不同的e就是切入点。可以想象,如果我把eT1中去掉,T1就变成了两部分,即Ta和Tb知道 {Ta中的点}V{Tb中的点}=V就是Ta中的点并上Tb中的点就是G中的点集V所以在T2中,一定有一条边ff=ef一个点在{Ta中的点}f另一个点在{Tb中的点}根据我Greedi算法Kruskal没有选e因为e图中造成了回路。进一步想,有回路是因为我先选了f这就说明costf<=coste恩,这就是重点啊,笑一个O∩_∩)O~

1很显然,知道T3一棵spantreef连通了由去掉e而分隔的两部分。

所以同个上面的构造,就构造出了一棵树,这个树是MST同时它比T1更接近于T2多了一条common边)

展开阅读全文

没有更多推荐了,返回首页