一:渐近符号
1.1 符号的辨析
1.1.1 符号 O
定义 如果函数
下图说明了这个定义:
下面给出几个例子:
1.1.2 符号 Ω
定义 如果函数
下图说明了这个定义:
下面给出几个例子:
1.1.3 符号 Θ
读作“theta”。
定义 如果函数
下图说明了这个定义:
下面给出几个例子:
1.2 符号的性质
定理 如果 t1(n)=O(g1(n)) 并且 t2(n)=O(g2(n)) ,则
对于
Ω
和
证明 增长次数的证明是基于以下简单事实:对于
4
个任意实数
因为
t1(n)=O(g1(n))
,存在正常量
c1
和非负整数
n1
,使得:
同样,因为 t2(n)=O(g2(n)) ,
假设 c3=max{c1,c2} 并且 n≥max{n1,n2} ,就可以利用两个不等式的结论将其相加,得出以下结论:
那么,对于两个连续执行部分组成的算法,应该如何应用这个特性呢?它意味着该算法的整体效率是由具有较大增长次数的部分所决定的,即效率较差的部分决定。
二:复杂度求解方法分析
对于一个普通函数(即非递归函数),其时间复杂度自然易求。下面我们主要谈谈如何求解递归函数的时间复杂度。
递归函数通常会有以下的方程式:
其中,
a≥1,b>1
,且都是常数,
f(n)
是渐近正函数。递归式(2.1)描述的是这样一种算法的运行时间:它将规模为
n
的问题分解为
常用的方法有两种:主定理和分治法。
2.1 主定理(Master Theorem)
定理 令 a≥1,b>1 ,且都是常数, f(n) 是一个函数, T(n) 是定义在非负整数上的递归式,即:
其中我们将
nb
解释为
⌊nb⌋
或
⌈nb⌉
。那么
T(n)
有如下渐近界:
(Case 1)如果
f(n)=O(nc)
,其中
c<logba
,则:
(Case 2)如果存在常数 k≥0 ,使 f(n)=Θ(nclogkn) ,其中 c=logba ,则:
(Case 3)如果
f(n)=Ω(nc)
,其中
c>logba
,并且对某个常数
k<1
和所有足够大的
n
有
算法导论已有关于这个定理的证明,故此处省略,有兴趣的读者可以去翻阅下。
2.2 分治法
分治法先把给定的实例划分为若干个较小的实例,对每个实例递归求解,然后如果有必要,再把较小实例的解合并成给定实例的一个解。假设所有较小实例的规模都为
nb
,其中
a
个实例需要实际求解,对于
由于 ak=alogbn=nlogba ,当 n=bk 时,对于式(2.2.7)我们可以推出下式:
显然,
T(n)
的增长次数取决于常数
a
和
三:无意发现的定理
以下是我自己在演算时无意发现的,并给出了证明。
该定理依旧建立在递归方程式中,即:
根据以上的方程式有以下两个定理:
定理1
定理1 对于递归方程式,若 a=1,b>1,f(n)=c,c 为某个常数,即:
则:
证明 应用主定理 Case 2,其中 c=logba=logb1=0 ,再使 k=0 ,则 f(n)=Θ(nclogkn)=Θ(1) ,这里的 f(n) 即等于常数 c ,证明成立。
定理2
定理2 对于递归方程式,若
则:
证明 应用分治法中式(2.2.8):
证明成立。
四:总结
第一部分辨析了
O,Ω,Θ
三种符号的区别以及它们的性质。
第二部分介绍了两种常用的计算时间复杂度方法,即主定理和分治法。
第三部分给出了个人在演算时发现的两个定理,并给出了证明,题外话,这两条定理比较实用,希望读者能够熟记。另外如果您在其它网站看到类似原创定理,纯属巧合,勿喷。
参考文献:
[1] Thomas H.Cormen,etc. 算法导论(第三版).
[2] Anany Levitin. 算法设计与分析基础(第三版).
[3] . Master theorem. Wikipedia.
文章转自我的个人博客:http://www.61mon.com/index.php/archives/176/