时间复杂度(详解!!!)

分析算法时间复杂度的基本方法
 

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

以上,就是对算法的时间复杂度基础的分析,今后会不断修改和补充,欢迎大家一起交流。

  • 13
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值