证明算法复杂度下界---对手论证(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,即可让他只获得一个信息

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

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

“第二大”问题

问题描述:

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

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

思路:

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

解:

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

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

  1. w(x)>w(y)⇒令x>y  w(x)=w(x)+w(y),w(y)=0w(x)>w(y)\Rightarrow 令x>y\;w(x)=w(x)+w(y),w(y)=0w(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)=0w(y)>w(x)\Rightarrow 令y>x\;w(y)=w(x)+w(y),w(x)=0w(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)=0w(y)=w(x)\Rightarrow 令y>x\;w(y)=w(x)+w(y),w(x)=0w(y)=w(x)⇒令y>xw(y)=w(x)+w(y),w(x)=0

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

综上所述:下界为O(n+logn−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时,我们给出以下反应:

  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(n−1)/2个无关中位数的操作,即无效操作

综上:下界为O(n−12+n−1)=O(3n−32)\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(2n−1)\Omicron(2n-1)O(2n−1)

思路:

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

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

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

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

O(n)查环问题

问题描述

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

思路

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

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

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

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

  1. 证明算法复杂度下界---决策树基础篇

    证明算法复杂度下界---决策树基础篇 几个约定 需要用到的公式 什么是决策树 利用决策树证明比较排序的下界 利用决策树证明Ksorted的下界 题目说明: 解题思路: 答案: 利用决策树证明螺丝螺母问 ...

  2. [算法Tutorial]Adversary Argument,对手论证

    对手论证,一般用于给出问题的下界.若用$P$表示所讨论的问题,$I$表示问题的输入,$A$表示解决问题的基于比较运算的算法,$T(\,A,\,I)$表示对于输入$I$,算法$A$的计算时间复杂性,那么 ...

  3. 区块链共识算法Proof-of-Stake (PoS/权益证明) 常见问题解答 (1)

    Original post: https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ 什么是Proof-of-Stake 权益证明(PoS)是 ...

  4. 算法复杂度:算法时间复杂度和空间复杂度表示法

    文章地址:http://lzw.me/a/algorithm-complexity.html 算法复杂度分为时间复杂度和空间复杂度. 时间复杂度用于度量算法执行的时间长短:而空间复杂度则是用于度量算法 ...

  5. 算法复杂度分析(渐近记号)

    [见解]关于算法复杂度的理解不能只停留在根据代码直接凭感官或者经验直接推测其公式(例如:根据for循环直接推测出一个O(n)复杂度,关于复杂度的理解更应该深入到其所代表的函数空间中去. 1.渐进记号 ...

  6. O(n)级选排名第k位数(附上算法复杂度分析)

    算法简述 如果想要拿到第k位,一般说复杂度都比较高.例如,用快排等方式,要用了O(nlogn)水平的时间复杂度.就算是用快排改进,每次在快排的基础上,只排剩下的一部分,在平均水平上,也会变成了O(nl ...

  7. 【算法分析与设计】浅析算法复杂度

    文章目录 算法复杂度 算法复杂度的求和计算方法 递归算法复杂度的计算方法 证明斐波那契数列递归求解复杂度 算法复杂度 算法复杂度可以用 O ( T ( n ) ) O(T(n)) O(T(n)

  8. 决策树——排序算法的理论下界

    本篇博客属于理论分析,旨在让我们认识到排序算法的最优性能,是存在一个下界的,也就是如果你想问,存不存在一种排序算法时间复杂度为O(n)呢,这篇文章能很好的回答你:对不起,不存在的,那么这个下界到底是多 ...

  9. 算法复杂度及渐进符号

    算法复杂度及渐进符号 一.算法复杂度 每一个程序在运行时,都需要占用一定的计算机资源,比如内存,磁盘,这些称之为空间. 计算过程中需要判断,循环执行某些逻辑,周而反复,这些是时间. 那么我们可以通过算 ...

最新文章

  1. 一款基于jquery和css3的响应式二级导航菜单
  2. 几个关于噪声测量的实验
  3. 服务器系统tcpip.sys,tcpip.sys
  4. (1) 自定义分页采用jsp和Java实现
  5. perl里面隐式的继承
  6. linux工作笔记-linux之间文件传输图形界面工具gftp
  7. Poj_1325 Machine Schedule -最大匹配性质题目
  8. PHP在不同页面间传递Json数据示例代码
  9. 河北科技大学计算机考研率,河北科技大学研究生,河北科技大学考研率!
  10. grub2 引导光盘
  11. iir滤波器c语言程序,请教C语言做iir滤波器问题
  12. 一些好用的免费的截屏、GIF制作的PC端小工具
  13. Linux Ansible自动化运维 set_fact 模块
  14. 图形学知识基础:三维变换,旋转(欧拉角旋转与万向锁,绕任意轴旋转,四元数)
  15. 狂神说的全部笔记_聪明人的方格笔记术
  16. 没有扫描仪如何用PS把照片处理成扫描文件
  17. 弘辽科技:淘宝狂欢大促怎么取消?要怎么做活动?
  18. python 使用摄像头监测心率
  19. uniGUI获取设备信息
  20. 爱帮网遭江苏移动侵权 源自爱帮机器人

热门文章

  1. 【Java基础系列】第3章 流程控制
  2. GEE备忘:Landsat、Sentinel、Modis主要数据集区别
  3. 大疆无人机-图传技术
  4. 什么是无货源店群?具体玩法剖析
  5. cak数控车床是计算机控制吗,CAK3675数控车床夹盘液压系统的设计(附CAD图纸).doc...
  6. C#控制打印机(直接发送打印机命令到打印机)
  7. uni-app 页面横向点击居中
  8. 基于clip-path的任意元素的碎片拼接动效
  9. APP应用营销推广的四种成熟方式
  10. 前端怎样使用base64图片上传到七牛云