最好情况时间复杂度
best case time complexity,最好情况时间复杂度,在最理想的情况下,执行代码的时间复杂度。
例如下面这个简单的例子,从一个数组中查找一个与指定值一样的元素,最理想的情况是,第一次就能刚好查找到想要的值,那么它的最好情况时间复杂度就是O(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;
}
最坏情况时间复杂度
worst case time complexity,最坏情况时间复杂度,在最不理想的情况下,执行代码的时间复杂度。
仍然用上面的例子,从数组中找指定元素时,如果想要找的值没有存在于数组中,那么代码需要执行的行数最大,这是最坏的情况,在这种情况下,时间复杂度为O(n)。
平均情况时间复杂度
average case time complexity,平均情况时间复杂度,因为最好情况时间复杂度和最坏情况时间复杂度都是比较极端的情况,出现的几率比较小,所以使用平均情况时间复杂度可以更好的表示执行代码的复杂度。需要注意的是,平均情况时间复杂度需要进行加权计算,不能直接相加除以数量,要使用统计学中的加权平均。
仍然使用上面的例子,假设想要找的数在数组中的概率为1/2,那么每个元素等于想要找的数的概率为1/2n,那么按照顺序,头一个元素为(1/2n) *1,第二个元素为(1/2n) *2,依次类推,直到最后一个元素为(1/2n)*n。目标数不在数组中概率*时间复杂度=1/2 * n。那么所有情况的加权平均即为平均情况时间复杂度。
均摊时间复杂度
amortized time complexity,均摊时间复杂度,如果对数据结构进行一组连续操作时,大部分时间时间复杂度很低,只有个别情况时间复杂度高,且两种情况前后连贯的出现(例如1111111n1111111n......),那么在分析时,就可以使用均摊时间复杂度来表示这一组操作的时间复杂度。
假设,一组操作(总计n个操作)在个别情况下,时间复杂度为n,其他情况为1,且两种情况前后连贯出现,那么可以将O(n)均摊到每个操作中,那么这一组操作的时间复杂度为O(1)。
均摊时间复杂度和平均时间复杂度区别在于,均摊时间复杂度中要求时间复杂度高的情况和一般情况需要按照前后连贯的条件出现,而平均时间复杂度则没有这个要求,两者使用的场景都比较严苛,实际工作中,机会比较少,理解即可。
以上均为个人学习之后做的总结和笔记,仅供参考。