本节在初步了解时间复杂度和空间复杂度的基础上,进一步讲一讲四个时间复杂度的分类,分别是:
- 最好时间复杂度(best case time complexity)
- 最坏时间复杂度(worst case time complexity)
- 平均情况时间复杂度(average case time complexity)
- 均摊时间复杂度(amortized time complexity)
请看一个示例:
/**
* 在数组中查找跟目标值target相同值的索引位(第一个匹配的即可),如果没有匹配返回-1
*/
public int search(int[] array, int target) {
int pos = -1;
for (int i = 0; i < array.length; i ++) {
if (array[i] == target) {
pos = i;
break;
}
}
return pos;
}
程序本身很简单,学任何语言背景的都能看懂,此时我们来分析时间复杂度:
- 最好的情况:恰好数组第一个元素即匹配,此时时间复杂度为:O(1)
- 最坏的情况:数组所有元素都找遍了都没有匹配的,最后返回了-1,此时时间复杂度为:O(n)
- 平均的情况:最好和最坏都是极端情况,实际运行过程中大概率是中间情况即不好也不坏,我们此时取加权平均值(期望值)作为时间复杂度,此时计算出为(3n + 1)/ 4。(具体的推导过程略),用大O表示法忽略常量则为:O(n)
均摊时间复杂度
前面讲的最好,最坏和平均还比较容易掌握,更高阶的是均摊时间复杂度。
对一个数据结构进行一组连续操作中,大部分情况的时间复杂度都很低,只有个别情况时间复杂度很高,而且这些操作之间存在前后连贯的时序关系,此时可将较高的耗时均摊到较低的操作上。
一般规律:均摊时间复杂度等于最好情况的时间复杂度。
小结
本节延伸了时间复杂度的种类,大多数情况实际估算时不需要严格区分。