分析算法时间复杂度的基本方法
1. 找到执行次数最多的语句 (语句频度最高的)
2. 计算语句执行次数的数量级
3. 用大O来表示结果
首先,学会查找语句频度最高的语句,往往是循环最内部的语句;
for( int k = O;k < n;k++ ) 语句频度为n次
x++; 语句频度为1次
for( int i= 0;i < n;i++ ) 语句频度为n次
for(int j= 0;j < n;j++ ) 语句频度为n次
y++; 语句频度为1次
for(int j=1; j<=n; j*=2) 语句频度为log2n
z++;
好,学会了找语句频度最高的语句后,开始计算数量级。
(1)for (i=1; i<=n; i++)
x++;
注:这个for循环的语句要执行n次(主要是里面的i<=n要执行n次),所以它的时间复杂度是O(n)
(2)for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
注:第一个for循环的语句要执行n次(主要是里面的i<=n要执行n次),
第二个for循环的语句要执行n次(主要是里面的j<=n要执行n次),
所以它的时间复杂度是O(n2)
一些规则(引自:时间复杂度计算 )
1) 加法规则
T(n,m) = T1(n) + T2(n) = O (max ( f(n), g(m) )
2) 乘法规则
T(n,m) = T1(n) * T2(m) = O (f(n) * g(m))
3) 一个特例(问题规模为常量的时间复杂度)
在大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)。
4) 一个经验规则
复杂度与时间效率的关系:
c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一个常量)
|--------------------------|--------------------------|-------------|
较好 一般 较差
其中c是一个常量,如果一个算法的复杂度为c 、 log2n 、n 、 n*log2n,那么这个算法时间效率比较高 ,如果是 2n , 3n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。
一些经典例题:
例1
for(i=1;i<=n;i+ +)
for(j=1j<=n;j++) {
c[i][j]=0;
for{k= =1:k<=n;k++)
c[i]I[j]=c[i][j]+ a[i][k]*b[k][j];
}
时间复杂度:n*n*n=n3;
例2
i=1;
while(i<=n)
i=i*2;
关键是要找出来执行次数x与n的关系,并表示成n的函数
若循环执行1次: i=1*2=2,
若循环执行2次: i=2*2=22(2的平方哈,下面依次)
若循环执行3次: i=2*2=23
.......
若循环执行x次: i=2x(2的x平方哈,下面依次)
又因为i要小于等于n
则2x<=n . 求出x<=log2n
以上,就是对算法的时间复杂度基础的分析,今后会不断修改和补充,欢迎大家一起交流。