在硬件越来越发达的今天,人们越来越注重程序的性能,那怎么去评估程序的性能呢?那就要用到上一篇的内容,时空复杂度,如果你感兴趣可以前往合集查看。说到时间复杂度,它又被分为了四种: 最好情况时间复杂度、 最坏情况时间复杂度、 平均情况时间复杂度、 均摊时间复杂度。本篇博客都有描述哦,相信你都能掌握。
一、最好、最坏情况时间复杂度
试着分析一下下面这段代码的时间复杂度吧,如果你会不会分析的话,可以用笔者上一篇的文章。
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;
}
不难发现,这段代码是在数组array中查找x元素,如果存在则返回索引,不存在就返回-1。但是你有没有发现,这段代码大部分情况下不需要遍历完整个数组,元素为数组最后一个的情况很少,找到了元素就结束循环。也就意味着数组中数据分布情况不同,代码执行的次数也就不一样。
为了描述不同情况下不同的时间复杂度,需要使用三个概念名词:最好情况时间复杂度、最坏情况时间复杂度以及平均情况时间复杂度。
见名知意,最好情况时间复杂度,就是在最理想的情况下,执行这段代码的时间复杂度。对应到上面的例子,当要查询的元素刚好为第一个时,代码只需要执行一次就结束,时间复杂度为O(1)。
最坏情况时间复杂度,就是在最糟糕的情况下,执行这段代码的时间复杂度。对应到上面的例子,当要查询的元素不在数组中时,需要从头到尾遍历数组,时间复杂度为O(n)。
经过上面的分析,可以发现最好、最坏情况时间复杂度都对应的是比较极端的情况,发生的概念非常低,为了比较精确地表示代码在大部分情况下的时间复杂度,我们需要引入下面这个例子"平均情况时间复杂度".