驰骋翱翔

代码人生,人生如代码

常见问题时间复杂度的计算过程

        算法是用系统的方法解决实际问题的策略机制,算法的质量将影响到程序的效率,而时间复杂度则是评判时间复杂度的标准,时间复杂度越小,算法越好,程序执行效率越高,反之,效率越差。

【表示方法】

       大O表示法:

       当且仅当存在正常数c和n0,使得

           T(n)<=cf(n)

       对所有的n>n0成立。T(n)=O(f(n))称为算法的渐进时间复杂度,简称时间复杂度。(f(n)是问题规模n的某个函数)。例如:T(n)= n^2+4n+1,则可以用数学助记符号O(n^2)表示时间复杂度。

     

       分析:(1)f(n)是n足够大时,对T(n)起支配作用的表达式。

                  (2)时间复杂度跟f(n)前面的系数关系不大。 

       

                                                   图1  n的二次方与一次方对比图                                                                            图2  一次方与log2X的对比图


        由图1可明显看出,n^2与n做对比,始终会存在一个点A,前者超过后者,因此起决定作用的是n^2;由图2可以看出,x对比log2x,x起决定作用。

【常见算法复杂度】

        常见的算法设计分为5大类: 

                   

       经典排序算法:

                                                

         算法时间复杂度与算法的构成是紧密结合的,并不是准确的比较或者交换次数,而是一个概数,且在不同的条件下比较或者交换次数是不同的,可分为最坏时间复杂度,最好时间复杂度,平均时间复杂度,默认情况下算的是最坏复杂度。

      1.  归并排序复杂度

                                

      归并排序体现的是分组思想,现采用上面16个数的排序(体现特殊情况)对应一般情况的分析方法:

                 

         根据上面16个数排序的特殊情况来归纳一般情况(n):

           (1)计算每次分组比较+交换次数:n

           (2)共进行了几次分组:

                          

        由上图可以得出,组的个数都是在原来的基础上/2得到的,到1为止,因此,共进行几次分组,即n可以进行几次二分运算,为log2(n).

            (3)总复杂度为:O(n*log2(n))

      2.  0-1背包问题复杂度

        0-1背包问题的实现时嵌套在两个循环里的,具体实现请看上篇博文《动态规划算法》。

        其分两步循环实现:第一步,内层嵌套先判断能不能物品能不能放进包内,共要比较允许的最大重量W次;第二步,外层循环确定共有几个物品,执行n次循环。
   
       因此时间复杂度很清楚为:T(n)=n*w=O(nw)

    3. 快速选择算法复杂度

        复杂比较次数是不确定的,指定的默认值不同,比较次数也不同,复杂度也就不同,如下实例:共分组次数为4,比较次数为:5+3+2+1=11
                                             
                                                 
                                                        
                                                                                                          
          上面是一种复杂的情况,下面举例说明平均复杂度与最坏时间复杂度:
           (1)平均时间复杂度,每次指定的值都会排序到本组中间的情况:

                               
         假设n足够大时,n要远远大于比较的次数,此时,每次分组比较次数(n-2*m-1)就可以看做是n了(m为第几次比较)。n每次取中间值,相当于二分法可以分log2n次,所以平均时间复杂度可以理解为O(nlog2n)。

       (2)最坏时间复杂度, 每次指定的值都排在末尾
                                         
   
       由上图可以得到,比较次数为1+2+3+...n-1=n*(n-1)/2,所以最坏情况下的时间复杂度为O(n^2)。

 【总结】

        时间复杂度的计算过程是由特殊到一般的过程,使用特殊的数值得到普遍的规律,而结果却是一个概数,但这种结果已经足够让我们作为依据评论一个算法的优劣。
       
        同时也让我们明白,算法的执行次数尽管复杂多变,我们只要取平均或最差情况,就能实现自己的目的,只有理解这些模糊数据的存在,才能真正理解算法复杂度。

  研究文档下载地址:http://wenku.baidu.com/view/eb65c8f3a98271fe900ef90e



      


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012466304/article/details/49101197
个人分类: 软考
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