复杂度分析

Posted gdouzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复杂度分析相关的知识,希望对你有一定的参考价值。

      在前面一篇文章中,我们讲了为什么要进行复杂度分析,以及如何分析复杂度。那么接下来我将举一个例子,请你按照之前的复杂度分析分析出来。

for (var i = 0; i <= arr.Length; i++)
{
         if (value==arr[i])
           {
                     break;
           }
}

     上面这段代码的复杂度是多少呢,假设数组长度为n,最好的情况下是i=0的时候,就找到相等的了,最坏情况下是:最后一个才找到,或者循环一遍之后一个都没找到。我们知道上面两种是极端情况,一般发生的概率都不大。

     对于上面这个情况,我们就要引入平均时间复杂度的概念了。

     我们知道平均复杂度的算法,就像平均数的算法一样,用总的查找次数/多少种情况 。从0到n-1,共有n种情况,再加上不在数组中的情况(1)种,所以总共n+1总情况。总的查找次数就是从0,1,2,3 到n,n; 

    根据上面算出时间复杂度为

    技术分享图片

    省略掉常量得出的平均复杂度时间为o(n)。

    好像上面这样做法,没有什么毛病。但是我们仔细想想,上面有两种情况,在数组里面和不在数组里面,发生的情况都是1/2。另外,要查找的数据,出现在数组里面的概率,每个位置都是1/n。

    根据概率论的一点知识,在数组里面的情况的概率是1/2n。

    所以得出如下结论

    技术分享图片

   去掉常量,平均时间复杂度还是为o(n)。

   上面就是平均时间复杂度的算法。碰到这些,我们要好好分析。

        

以上是关于复杂度分析的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的时间复杂度是多少?

代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?

基于时间复杂度的这些片段真的很困惑

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

用于数据加载的 Android 活动/片段职责

qt creator源码全方面分析(2-0)