04 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度
今天我会继续给你讲四个复杂度分析方面的知识点,最好情况时间复杂度(best case timecomplexity)、最坏情况时间复杂度(worst case time complexity)、平均情况时间复杂度
(average case time complexity)、均摊时间复杂度(amortized time complexity)。
最好最坏时间复杂度
- 最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。
- 最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。
平均情况时间复杂度
- 代码在不同情况下复杂度出现量级差别,则用代码所有可能情况下执行次数的加权平均值表示。
均摊时间复杂度
在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。
为什么要引入这4个概念
- 同一段代码在不同情况下时间复杂度会出现量级差异,为了更全面,更准确的描述代码的时间复杂度,所以引入这4个概念。
- 代码复杂度在不同情况下出现量级差别时才需要区别这四种复杂度。大多数情况下,是不需要区别分析它们的。
内容小结
今天我们学习了几个复杂度分析相关的概念,分别有:最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度。之所以引入这几个复杂度概念,是因为,同一段代码,在不同输入的情况下,复杂度量级有可能是不一样的。
在引入这几个概念之后,我们可以更加全面地表示一段代码的执行效率。而且,这几个概念理解起来都不难。最好、最坏情况下的时间复杂度分析起来比较简单,但平均、均摊两个复杂度分
相对比较复杂。如果你觉得理解得还不是很深入,不用担心,在后续具体的数据结构和算法学习中,我们可以继续慢慢实践!
课后分析
我们今天学的几个复杂度分析方法,你都掌握了吗?你可以用今天学习的知识,来分析一下下面这个 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)。

浙公网安备 33010602011771号