数据结构及算法学习:复杂度分析

复杂度学习目的及相关术语

在这里插入图片描述

时间复杂度分析

在这里插入图片描述

  1. 实例1:
    1~N 累计求和。假设每行代码执行时间是1个unit_time;第 2、3 行代码分别需要 1 个 unit_time 的执行时间,第 4、5 行都运行了 n 遍,所以需要 2n*unit_time 的执行时间,所以这段代码总的执行时间就是 (2n+2)*unit_time。简称 T(n) = O(2n+2) = 0(n)。在这里插入图片描述

  2. 实例2:
    第 2、3、4 行代码,每行都需要 1 个 unit_time 的执行时间,第 5、6 行代码循环执行了 n 遍,需要 2n * unit_time 的执行时间,第 7、8 行代码循环执行了 n2遍,所以需要 2n2 * unit_time 的执行时间。所以,整段代码总的执行时间 T(n) = O(2n^2+2n+3)
    在这里插入图片描述

  3. 实例3
    在这里插入图片描述
    从代码中可以看出,变量 i 的值从 1 开始取,每循环一次就乘以 2。当大于 n 时,循环结束。还记得我们高中学过的等比数列吗?实际上,变量 i 的取值就是一个等比数列。如果我把它一个一个列出来,就应该是这个样子的:
    在这里插入图片描述

所以,我们只要知道 x 值是多少,就知道这行代码执行的次数了。通过 2x=n 求解 x 这个问题我们想高中应该就学过了,我就不多说了。x=log2n,所以,这段代码的时间复杂度就是 O(log2n)。

其他几种复杂度分析

看下面的代码从一个无需的数组array中找到X的位置,找到返回数据下标,找不到返回-1;

// n 表示数组 array 的长度
int find(int[] array, int n, int x) {
  int i = 0;
  int pos = -1;
  for (; i < n; ++i) {
    if (array[i] == x) {
       pos = i;
       break;
    }
  }
  return pos;
}
  • 最好情况时间复杂度
    顾名思义就是在最理想的情况下,执行这段代码的时间复杂度。那就是正好第一个元素就是要找的数值。最好情况时间复杂度就是O(1).
  • 最坏情况时间复杂度
    顾名思义就是在最糟糕的情况下执行这段代码的时间复杂度。那就是数组中没有查找到要找的数值。最坏情况时间复杂度就是O(n).
  • 平均情况时间复杂度
    要查找的变量 x 在数组中的位置,有 n+1 种情况:在数组0~n-1位置或者不在数组内。我们把每种情况遍历元素的个数累加起来,再除以n+1种情况得到平均复杂度0(n)。
    在这里插入图片描述
    上面的结论虽然正确,但是计算过程有点问题;每种情况出现的概率都不相同,我们加上概率来分析一下。
    1、在数组中和不在数组中,是二分之一的概率。
    2、在数组中的概率是n分之一。
    总的概率就是2n分之一。
    引入概率之后就是下面的计算结果。平均时间复杂度是0(n).
    在这里插入图片描述
  • 均摊时间复杂度
    参考文章http://www.cnblogs.com/hardyyao/p/9744427.html

猜你喜欢

转载自blog.csdn.net/jsh13417/article/details/82942883