分类: Java
2014-01-13 14:58:00
用来算法的渐近运行时间的符号是用定义域为自然集N={0,1,2,3,…,n}的函数定义的。
1、Θ符号
定义:对一个给定的函数g(n),用Θ(g(n))来表示函数的集合:
Θ(g(n)) = {f(n):存在正常数c1,,c2和n0,使对所有的n≥n0,有0≤c1g(n) ≤f(n) ≤c2g(n) },对于任意一个函数f(n),若存在正常数c1,,c2,使得当n充分大时,f(n)能被夹在c1g(n)和c2g(n)中间,则f(n)属于集合Θ(g(n))。
通常这种关系表示为“f(n)= Θ(g(n))”,可以理解为f(n)是Θ(g(n))的元素,既存在数学关系:f(n) ∈Θ(g(n))。对于Θ(g(n))的每个成员必须是渐近非负的,既n足够大时f(n)是非负的,同时g(n)也是非负的。
例如:假设某个算法的时间复杂度为是以n为变量的函数 f(n)=3n2 - 4n + 1,现在我们需要证明f(n)= Θ(n2),既:该算法的时间复杂度为Θ(n2)。
证明:由上得:f(n)= 3n2 - 4n + 1,c1,和c2都为正常数,g(n)=n2,,且0≤c1g(n) ≤f(n) ≤c2g(n),则存在:
c1n2≤3n2 - 4n + 1 ≤c2n2
两边都除以n2,得
c1≤ 3- 4/n + 1/n2 ≤c2
则左边取c1≤5/4,对于所有n≥2均成立;
同理右边取c2≥0,对于所有n≥1均成立。
则n0可以取值为2;固可以证明:3n2 - 4n + 1=Θ(n2)。
简单来说,对于c1≤ 3- 4/n + 1/n2 ≤c2 可以理解为当n无限大时,3- 4/n + 1/n2 趋近于一个常数,当n趋近于n0(某个常数)时,3- 4/n + 1/n2 也趋近于一个常数。
f(n)=3n2 - 4n + 1,f(n)= Θ(n3)是否成立。
同理得:c1 n3≤3n2 - 4n + 1 ≤c2 n3
得: c1≤ 3/n- 4/n2 + 1/n3 ≤c2
此时3/n- 4/n2 + 1/n3随着n的变化而,不成立。
2、O符号
Θ符号是给出函数的的上界和下界的,现在我们更关心的是函数的上界。
定义:O(g(n)) = {f(n):存在常数c和n0,使对所有的n≥n0,有0≤f(n) ≤cg(n)}
证明忽。
注意,函数Θ(n2)是O(g(n))的一个集合。
O符号常用于表示一个算法的最坏情况。
3、Ω符号
O表示一个算法的最坏情况,则Ω通常标示一个算法的最佳情况。
定义:
Ω(g(n)) = {f(n): 存在常数c和n0,使对所有的n≥n0,有0≤cg(n) ≤f(n)}
证明略。
定理:对于任意两个函数,f(n)和g(n),f(n)= Θ(g(n),当且仅当f(n)=O(g(n)和
f(n)= Ω(g(n))。
可以使用集合来理解,由于O(g(n))表示上界,Ω(g(n))表示下界,则Θ(g(n)是夹在中间的集合。
总结,对于算法中的这三个符号是常用的三个符号。lz看一些算法书时候,常常不知道这些公式怎么得来,所以翻了一些资料,参考了《算法导论》、《计算机程序设计》等书籍。对于这三个符号的介绍,lz只是做了肤浅的简介,一些入门级的简介,如果需要深入了解的可以去参考《算法导论》、《计算机程序设计》,这些书籍是经典中的经典。通常会涉及到一些数学逻辑以及数学推理。
(注:大神手下留情,如果出错,望指出错误)