【数据结构导论】——时间复杂度集结号

【背景】

     从《数据结构导论》的一开始,就有时间复杂度的介绍,在后面的学习中,每个算法几乎都会带有时间复杂度的分析,一个算法的时间性能(或时间效率)是评价算法好坏的因素之一,下面让我们来认识一下时间复杂度吧。

【定义】

       一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度。

【计算步骤】

       1、计算出算法的基本操作的执行次数T(n)(计算量)

            基本操作是指算法中的每条语句(以;号作为分割),语句的执行次数也叫做语句的频度。在做算法分析时,一般默认为考虑最坏的情况。

       2、计算出T(n)的数量级

             求T(n)的数量级,只要将T(n)进行这样一些操作: 忽略常量、低次幂和最高次幂的系数,令f(n)=T(n)的数量级。

       3、用大O表示法来表示时间复杂度

              当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。

【实例分析】

     

<span style="font-family:KaiTi_GB2312;font-size:18px;">int num1,num2;
for (int i =0;i<n;i++){
      num1 + =1;
      for(int j =1;j<=n;j * =2){
            num2+=num1;
 }
}</span>

分析:

     1、



      T(n) = 2 *1 +4*n+3* n *log2n

 2、

   忽略掉常量、低次幂和最高次幂的系数

   f(n)= n * log2n 

 3、

   lim(T(n)/f(n)) = (2+4n+3n*log2n) / (n*log2n)
             = 2*(1/n)*(1/log2n) + 4*(1/log2n) + 3

   经分析可知,当n趋向于无穷大时,1/n趋向于0,1/log2n趋向于0,所以lim(T(n)/f(n))=3,T(n) = O(n*log2n)。

   所以可以认为:决定算法复杂度的是执行次数最多的语句,这里是num2+=num1,一般也是最内循环的语句。


【简化的计算步骤】

  1.找到执行次数最多的语句

  2.计算语句执行次数的数量级

  3.用大O表示结果

 根据上述算法,我们再来分析:

  1. 执行次数最多的语句为num2+=num1 ;

  2. T(n)= n*log2n ; f(n)= n*log2n ;

  3. lim(T(n)/f(n)) = 1; T(n)= O(n*log2n);

【经验汇总】

       复杂度与时间效率的关系:
                              c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一个常量)
                              |--------------------------|--------------------------|-------------|
                                      较好                     一般              较差
    其中c是一个常量,如果一个算法的复杂度为c 、 log2n 、n 、 n*log2n,那么这个算法时间效率比较高 ,如果是 2n , 3n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。

   

【更多例子】

       1、O(1)
            ---------交换i和j的内容

temp=i;
i=j;
j=temp;     
    分析: 以上三条单个语句的频度为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。

      2、O(n)

          

 a=0;
   b=1;                     ①
   for (i=1;i<=n;i++) ②
   {  
      s=a+b;    ③
      b=a;     ④  
      a=s;     ⑤
   }
 分析: 语句1的频度:2,      语句2的频度:n,      语句3的频度:n,       语句4的频度:n,     语句5的频度:n,                                  
           T(n) = 2+4n        f(n) = n
            lim(T(n)/f(n)) = 2*(1/n) + 4 = 4
           T(n) = O(n).     

3、O(log2n)

     

 i=1;       ①
   while (i<=n)
      i=i*2; ②
  分析:语句1的频度是1,  设语句2的频度是t,  则:nt<=n;  t<=log2,考虑最坏情况,取最大值t=log2n,
            T(n) = 1 + log2n,f(n) = log2n
             lim(T(n)/f(n)) = 1/log2n + 1 = 1
            T(n) = O(log2n)

4、O(n2)  -------(冒泡、直接选择排序算法)

【总结】

      以前觉得时间复杂度很难学,现在看来只有真正去做了,才发现其实并没有想象中的那么难。先去了解,慢慢发现它的简单和有趣~~啦啦


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 75
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的大白啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值