04 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

今天我会继续给你讲四个复杂度分析方面的知识点,最好情况时间复杂度(best case timecomplexity)、最坏情况时间复杂度(worst case time complexity)、平均情况时间复杂度
(average case time complexity)、均摊时间复杂度(amortized time complexity)。

最好最坏时间复杂度

  • 最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。
  • 最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。

平均情况时间复杂度

  • 代码在不同情况下复杂度出现量级差别,则用代码所有可能情况下执行次数的加权平均值表示。

均摊时间复杂度

在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。

为什么要引入这4个概念

 

  1. 同一段代码在不同情况下时间复杂度会出现量级差异,为了更全面,更准确的描述代码的时间复杂度,所以引入这4个概念。
  2. 代码复杂度在不同情况下出现量级差别时才需要区别这四种复杂度。大多数情况下,是不需要区别分析它们的。

 

内容小结

今天我们学习了几个复杂度分析相关的概念,分别有:最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度。之所以引入这几个复杂度概念,是因为,同一段代码,在不同输入的情况下,复杂度量级有可能是不一样的。

在引入这几个概念之后,我们可以更加全面地表示一段代码的执行效率。而且,这几个概念理解起来都不难。最好、最坏情况下的时间复杂度分析起来比较简单,但平均、均摊两个复杂度分
相对比较复杂。如果你觉得理解得还不是很深入,不用担心,在后续具体的数据结构和算法学习中,我们可以继续慢慢实践!

课后分析

我们今天学的几个复杂度分析方法,你都掌握了吗?你可以用今天学习的知识,来分析一下下面这个 add() 函数的时间复杂度。

// 全局变量,大小为 10 的数组 array,长度 len,下标 i。
int array[] = new int[10];
int len = 10;
int i = 0;
// 往数组中添加一个元素
void add(int element) {
  if (i >= len) { // 数组空间不够了
  // 重新申请一个 2 倍大小的数组空间
  int new_array[] = new int[len*2];
  // 把原来 array 数组中的数据依次 copy 到 new_array
  for (int j = 0; j < len; ++j) {
    new_array[j] = array[j];
  }
  // new_array 复制给 array,array 现在大小就是 2 倍 len 了
  array = new_array;
  len = 2 * len;
} 

// 将 element 放到下标为 i 的位置,下标 i 加一   array[i] = element;   ++i; }

分析:

最好是O(1),最差是O(n), 均摊是O(1)。

 

posted @ 2020-01-17 16:39  源问三生  阅读(270)  评论(0)    收藏  举报