二分查找更快的写法(雾)
  • 板块灌水区
  • 楼主sssaberrrr
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/8/11 20:55
  • 上次更新2023/11/4 11:00:20
查看原帖
二分查找更快的写法(雾)
250493
sssaberrrr楼主2021/8/11 20:55

众所周知,二分查找是这么写的:

#include<bits/stdc++.h>
using namespace std;
int n, x;
int arr[10000000];
int main()
{
//	freopen("01.in", "r", stdin);
//	freopen("01.out", "w", stdout);
	int t;
	scanf("%d", &t);
	while(t--)
	{
		scanf("%d%d", &n, &x);
		for(int i=1; i<=n; i++) scanf("%d", &arr[i]);
		int l=1, r=n;
		while(l<=r)
		{
			int mid = l+(r-l)/2;
			if(arr[mid]<x) l=mid+1;
			else r=mid-1;
		}
		printf("%d\n", l);
	}
	return 0;
}

但经过实际验证,这么写更快(xuan)

#include<bits/stdc++.h>
#include<random>
using namespace std;
int n, x;
int arr[10000000];
mt19937 rd(time(0));
int main()
{
	freopen("01.in", "r", stdin);
	freopen("02.out", "w", stdout);
	int t;
	scanf("%d", &t);
	while(t--)
	{
		scanf("%d%d", &n, &x);
		for(int i=1; i<=n; i++) scanf("%d", &arr[i]);
		
		int tmp = rd()%n+1;
		while(arr[tmp]!=x)
		{
			if(arr[tmp]<x) tmp=rd()%(n-tmp)+tmp+1;
			else tmp=rd()%(tmp-1)+1;
		}
		printf("%d\n", tmp);
	}
	return 0;
} 

真的会快几十毫秒qwq

2021/8/11 20:55
加载中...