证明算法复杂度下界---对手论证(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</