时间复杂度量,大O表示法复习总结

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

?一. 简介

???

?1.1 大O表示法

??????????1.1.1 定义

??????????1.1.2 用大O来表述

??????????1.1.3 加法规则

??????????1.1.4 乘法规则

??????????1.1.5 一个特例

??????????1.1.6 一个经验规则

?

版本:1.0

作者:Soundboy

日期:2004-8-26

备注:本文是学习数据结构的大O表示法的学习笔记?

一. 简介

做了几年程序,感觉基本的东西很多还不熟悉,所以重新补充数据结构知识。

1.1 大O表示法

上学的时候就学习了大O表示法表示一个算法的效率,也大概明白怎么回事,知道如果没有循环的一段程序的复杂度是常数,一层循环的复杂度是O(n),两层循环的复杂度是O(n^2)? (我用^2表示平方,同理 ^3表示立方)。但是一直对于严格的定义和用法稀里糊涂。

1.1.1 定义

设一个程序的时间复杂度用一个函数 T(n) 来表示,对于一个查找算法,如下:

int seqsearch( int a[], const int n, const int x)

{

int i = 0;

for (; a[i] != x && i

if ( i == n) return -1;

else return i;

}

这个程序是将输入的数值顺序地与数组中地元素逐个比较,找出与之相等地元素。

在第一个元素就找到需要比较一次,在第二个元素找到需要比较2次,……,在第n个元素找到需要比较n次。对于有n个元素的数组,如果每个元素被找到的概率相等,那么查找成功的平均比较次数为:

f(n) = 1/n (n + (n-1) + (n-2) + ... + 1) = (n+1)/2 = O(n)

这就是传说中的大O函数的原始定义。

1.1.2 用大O来表述

要全面分析一个算法,需要考虑算法在最坏和最好的情况下的时间代价,和在平均情况下的时间代价。对于最坏情况,采用大O表示法的一般提法(注意,这里用的是“一般提法”)是:当且仅当存在正整数c和n0,使得 T(n) = n0 都成立。则称该算法的渐进时间复杂度为T(n) = O(f(n))。这个应该是高等数学里面的第一章极限里面的知识。这里f(n) = (n+1)/2, 那么c * f(n)也就是一个一次函数。就是在图象上看就是如果这个函数在c*f(n)的下面,就是复杂度为T(n) = O(f(n)),图中的几条绿色的线都符合这个要求。

???

在途中,红色的线代表c*f(n) = c (n+1)/2 ,需要说明的是,两个绿色曲线我们假定它不会和红色线在Y的左边相交。而图中的蓝色线就不能说其渐进复杂度就不是O(f(n)).

对于对数级,我们用大O记法记为O(log2N)就可以了。

1.1.3 加法规则

T(n,m) = T1(n) + T2(n) = O ( max (f(n), g(m) )

1.1.4 乘法规则

T(n,m) = T1(n) * T2(m) = O (f(n) * g(m))

1.1.5 一个特例

在大O表示法里面有一个特例,如果T1(n) = O(c), c是一个与n无关的任意常数,T2(n) = O ( f(n) ) 则有

T(n) = T1(n) * T2(n) = O ( c*f(n) ) = O( f(n) ).

也就是说,在大O表示法中,任何非0正常数都属于同一数量级,记为O(1)。

1.1.6 一个经验规则

有如下复杂度关系

c

其中c是一个常量,如果一个算法的复杂度为c 、 log2N 、n 、 n*log2N ,那么这个算法时间效率比较高 ,如果是 2^n , 3^n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航