上面这段代码是往数组尾插入元素,并且实现了自动扩容功能。在数组未满的情况下,直接放到数组尾即可,因此,最好时间复杂度为 O(1)。在数组满的情况下,需要进行 n 次移动,并申请 n 个空间,因此,最坏时间复杂度是 O(n),最坏空间复杂度是 O(n)。

最后计算 均摊时间复杂度,首先说明其概念和适用场景。对某个数据结构做一组连续操作,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,并且这些操作间存在前后连贯的时序关系,此时,我们便可将这组操作放在一起考虑,看能否将较高时间复杂度的那些操作耗时,平摊到其他低时间复杂度操作上,这种分析方法就叫做 摊还分析,通过摊还分析得到的时间复杂度,被称为均摊时间复杂度。一般情况下,能够应用均摊时间复杂度分析的场合,均摊复杂度等于最好时间复杂度。

对于上例,每一次 O(n) 的移动操作,都会跟着 n 次 O(1) 的插入操作,所以把耗时多的那次操作均摊到接下来的 n 次耗时少的操作上,这一组连续操作的均摊时间复杂度就是 O(1)。

最好时间复杂度计算简单,与此同时,参考意义也不是很大。最坏时间复杂度计算较为复杂,如用于关键环节需要重点考虑。平均时间复杂度计算最为复杂,也是最常用的评价指标,而可以使用摊还分析的算法,使用均摊时间复杂度代替常规的加权平均/期望得出的平均复杂度更具实际意义。