zoukankan      html  css  js  c++  java
  • 复杂度分析(二)

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

    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)。

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

            

  • 相关阅读:
    codevs 3115 高精度练习之减法 swap
    codevs 3116 高精度练习之加法
    poj 3984 迷宫问题
    codevs m进制转化成10进制
    codevs 1214 线段覆盖
    codevs 3143 二叉树的序遍历
    codevs 3145 汉诺塔
    HDU 5093 Battle ships [二分图匹配]
    HDU 5074 Hatsune Miku [dp] ——2014鞍山现场赛E题
    ZOJ 3793 First Digit (逗比题)
  • 原文地址:https://www.cnblogs.com/gdouzz/p/9961590.html
Copyright © 2011-2022 走看看