为什么这个都能过啊???

P2249 【深基13.例1】查找

xs_siqi @ 2023-08-20 09:07:10

写了一个随机步长二分(((

测了好几发跑得都特别快,没写快输,甚至只比正常程序慢了两三倍的样子。。。

想问一下这个算法的复杂度大概是多少。。

#include<bits/stdc++.h>
#define WUDIAKIOI 666
using namespace std;
const int maxn=1e6+5;
const int DR[4]={1145,1919,233,WUDIAKIOI};
const int mod=1011451423;
int n,k,a[maxn];
int RF(int d){
    int l=1,r=n,tms=0;
    while(l<=r){
        int rid=(l+r)>>1;
        tms++;
        if(tms>2000)return l;//避免运气太差的情况
        if(a[rid]<d){
            l=l+((rand()%1000)*(rand()%1000))%(rid-l+1)+1;}//因为步长最多是500000的,所以rand出来的东西开大一点
        else{
            r=r-((rand()%1000)*(rand()%1000))%(r-rid+1)-1;}}
    return l;}
void read(int &x){
    x=0;char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while('0'<=ch&&ch<='9')x=x*10+ch-'0',ch=getchar();}
signed main(){
    srand((int)time(NULL));
    read(n),read(k);
    for(int i=1;i<=n;i++)read(a[i]);
    for(int x,i=1;i<=k;i++){
        read(x);int p=RF(x);
        if(a[p]!=x)printf("-1 ");
        else printf("%d ",p);}
    return 0;}

by xs_siqi @ 2023-08-20 17:34:32

@Wangxun 二分节点不在中间是什么意思,是指我的 mid 不一定是 \dfrac{l+r}{2}


by Wangxun @ 2023-08-20 17:37:07

@xs_siqi

是的,mid 在 [l,r] 随机选择。

打个比方说,mid 被随机在 0.0001 的位置,它就更可能执行 l=mid 操作。


by xs_siqi @ 2023-08-20 17:59:47

为什么 但是我的 rid 不是已经定义成恰好两者之间的位置了吗,那不是就是说明要么 l 移动到区间 [l+1,mid+1] 的任意位置,要么 r 移动到 [mid-1,r-1] 的任意位置吗,这样缩短的的期望不是 \frac{1}{4} 吗。

如果 mid[l,r] 中任意位置正确性好像是无法保证的


by xs_siqi @ 2023-08-20 17:59:55

@Wangxun


by Wangxun @ 2023-08-20 19:10:40

@xs_siqi

submission

理论单次查询时间复杂度 O(\log_{\frac{3}{2}}{n})


上一页 |