贪心算法正确性证明


为了方便观看,本文章会把命题放在每一个证明步骤中

1. 活动选择问题

1.1命题

在这里插入图片描述

1.2 证明

令S = {1,2,…,n}是活动集,且f1 <= … <= fn
也就是说,S这个活动集是按照活动结束时间排好序的

1.2.1 归纳基础

命题
命题

  • 证明:k = 1的时候,命题成立

    • 即证明:k = 1的时候,证明存在最优解包含待选活动集合中的第一个活动,即结束时间最早的那个活动
  • 最重要的一点!!!该归纳基础不是直接证明我们选的第一个活动就是最优解的第一个活动,而是要证明,排好序的活动中(按结束时间排好序的活动中)第一个活动(结束时间最早的活动)在最优解里面

  • 因为最优解里面可能不含有结束时间最早的这个活动,所以要证明这个归纳基础

  • 因为最优解可能不只一个,所以是存在最优解包含第一个活动

通过这个归纳基础,我们可以简单的认为,任何一个最优解best都包含待选集合中的第一个活动(如果不包含也可以将best中的第一个元素替换成待选集合中的第一个元素)(举个例子,现在有一个最优解为{i2,i4,i7},那么i2可以用i1来替换,集合{i1,i4,i7}也一定是最优解)

证明:
在这里插入图片描述

  • 如果最优解中的第一个活动不是S集合中的第一个活动,那么一定可以用S集合中的第一个元素替换掉最优解中的第一个元素

1.2.2 归纳步骤

命题
在这里插入图片描述

  • 假设命题对k为真,证明对k+1也为真
    • 假设命题对k为真:假设算法到第k步,会有一个实际上的最优解A包含我们通过算法选择的i1,i2到ik这些活动
    • 证明对k+1也为真:证明算法到第k+1步,会有一个实际上的最优解A包含我们通过算法选择的i1,i2到ik,ik+1这些活动

证明

  1. 由命题对k为真知:

    • 最优解A包含i1=1,i2,…,ik,那么除去前k步选的活动,最优解A中还应该有一些活动,为了方便引用,我们给最优解A中剩下的这些活动集合记作B集合,那么我们的最优解A也可以表示为A = {i1,i2,…,ik}∪B (记住这个,下一段就要用到),B集合里的活动是从哪里挑的呢?我们把B集合的来源记作集合S’,那么S’中的集合中的元素至少是从ik+1开始的(待选集合中的第一个元素就是ik+1,这个要记住,后面要用到),我们可以表示为S’ = {i|i∈S,si>= fk}
    • 我们还可以知道:集合B为S’的最优解
      证明集合B为S’的最优解:
      假设B不是S’的最优解,那么S’的最优解肯定另有其人,为了方便引用,我们给这个最优解记作B ,那么因为B 才是最优解,所以B 集合里面的元素个数肯定要比B的多,所以最优解A应该变成A = {i1,i2,…,ik}∪B,但是,因为我们通过对“命题对k成立“”知道最优解A应该为A = {i1,i2,…,ik}∪B,所以集合B就是S’的最优解
  2. 要证明命题对k+1成立,即证明最优解A中不但包含i1,i2,…,ik,还要包含ik+1,因为我们假设命题对k正确,所以现在只需要证明ik+1在最优解A里面就行了

    • 证明这个还需要记得三个事
      • 归纳基础中:最优解包含待选集合中的第一个活动
      • 命题k正确时:集合B是S’的最优解,S’的第一个元素为ik+1
      • 最优解A的表达式:A的表达式(A = {i1,i2,…,ik}∪B)

    证明

因为集合B是S’的最优解,且S’的第一个元素为ik+1,所以集合B中包含元素ik+1(因为由归纳基础我们知道最优解包含待选集合中的第一个活动)
然后再看最优解A的表达式,我们要证明ik+1在最优解A里面,不就是要证明ik+1在集合B里面,所以证明成立

2. Huffman算法

2.1 命题

