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

原创 2015年10月13日 23:18:06

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

【表示方法】

       大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



      


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

通过一个实例学会时间复杂度的计算

时间复杂度的定义      一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常...

算法设计与分析学习-蛮力法

参考 :  算法设计与分析   第三章  蛮力法 接下来的每章中,我们专注于一种特定的算法设计策略。 蛮力法是一种最简单和直接的解决问题的办法,往往是低效的,但我们不应该忽略它的地位, ...

时间复杂度题目分析

for(i=1;i

主项定理Master Method 计算时间复杂度

在面试题目中有一部分是让大家求时间复杂度的问题,例如给出我们: T(n) = a * T(n/b) + f(n)   (a ³ 1,b > 1,f(n)一般是个简单函数)这样的递归方程,计算其时间复杂...
  • NK_test
  • NK_test
  • 2015年09月09日 20:49
  • 1933

Python的集合set

set是python中一个无序且无重复元素的数据结构。无序,是因为set采用了hash技术进行元素的存储;无重复元素,本身就是set区别其他数据结构的一个重要特点,也是set之间能够进行并,交,差等各...

Pyhton 单行、多行注释符号使用方法及规范

玩蛇网推荐图文教程: python黑客多线程扫描器 python中的注释有多种,有单行注释,多行注释,批量注释,中文注释也是常用的。python注释也有自己的规范,在文章中会介绍到。注释可以起到...

判断链表是否带环?若带环求环的长度?若带环求环的入口点?并计算以上每个问题的时间复杂度?

1、怎么判断一个单链表是否带环          如果单链表带环,那么从链表头开始时遍历就会进入死循环。可以用两个速度不同的指针,先让两个指针pFast和pSlow同时指向pHead,然后每次使pFa...

计算计算法基础-时间复杂度

  • 2012年02月20日 20:33
  • 79KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:常见问题时间复杂度的计算过程
举报原因:
原因补充:

(最多只允许输入30个字)