您的位置:首页 > 其它

麻省理工大学公开课笔记:算法导论(三)——渐近符号、递归及解法

2017-09-20 10:44 330 查看

渐进符号

O符号

形式化定义

f(n)=O(g(n))表示存在常数c>0, n0>0,使得对于所有的的n>n0,有

0⩽f(n)⩽cg(n)

例子:2n2=O(n3)

直观理解

和“小于或等于”类似。去掉首项系数(此处为2)和低阶项(此处无低阶项)之后,剩下的部分小于或等于n3

注意

O并不是对称的。不能说n3≠O(n2),甚至也不能说O(n3)=n2

集合定义

O(g(n))={f(n):存在常数c>0,n0>0,使得对于所有的n>n0,都有0⩽f(n)⩽cg(n)}

因此,不能简单理解2n2与O(n3)是“相等”的,而应该理解为2n2属于函数集O(n3)(2(n2)∈O(n3))

出现在公式中的集合符号(如O)表示集合中的某一个函数,而不是集合整体。

例1:f(n)=n3+O(n2)

直观理解:表示了一个误差界限,即f(n)主要是由n3构成的,但也有一些O(n2)的低阶项

实际含义:存在一个函数h(n)∈O(n2),使得f(n)=n3+h(n)

例2:n2+O(n)=O(n2)

直观理解:“=”应该理解成“是”,而不是“等于”。等号左边隐含任意量词,等号右边隐含存在量词,

实际含义:对于任意函数f(n)∈O(n),总存在函数h(n)∈O(n2),使得n2+f(n)=h(n)

用途: 如果有很长的“等式链”,第一个就等于最后一个(只能从左到右,因为O是非对称的)

Ω符号

集合定义

Ω(g(n))={f(n):存在常数c>0,n0>0,使得对于所有的n>n0,都有0⩽cg(n)⩽f(n)}

例:n√=Ω(lgn)

直观理解: 对于充分大的n,n√至少是Ω(lgn)的常数倍。

Θ符号

Θ(g(n))=Ω(g(n))∩O(g(n))

例:

n2=Θ(n2)

n2+O(n)=Θ(n2)

o和ω符号

更“严格的”O和Ω,不等式需要对所有的c成立,而不仅仅是一个特定的c

o(g(n))={f(n):对于所有常数c>0,总存在n0>0,使得对于所有的n>n0,都有0⩽f(n)⩽cg(n)}

ω(g(n))={f(n):对于所有常数c>0,总存在n0>0,使得对于所有的n>n0,都有0⩽cg(n)⩽f(n)}

在这种情况下,n0依赖于c

例:

2n2=O(n3)

12n2=Θ(n2)≠o(n2)≠ω(n2)

类比

OΩΘoω
=<>

解递归式

至今为止,求解递归式还没有一种通用的方法。

代换法

猜出解的形式(n2/n3…)

通过数学归纳法验证

求解常数系数

例:

T(n)=4T(n2)+n

[T(1)=Θ(1)]

观察:由T(n)=4T(n2)可知(忽略n),当n翻倍时,T(n)会变为原来的4倍。

猜想:Θ(n2)(直接证明Θ(n2)很难,先证明Θ(n3))

证明T(n)=O(n3)

猜想:T(n)=O(n3)

假设:k<n时,T(k)⩽ck3

注意:代换法中不能使用O符号,因此需要用常数c来展开

原因(较高层次):如果有一个有限项的大O关系序列,例如n2=O(n3)=O(n4)=O(n4),由传递性可知n2=O(n4),但如果大O关系序列是无限的,那么第一项不一定等于最后一项

例:假如想证明n=O(1)(这显然是不对的,否则所有算法都将是常数复杂度),但却可以通过数学归纳法证明,如下:

1=O(1)

假设n−1=O(1)

由于n=(n−1)+1,由假设,n−1=O(1),且已知1=O(1),所以总体是O(1)

错误原因:证明过程中O(1)所代表的常数是变化的,每次O(1)与O(1)相加,都可能把O(1)加倍,如果是常数次的加倍,那么最终结果仍然是O(1),但如果是n次加倍,结果将从O(1)变为O(n)

结论:不能在O符号上进行归纳,代换法中需要用常数c来展开(保证不会在归纳过程中发生变化)

推导

T(n)=4T(n2)+n⩽4c(n2)3+n=12cn3+n=cn3−(12cn3−n)⩽cn3(if12cn3−n⩾0)当c⩾1,n⩾1时不等式成立

最基本的情况:T(1)=Θ(1)⩽c∗13,当c⩾T(1)时成立

可知,T(n)=O(n3),但这并不是一个严格的上界,严格的上界还有可能是O(n2)。

证明T(n)=O(n2)

猜想:T(n)=O(n2)

假设:k<n时,T(k)⩽ck2

推导(仿照上面的过程)

T(n)=4T(n2)+n⩽4c(n2)2+n=cn2+n=cn2−(−n)⩽cn2(if(−n)⩾0)想要让(−n)非负是很难的

改进归纳假设

假设当k<n时T(n)⩽c1k2−c2k

推导

T(n)=4T(n2)+n⩽4(c1(n2)2−c2(n2))+n=c1n2+(1−2c2)n=c1n2−c2n−(−1+c2)n⩽c1n2−c2n(if(c2−1)⩾0)

最基本的情况:T(1)⩽c1−c2,由于T(1)=Θ(1),是一个常数,因此需要c1⩾T(1)+c2

递归树法

例:T(n)=T(n4)+T(n2)+n2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法导论