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

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

【表示方法】

       大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



      


  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 62
    评论
计算时间复杂度时,我们需要考虑算法中的基本操作的执行次数。以下是几个常见的时间复杂度示例及其计算过程: 1. O(1):常数时间复杂度 这表示算法的执行时间与输入规模无关,始终保持恒定。例如,访问数组中的特定元素或执行固定次数的操作。无论输入的大小如何,执行时间都是恒定的。 例如: ``` def print_element(arr): print(arr[0]) ``` 这段代码只打印数组中的第一个元素,不论数组的大小如何,只有一次操作,因此时间复杂度为O(1)。 2. O(n):线性时间复杂度 这表示算法的执行时间与输入规模成线性关系。例如,遍历数组或列表中的元素,执行n次操作。 例如: ``` def print_elements(arr): for elem in arr: print(elem) ``` 这段代码遍历了整个数组,并依次打印每个元素。执行次数与数组大小相同,因此时间复杂度为O(n)。 3. O(n^2):平方时间复杂度 这表示算法的执行时间与输入规模的平方成正比。例如,嵌套循环中每个循环执行n次操作。 例如: ``` def print_pairs(arr): for i in range(len(arr)): for j in range(len(arr)): print(arr[i], arr[j]) ``` 这段代码使用两个嵌套循环遍历数组,并打印每对元素。对于数组大小为n,内部循环将执行n次,外部循环也将执行n次,因此时间复杂度为O(n^2)。 这只是一些常见的时间复杂度示例,实际的复杂度分析可能更复杂。在进行时间复杂度分析时,需要仔细考虑算法中的循环、递归、条件语句等基本操作,并评估它们的执行次数。根据基本操作的执行次数,选择最高的阶数作为时间复杂度的表示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值