证明算法复杂度下界---对手论证(adversary argument)
什么是对手论证?
将算法设计者与算法分析者看作对手,同时扮演两个角色进行算法分析。
- 算法设计者:尽量多的创造更多信息
- 算法分析者:尽量少的给予信息,拥有着
随时合理改变取值
的能力
只有这二者做到极致,对手论证才能成立。
注:从分析者的角度可以忽视很多细节,凑出题目所要求的大小即可
从同大小问题引入
问题描述:
给定数列,设计算法输出最大值和最小值,并给出该问题的算法复杂度下界
思路
默认关键操作为比较
每个元素可能有四种状态:W,L,N,W/L,代表曾经在某次比较中胜出
,败北
,没有经历过比较
,胜出和败北都经历过
,
由于W/L的元素一定不是max/min,所以最终一定是处于两个元素W,L,其余元素W/L的情形
需要获得的信息总量:
- n个元素都要从N到W or L n个信息
- n-2个元素要从W到W/L n-2个信息
- 共计2n-2个
于是我们的对手策略设计如下:
- 比较
N:N
,结果必然是W,L
(L,W与之等价),设计者获得两个信息,分析者无法改变这一事实 - 比较
W,L
,分析者让其继续为w,L
即可让他徒劳无获 - 比较
W,W
,结果必然是W,W/L
分析者无法改变这一事实 - 比较
W,N
,分析者让他是W,L
,即可让他只获得一个信息
需要获得的总信息量最少是 2 n − 2 2n-2 2n−2
而我们上面的分析可知,最少需
n
2
+
n
−
2
\frac{n}{2}+n-2
2n+n−2次比较才能获得那么多的信息量
于是下界为
O
(
3
n
2
−
2
)
\Omicron(\frac{3n}{2}-2)
O(23n−2)
“第二大”问题
问题描述:
问题:选出一个数列的第二大元素
给出该问题的算法复杂度下界
思路:
- 想选出第二大,必先选出第一大(n-1)
- 第二大只有可能是直接输给第一大的那些人里面的人
解:
结论:任何算法都至少要经过
O
(
n
+
l
o
g
n
−
2
)
\Omicron(n+logn-2)
O(n+logn−2)步才能得出正确得第二大元素
想选出第二大,必先选出第一大(n-1)
我们给每个点初始化一个权重w(i)=1
,并且每当算法进行比较x:y
时,我们给出如下反应(赋值):
- 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
- 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 ( 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+logn−2)
中位数问题
问题描述:
选出一个数列的中位数
证明该问题的算法复杂度下界为 O ( n ) \Omicron(n) O(n)
思路:
要使得算法能够找到中位数,算法必须至少要做n-1个和中位数有关的比较,我们定义这种比较为有效比较,我们将参杂 ( n − 1 ) 2 \frac{(n-1)}{2} 2(n−1)个无效比较,具体做法:
定义L:所有比中位数大的集合,S:所有比中位数小的集合
每当算法进行比较x:y
时,我们给出以下反应:
- N,N ⇒ \Rightarrow ⇒L,S
- L,N/S,N
⇒
\Rightarrow
⇒L,S/S,L,且定死:最后一个具有属性
N
的是中位数
那么要将所有N分配到L和S至少需要 ( n − 1 ) / 2 (n-1)/2 (n−1)/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(2n−1+n−1)=O(23n−3)
有序矩阵搜索问题
问题描述
一个n*n矩阵,其每行元素从左到右升序排序,每列元素自上而下升序排序,现给一个数k,找到k在矩阵中的位置
证明改问题的算法复杂度下界为 O ( 2 n − 1 ) \Omicron(2n-1) O(2n−1)
思路:
该矩阵的每一个斜对角线都是一个等价类,之间无任何关系,因此我们的对手策略就很清晰了:
将算法逼到最中间的那两条线上(这两条斜对角线元素之和为2n-1),无论如何算法都要比较这两条斜对角线即可,我们将在上面的斜对角线记为l1,另一条记为l2.
假定算法选定的元素为u,目标是k,策略如下:
- 若u在两条斜对角线之下的某条斜对角线,则u>k。
- 若u在两条斜对角线之上的某条斜对角线,则u<k。
- 若u在l1上且还没有比完l2上所有元素,则u<k.
- 若u在l2上且还没有比完l1上所有元素,则u>k.
经过以上策略,算法一定会到达l1,l2并将其元素尽数比完,问题下界即 O ( 2 n − 1 ) O(2n-1) O(2n−1)
O(n)查环问题
问题描述
给定一图G,请证明不可能在O(v)时间内完成判断:图中是否存在一个环
思路
假设存在一个O(n)算法,则对于算法的每次询问(u,v)是否存在边e,做以下的对抗策略:
- 若e的存在使得G中成环,则回答不存在边e
- 否则回答存在边e
这样,当算法给出答案“有环”时,实际上图中无环
当算法给出答案“无环”时,实际上将算法未询问的边加入G中,共加入
O
(
n
2
−
n
)
=
O
(
n
2
)
O(n^2-n)=O(n^2)
O(n2−n)=O(n2)条边,必然成环,这样图中又有环,于是算法不能给出正确答案,命题得证