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

    1.复杂分析度

    复杂分析度又分为

    最好情况时间复杂度(best case time complexity):在最理想的情况下,执行一段代码的时间复杂度.

    最坏情况时间复杂度(worst case time complexity):在最糟糕的情况下,执行一段代码的时间复杂度.

    平均情况时间复杂度(average case time complexity)每种情况下执行的次数与概率的积的累和.

    均摊时间复杂度(amortized time complexity):均摊时间复杂度就是一种特殊的平均时间复杂度。

    2.最好情况时间复杂度和最坏情况时间复杂度

      // n 表示数组 array 的长度
    1  int find(int[] array, int n, int x) {
    2  int i = 0;
    3  int pos = -1;
    4  for (; i < n; ++i) {
    5  if (array[i] == x) {
    6  pos = i;
    7  break;
    8  }
    9  }
    10 return pos;
    11 }

    首先看到for循环,确定4~7行这段代码来确定时间复杂度.但是这又分为两种情况.查找的x存在数组中.查找的x不存在数组中.

    当x存在数组中是这段代码的时间复杂度是O(1),当x不存在数组中时需要循环整个数组.时间复杂度就是O(n).所以这就需要

    最好情况时间复杂度(best case time complexity)、最坏情况时间复杂度(worst case time complexity)平均情况时间复杂

    度(average case time complexity)来表示一段代码的复杂度.

    3.平均情况时间复杂度

    上面这段代码的的最好情况时间复杂度,和最坏时间复杂分析度都是在极端情况下出现的复杂分析度.发生的概率并不大.

    既然有了最好和最坏,那就会有平均情况时间复杂度.那么上面这段代码的平均情况时间复杂分析度为1+2+3..+n/n+1=n(n+3)/2n+1.

    (每种情况下要循环查找出想x所在数组的个数除以总次数,得到的就是平均一次查找出x的循环的次数).又因为在大O标记法中.可以

    省掉系数,低阶,常量.所平均情况时间复杂分析度为O(n).

    但是这种情况并没有把x是否存在数组中的概率,以及x处于数组中时x的位置的概率.所以把概论算上.正确的平均情况时间复杂度

    1x1/2x1/n +2x1/2x1/n....+nx1/2xn/1 =3n+1/4,去掉系数,低阶常量等.最终平均时间复杂分析度还是O(n).

    这个值就是概率论中的加权平均值,也叫作期望值,所以平均时间复杂度的全称应该叫加权平均时间复杂度或者期望时间复杂度。

    4均摊时间复杂度

      // array 表示一个长度为 n 的数组
      // 代码中的 array.length 就等于 n
      int[] array = new int[n];
      int count = 0;

      void insert(int val) {
      if (count == array.length) {
      int sum = 0;
      for (int i = 0; i < array.length; ++i) {
      sum = sum + array[i];
      }
      array[0] = sum;
      count = 1;
      }

      array[count] = val;
      ++count;
      }

    这段代码的最好和最坏分别是O(1)和O(n).平均时间复杂分析度为每次插入的次数乘以概率并相加.即1x1/n+1...+n/n+1=

    1+2+3..+n/n+1= (1+n)n/2  x   1/n+1  =n(1+n)/2(n+1)   .所以平均时间复杂分析度为O(n).

    这段代码在一般情况下的时间复杂度都为O(1).只有当count==array.length是时间复杂度才为O(n).并且在执行这次时间复

    杂度为O(n)之后(数组第一位为累加的和,其他数据清空)的n-1次的时间复杂度都为O(1).其实就是说我每执行n次这段代码

    前n-1次的时间复杂度都为O(1).最后一次的时间复杂度为O(n).那平均一下 O(n)/n 不就是O(1)吗?这就是均摊时间复杂度(摊还分析法)

    运用的场景:

    对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在

    前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其

    他那些时间复杂度比较低的操作上。而且,在能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度。

    本文是在学习王争老师的数据结构与算法之美的笔记.有些是王争老师或者评论的言语.在此附上原文链接

     https://time.geekbang.org/column/article/40447

  • 相关阅读:
    学好VC++的十大良好习惯
    VC6.0调试技巧
    匈牙利命名法
    VC中常用文件操作(三)
    VL_FEAT——图像处理函数库
    MATLAB——linspace
    (Your)((Term)((Project)))(字符串处理)
    Matrix Chain Multiplication(栈的简单应用)
    The Triangle(DP基础)
    MATLAB——polyfit
  • 原文地址:https://www.cnblogs.com/yan0720/p/10555579.html
Copyright © 2011-2022 走看看