这道题过了,但对二分查找实现的两种方法性能不理解

P2249 【深基13.例1】查找

鹏程 @ 2023-12-03 17:38:08

同样是二分查找,为什么这里使用递归法二分过不了#1,用while就可以通过#1?
递归法:

void find(int a[],int l,int r,int t){

    int mid=(r+l)>>1;
    if(a[mid]==t){

        ans=min(mid,ans);
        d[t]=ans;
        find(a,l,mid-1,t);
    }
    else if(l-r>0){
        return;
    }else{
        if(t<a[mid]){
            find(a,l,mid-1,t);
        }else{
            find(a,mid+1,r,t);
        }
    }
}

得分84,#1开O2优化后依旧超时;
while法:

void find(int a[],int l,int r,int t){
    while(l<=r){
        int mid=(r+l)>>1;
        if(a[mid]==t){
            ans=min(mid,ans);
            d[t]=ans;
            r=mid-1;
        }else if(t<a[mid]){
            r=mid-1;
        }else{
            l=mid+1;
        }
    }
}

满分,且#1测试点耗时60ms
请问递归的做法哪些地方影响了程序效率?


by XP3301_Pipi @ 2023-12-03 17:43:31

递归本身时间复杂度常数比较大,效率比较慢
所以一些DP题写记忆化搜索就可能会被卡掉


|