主定理的证明及应用举例

主定理

主定理最早出现在《算法导论》中,提供了分治方法带来的递归表达式的渐近复杂度分析。

规模为n的问题通过分治,得到a个规模为n/b的问题,每次递归带来的额外计算为c(n^d)

T(n) <= aT(n/b)+c(n^d)

那么就可以得到问题的复杂度为:

  • T(n) = O(n^d log(n)), if a = b^d
  • T(n) = O(n^d ), if a < b^d
  • T(n) = O(n^logb(a))), if a > b^d

证明方法

本来使用主定理是可以免去画递归树的,但为了证明主定理,还是需要画树。

可见,每次递归把问题分为a个规模为n/b的子问题。从根节点开始,共有logb(n)+1层,叶子节点数为a^(logb(n))。那么,第j层共有a^j个子问题,每个问题规模为n/b^j,每个子问题运算量为c*(n/b^j)^d需要完成的计算量为:

求和得到整个问题的运算量:

那么,根据a与b^d的关系,很容易得到主定理。

应用

二分搜索

  • 每次问题规模减半,a=1,b=2,d=0
  • 复杂度为n^0 log(n) = log(n)。

快速排序

  • 随机选择待排序序列中的一个数字作为划分字问题的标准,划分是否平均影响算法复杂度
  • 每次问题规模减半,a=2,b=2,d=1
  • 复杂度为n^2 log(n)
  • 最差情况下,复杂度为O(n^2)

归并排序

  • 数据列均分为两部分,分别排序,之后以O(n)的复杂度进行合并,空间复杂度O(n)
  • 每次问题规模减半,a=2,b=2,d=1
  • 复杂度为n log(n)

基数排序(Radix sort)

  • 对于待排序的整数序列,从最低位到最高位每次按照相应的位排序一次
  • 每次递归问题规模变为原来的1/10,但需要求解10个子问题,额外运算为O(n)的,a=10,b=10,d=1
  • 复杂度为n^1 log(n) = n log(n),近似为O(kN),k为整数的位数

快速傅里叶变换:FFT

  • 每次问题规模减半,a=2,b=2,d=1
  • 复杂度为n log(n)

Karatsuba快速乘法

  • 正常两个n位数乘法为n^2
  • 算法把两个乘数各分为高低位两部分,如X*Y = (a+b) * (c+d) = ac+bd + (bc+ad) = ac+bd+(ac+bd - (a-b)(c-d))
  • 只需要ac,bd,(a-b)(c-d)三次乘法
  • 每次问题规模减半,但需要解3个子问题,加法是O(n)的,a=3,b=2,d=1
  • 复杂度为n^log2(3)

转载请注明作者:Focustc,博客地址为http://blog.csdn.net/caozhk,原文链接为点击打开

时间: 2024-07-30 19:47:26

主定理的证明及应用举例的相关文章

胡搞主定理

今天看算导,看到主定理这一块各种渐进.多项式大于小于什么的让我拙计,现在分享一下. 所谓主定理,就是用来解递归方程的一种方法,此方法可以用来求解大多数递归方程. 设递归方程为T(n)=aT(n/b)+f(n)  (其中a≥1,b>1) 主定理: (1)如果存在常数ε>0有f(n)=O(n^(logb^a-ε)),则T(n)=Θ(n^(logb^a)): (2)若f(n)=Θ(n^(logb^a)),则T(n)=Θ(n^(logb^a)logn2^n): (3)若对某个常数ε>0有f(n)

主定理 推导

本文首先讲解递归式的迭代求解方法,然后给出主定理的推导过程.(该推导过程是我为了好记主定理的推导过程,建议读者手动推导,当然如有错误,请交流指正) 本文是 算法导论课程的复习主定理部分: 1.递归式的迭代求解

主定理 - 算法导论摘录

主定理常用于计算递推式的时间复杂度.

Computer Science Theory for the Information Age-6: 学习理论——VC定理的证明

VC定理的证明 本文讨论VC理论的证明,其主要内容就是证明VC理论的两个定理,所以内容非常的枯燥,但对于充实一下自己的理论知识也是有帮助的.另外,VC理论属于比较难也比较抽象的知识,所以我总结的这些证明难免会有一些错误,希望各位能够帮我指出. (一)简单版本的VC理论. 给定一个集合系统$(U,\mathcal{S})$,VC理论可以解决以下问题.对于一个在$U$上的分布$P$,那么至少需要选择多少个样本(根据分布$P$选择),才能使对每个$S\in\mathcal{S}$,用样本估计出来的值以

《University Calculus》-chaper8-无穷序列和无穷级数-泰勒定理的证明

泰勒定理: 证明:

主定理

(摘自<算法导论>) 主定理: 若T(n)由递归式T(n)=aT(n/b)+f(n)对非负整数定义,其中a≥1,b>1为常数,f(n)为一函数,则: \[T(n) = \left\{ \begin{array}{l}\Theta ({n^{{{\log }_b}a}}),\exists \varepsilon > 0,f(n) = O({n^{{{\log }_b}a - \varepsilon }})\\\Theta ({n^{{{\log }_b}a}}\lg n),f(n)

【20171105】主定理的基本解释整合

在算法分析中,主定理(英语:master theorem)提供了用 渐近符号 表示许多由 分治法 得到的递推关系式的方法. 此方法经由经典算法教科书<算法导论>而为人熟知.不过,并非所有递推关系式都可应用主定理.该定理的推广形式包括Akra-Bazzi定理. 内容 假设有递推关系式 , 其中为 问题规模, 为递推的子 问题数量, 为 每个子问题的规模(假设每个子问题的规模基本一样), 为 递推以外 进行的 计算工作. a≥1,b>1为常数,f(n) 为函数,T(n) 为非负整数. 则有以

费马小定理的证明

数论: 1.费马小定理: mod:a mod p就是a除以p的余数 费马小定理:a^(p-1)≡1(mod p) 前提:p为质数,且a,p互质 互质:a和p相同的因数为1. 先来看一下≡是什么: a≡b(mod p) <=> a mod p=b mod p 注释:<=> 两边相等 在证明之前,先给出引理: (1)如果p,c互质,并且a*c≡b*c(mod p) 证明过程: ∵a*c mod p = b*c mod p ∴(a*c - b*c) mod p = 0 ∴(a-b)*c

【转】主定理

主定理 参考博客如标题 自己的傻b理解 对于我这种应付考试的人,可以直接代入几个特殊值... 只需要知道: 符号\(O\),读音殴,表示上界,小于等于,贴紧未知. 找好特殊值 对于简单的(如:O(n), 又如下面的例题3),自己推就行 博客原文如下 先介绍几个符号的含义. 符号\(Θ\),读音西塔,既是上界也是下界,等于,严格贴紧. 符号\(O\),读音殴,表示上界,小于等于,贴紧未知. 符号\(o\),读音也是殴,小于,不贴紧. 符号\(Ω\),读音偶眯嘎,表示下界,大于等于,贴紧未知. 符号