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 09:13:39
期望应该是步长为
by Killer_joke @ 2023-08-20 09:37:51
@xs_siqi
单次询问还是
如果在区间内均匀随机。期望比较次数渐进意义上大约是
by ZoeZhang @ 2023-08-20 15:33:27
@xs_siqi 什么叫随机步长二分啊,有相关资料吗,网上没搜到(还是我太菜了)
by xs_siqi @ 2023-08-20 16:25:26
@ZoeZhang 有没有一种可能,这是我随便取的名字
by xs_siqi @ 2023-08-20 16:26:54
@Killer_joke 我草真的是这样,我一开始以为这个效率很慢的
by ZoeZhang @ 2023-08-20 16:42:55
呃
by Wangxun @ 2023-08-20 17:05:19
@xs_siqi
期望步长为
by Wangxun @ 2023-08-20 17:05:57
@xs_siqi
在二分节点不在中间时,两边的先验概率不同。
by Wangxun @ 2023-08-20 17:25:44
@xs_siqi
把原问题抽象,先验概率均匀分布的话,假设区间长为
下一个期望步长
根据期望的线性性质:
而
所以
而所谓“期望步长”就是
by xs_siqi @ 2023-08-20 17:33:42
@Wangxun 我草,超级大神