算法复杂度下界证明---对手论证(adversary argument)基础篇

证明算法复杂度下界---对手论证(adversary argument)

  • 什么是对手论证?
  • 从同大小问题引入
    • 问题描述:
    • 思路
  • “第二大”问题
    • 问题描述:
    • 思路:
    • 解:
  • 中位数问题
    • 问题描述:
    • 思路:
  • 有序矩阵搜索问题
    • 问题描述
    • 思路:
  • O(n)查环问题
    • 问题描述
    • 思路

什么是对手论证?

将算法设计者与算法分析者看作对手,同时扮演两个角色进行算法分析。

  1. 算法设计者:尽量多的创造更多信息
  2. 算法分析者:尽量少的给予信息,拥有着随时合理改变取值的能力

只有这二者做到极致,对手论证才能成立。

注:从分析者的角度可以忽视很多细节,凑出题目所要求的大小即可

从同大小问题引入

问题描述:

给定数列,设计算法输出最大值和最小值,并给出该问题的算法复杂度下界

思路

默认关键操作为比较
每个元素可能有四种状态:W,L,N,W/L,代表曾经在某次比较中胜出败北没有经历过比较胜出和败北都经历过
由于W/L的元素一定不是max/min,所以最终一定是处于两个元素W,L,其余元素W/L的情形
需要获得的信息总量:

  1. n个元素都要从N到W or L n个信息
  2. n-2个元素要从W到W/L n-2个信息
  3. 共计2n-2个

于是我们的对手策略设计如下:

  1. 比较N:N,结果必然是W,L(L,W与之等价),设计者获得两个信息,分析者无法改变这一事实
  2. 比较W,L,分析者让其继续为w,L即可让他徒劳无获
  3. 比较W,W,结果必然是W,W/L分析者无法改变这一事实
  4. 比较W,N,分析者让他是W,L,即可让他只获得一个信息

需要获得的总信息量最少是 2 n − 2 2n-2 2n2

而我们上面的分析可知,最少需 n 2 + n − 2 \frac{n}{2}+n-2 2n+n2次比较才能获得那么多的信息量
于是下界为 O ( 3 n 2 − 2 ) \Omicron(\frac{3n}{2}-2) O(23n2)

“第二大”问题

问题描述:

问题:选出一个数列的第二大元素

给出该问题的算法复杂度下界

思路:

  1. 想选出第二大,必先选出第一大(n-1)
  2. 第二大只有可能是直接输给第一大的那些人里面的人

解:

结论:任何算法都至少要经过 O ( n + l o g n − 2 ) \Omicron(n+logn-2) O(n+logn2)步才能得出正确得第二大元素
想选出第二大,必先选出第一大(n-1)

我们给每个点初始化一个权重w(i)=1,并且每当算法进行比较x:y时,我们给出如下反应(赋值):

  1. w ( x ) > w ( y ) ⇒ 令 x > y    w ( x ) = w ( x ) + w ( y ) , w ( y ) = 0 w(x)>w(y)\Rightarrow 令x>y\;w(x)=w(x)+w(y),w(y)=0 w(x)>w(y)x>yw(x)=w(x)+w(y),w(y)=0
  2. w ( y ) > w ( x ) ⇒ 令 y > x    w ( y ) = w ( x ) + w ( y ) , w ( x ) = 0 w(y)>w(x)\Rightarrow 令y>x\;w(y)=w(x)+w(y),w(x)=0 w(y)>w(x)y>xw(y)=w(x)+w(y),w(x)=0
  3. w ( y ) = w ( x ) ⇒ 令 y > x    w ( y ) = w ( x ) + w ( y ) , w ( x ) = 0 w(y)=w(x)\Rightarrow 令y>x\;w(y)=w(x)+w(y),w(x)=0 w(y)=w(x)y>xw(y)=w(x)+w(y),w(x)=0

基于上述反应,可以看到每一次的更新都不会使得权重翻倍,因此对于最大元素w(x)=n,其至少更新了log(n)次,即至少有log(n)个直接输给最大元素的家伙,从它们之中选出最大:logn-1

综上所述:下界为 O ( n + l o g n − 2 ) \Omicron(n+logn-2) O(n+logn2)

中位数问题

问题描述:

选出一个数列的中位数

证明该问题的算法复杂度下界为 O ( n ) \Omicron(n) O(n)

思路:

要使得算法能够找到中位数,算法必须至少要做n-1个和中位数有关的比较,我们定义这种比较为有效比较,我们将参杂 ( n − 1 ) 2 \frac{(n-1)}{2} 2(n1)个无效比较,具体做法:

定义L:所有比中位数大的集合,S:所有比中位数小的集合
每当算法进行比较x:y时,我们给出以下反应:

  1. N,N ⇒ \Rightarrow L,S
  2. L,N/S,N ⇒ \Rightarrow L,S/S,L,且定死:最后一个具有属性N的是中位数

那么要将所有N分配到L和S至少需要 ( n − 1 ) / 2 (n-1)/2 (n1)/2个无关中位数的操作,即无效操作

综上:下界为 O ( n − 1 2 + n − 1 ) = O ( 3 n − 3 2 ) \Omicron(\frac{n-1}{2}+n-1)=\Omicron(\frac{3n-3}{2}) O(2n1+n1)=O(23n3)

有序矩阵搜索问题

问题描述

一个n*n矩阵,其每行元素从左到右升序排序,每列元素自上而下升序排序,现给一个数k,找到k在矩阵中的位置

证明改问题的算法复杂度下界为 O ( 2 n − 1 ) \Omicron(2n-1) O(2n1)

思路:

该矩阵的每一个斜对角线都是一个等价类,之间无任何关系,因此我们的对手策略就很清晰了:

将算法逼到最中间的那两条线上(这两条斜对角线元素之和为2n-1),无论如何算法都要比较这两条斜对角线即可,我们将在上面的斜对角线记为l1,另一条记为l2.

假定算法选定的元素为u,目标是k,策略如下:

  1. 若u在两条斜对角线之下的某条斜对角线,则u>k。
  2. 若u在两条斜对角线之上的某条斜对角线,则u
  3. 若u在l1上且还没有比完l2上所有元素,则u
  4. 若u在l2上且还没有比完l1上所有元素,则u>k.
    经过以上策略,算法一定会到达l1,l2并将其元素尽数比完,问题下界即 O ( 2 n − 1 ) O(2n-1) O(2n1)

O(n)查环问题

问题描述

给定一图G,请证明不可能在O(v)时间内完成判断:图中是否存在一个环

思路

假设存在一个O(n)算法,则对于算法的每次询问(u,v)是否存在边e,做以下的对抗策略:

  1. 若e的存在使得G中成环,则回答不存在边e
  2. 否则回答存在边e

这样,当算法给出答案“有环”时,实际上图中无环
当算法给出答案“无环”时,实际上将算法未询问的边加入G中,共加入 O ( n 2 − n ) = O ( n 2 ) O(n^2-n)=O(n^2) O(n2n)=O(n2)条边,必然成环,这样图中又有环,于是算法不能给出正确答案,命题得证

你可能感兴趣的:(算法,对手论证)