复杂度分析只最好、最坏、平均及均摊时间复杂度

大多数情况下,按照使用大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).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值