大多数情况下,按照使用大O时间复杂度表示法可以直接估算得到的算法时间复杂度,但是对某些特殊的算法,存在不同特殊情况,在不同情况下算法的复杂度就不一样, 所以牛B前人引入了最好、最坏以及平均时间复杂度。
int find(int arr[],int len,int v){
int pos=-1;
for(int i=0;i<len;i++){
if(v=arr[i]){
pos=i;
break;
}
}
return pos;
}
以上是一段查找某个特定值在数组中位置的函数,存在3种情况,要找的值就在数组的第一个位置、在数组中随机位置、不在数组中,在数组的第一个位置为最好情况,时间复杂度为O(1),不在数组中为最坏情况,时间复杂度为O(n),这两种都属于极端情况,不能代表通常情况,那么怎么办?这里就引入了平均时间复杂度:总共有n+1种情况,假设在数组中和没在数组中的概率一样,在数组中时,出现在数组的位置的概率一样
T(n)=1*1/2n+2*1/2n+3*1/2n+...+n*1/2n+n*1/2=(3n+1)/4=O(n)
所以这种情况下的函数就存在了三种时间复杂度:
最好时间复杂度:O(1)
最坏时间复杂度:O(n)
平均时间复杂度:O(n)
均摊时间复杂度又是什么情况呢
int[] arr=new int[5];
int currPos=0;
void insert(int val){
if(currPos==arr.length){
int[] temp = new int[2*arr.length];
for(int i=0;i<arr.length;i++){
temp[i]=arr[i];
}
arr=temp;
}
arr[curPos]=val;
currPos++;
}
这种函数是数组动态扩容,当数组有空闲空间时,直接写入值到数组中,算法的时间复杂度为O(1),当数组满了后,进行扩容,并将原来的值按顺序复制到新的空间中,时间复杂度为O(n),也就是存在规律前面n次的时间复杂为O(1),第n+1次的时间复杂度为O(n),我们可以将第N+1次的复杂度平均分摊到前面的N次中,每次的时间复杂度还是O(1),所以这个函数的均摊时间复杂度为O(1).