在这里插入图片描述
即用Huffman得到的平均传输位数B最小(B = 所有节点的 频率×深度 之和
在这里插入图片描述

2.2 证明

要证明这个定理,我们需要先证明两个引理

2.2.1 引理一

在这里插入图片描述

  • 意思就是说:x和y是出现频率最小和次小的两个字符,那么最优的二元前缀编码中肯定会有这样的情况:这两个字符的编码是等长的且只有最后一位不同(比如x编码001,y编码000,实际上如果是在Huffman树上表示的话就是x和y互为亲兄弟
    在这里插入图片描述
    证明
    设有这样一棵最优树T,它的平均传输位数记为B
    在这里插入图片描述
    我们可以把x和a替换y和b替换,得到一棵新的树T’,它的平均传输位数记作B’
    在这里插入图片描述
    那么换了之后,通过数学证明的结论为:B(T’) <= B(T)。即换了之后的这个树T’不会比最优树差,所以换了之后的这个树也是最优树,(这个才是这个重点:这个树也是最优树,不要钻牛角尖去思考为什么T已经是最优树了还会有不比T差的树,实际上,因为它俩都是最优树,所以B(T)和B(T’)只能相等不会出现B(T’)比B(T)小的情况
    • 数学证明
      在这里插入图片描述
      两棵树只有x,y,a,b四个节点不一样,对比这四个节点对应的传输位数即可

2.2.2 引理二


即对于树T,把叶节点x和y去掉(互为兄弟,且频率分别为f(x),f(y)),得到的新的树的平均传输位数为B(T’),满足这样一个等式的关系:B(T) = B(T’) + f(x) + f(y)
证明
在这里插入图片描述
x的深度 = y的深度 = z的深度 + 1
我们可以把平均传输位数看作 x与y其他叶子结点 的平均传输位数来算,将x的深度y的深度替换成z的深度,在合并同类项就可以得到结果

2.2.3 归纳基础

命题
在这里插入图片描述
在这里插入图片描述
即只有两个字符的字符集,算法可以得到最优前缀编码,显然成立

2.2.4 归纳步骤

命题
在这里插入图片描述

  • 假设Huffman算法对规模为k的字符集能够得到最优前缀编码,我们要证明该算法对规模为k+1的字符集也可以得到

证明

  1. 我们先考虑规模为k+1的情况:输入字符集C:C = {x1,x2,…,xk+1},其中x1,x2为频率最小的两个字符 。因为我们假设的是当规模为k的字符集该算法成立,所以我们要尽量将该字符集的大小削减为k

    • 用前面的引理来削减
      C’ = (C - {x1,x2})∪{z},fz = f(x1) + f(x2),那么此时,C’的规模就是k大小的!!!,所以,此时,我们可以用算法得到一个关于字符集C’的最优树T’(规模为k)
      这里一定要记得这个结论:字符集C’的最优树为T’
    • 树T’ 中,把x1,x2再添到z的下面,记作现在得到的树为T
      在这里插入图片描述
      那么我们可以写出T这棵树对应的字符集为 C’ - {z}∪{x1,x2},即C - {x1,x2})∪{z} - {z}∪{x1,x2} = C!!!这个树T对应的字符集刚好就是规模为k+1的字符集C!!!那现在只需要证明T这个树就是最优前缀二叉树就行了
  2. 还是反证法:我们假设树T不是字符集C的最优树,那么一定还会有其他的更优的树,我们把更优的树记作T,则B(T) < B(T)

    • 由引理1知道,最优树里面会有互为兄弟的两个叶节点,在这个规模为k+1的最优树T,这两个叶节点即为x1和x2
    • 现在我们要在去掉T中的x1和x2,此时得到的树记为T’,此时我们可以得到一个方程式:
      B(T’)
      = B(T) - (f(x1) +f(x2))
      <B(T) - (f(x1) + f(x2))

      还记得T这棵树是怎么来的吗,这里再把那张图放在这看
      在这里插入图片描述
      所以反过来,T去掉f(x1)和f(x2)得到的树刚好是T’
      B(T) - (f(x1) + f(x2)) = B(T’)这时别忘了前面已经证明了T’是规模为k的最优树
      接着写那个方程
      B(T’)
      = B(T) - (f(x1) +f(x2))
      <B(T) - (f(x1) + f(x2)) = B(T’)

      B(T’) < B(T’)
      因为T’已经是最优树了,所以不会再有比T’更好的树了,所以这个结论不成立,即树T不是字符集C的最优树不成立,那么T就是字符集C的最优树

    3.Prim算法

    3.1命题

    3.1.1 算法思想

  • 先在这里给出算法的设计思想,以方便后面的证明
    在这里插入图片描述
    即我们把一个图分为两个部分:S部分和V-S部分,S部分代表已经遍历到的节点,V-S代表还没有遍历到的节点,那么S部分和V-S部分肯定有连接的边,我们每次都从中挑选权值最小的边当做树边,并且把这个树边的顶点加入到已经遍历到的节点中,即加入到S集合中
    例:有这样一个图
    在这里插入图片描述
    第一步:
    在这里插入图片描述
    第二步:
    在这里插入图片描述
    第三步:
    在这里插入图片描述
    第四步:
    在这里插入图片描述
    第五步:
    在这里插入图片描述
    第六步:
    在这里插入图片描述

3.1.2 我们要证明正确性的命题: 在这里插入图片描述

  • 为什么k要小于n呢?
    我们每执行一步算法,就会得到一条边;而如果一个图有n个顶点,那它的生成树只会有n-1条边,所以若算法是正确的,那算法只用执行n-1步就可以得到一棵最小生成树,即k最大为n-1,不会超过n
  • 我们要证明Prim算法是正确的,那我们直接证明:通过Prim得到的树为最小生成树不就行了嘛?
    要用到数学归纳法,一般来说先是k = 1,然后假设k = k时算法能够得到正确的,然后证明k = k+1也正确,所以要有明确的算法执行步骤,方便使用数学归纳法,所以我们在命题中加入了算法执行的步骤:k

3.2 证明

3.2.1 归纳基础

在这里插入图片描述
证明
在这里插入图片描述

  • 假设最小生成树里面不包含{1,i},那么因为我们的算法是每一次挑的边都是权值最小的边,所以{1,i}的权值一定是与节点1相连的边的最小的一条边,即如果用{1,i}替换{1,j},那 {1,i}的权值一定比{1,j}的权值小,这样在数学上会推导出来:换了边整棵树的权值W(T’)<= 原来假设的最优生成树的权值W(T)(实际上,小于等于也只是数学推导的,因为我们的假设就是T本来就是一棵最小生成树,所以这个不等式只会相等),所以T’也是一棵最小生成树,所以一定存在这么一棵最小生成树包含我们算法选择的第一条边

3.2.2 归纳步骤

先假设算法运行到第k步命题正确,然后在证明算法运行到第k+1步也正确

  1. 假设算法运行到第k步正确
    在这里插入图片描述
  2. 现在算法又运行一步,共运行了k+1步,那么最新的这一步又会选择一条边ek+1,又会包括一条新的顶点ik+1
  3. 把现在分为两种情况:新选择的这条边仍然是
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值