浅析最好,最坏,平均与均摊时间复杂度
先看下面在数组中查找某个数据的代码:
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;
}
如果数组中第一个元素正好是要查找的变量 x,那就不需要继续遍历剩下的 n-1 个数据了,那时间复杂度就是 O(1)。但如果数组中不存在变量 x,那我们就需要把整个数组都遍历一遍,时间复杂度就成了 O(n)。所以,不同的情况下,这段代码的时间复杂度是不一样的。
最好时间复杂度:在最理想的情况下,得到的时间复杂度。就比如说要查找的元素是数组中的第一个。
最坏时间复杂度:在最差的情况下,要查找的数据不在数组内,那就需要将数据都要遍历一遍。
平均时间复杂度:最好情况时间复杂度和最坏情况时间复杂度对应的都是极端情况下的代码复杂度,发生的概率其实并不大,所以就出现了平均时间复杂度。
还是上面那段代码,我们还分析一下,当要查找的变量x,在数组中的某个位置,0~n-1之间或者不在数组中,就一共有n+1种情况。所以,将每种出现的情况次数加起来除以总的情况就得到平均时间复杂度,用大O表示法,去掉系数,低阶,常量等,O((1+2+3+…+n+n)/(n+1)) =O(n)。
均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。