0
点赞
收藏
分享

微信扫一扫

1145 Hashing - Average Search Time (25 分)(散列冲突二次方探查法)

水墨_青花 2022-02-26 阅读 33

本题说了增量只考虑正的,所以不用-j*j
这题有问题,探查时间的循环和我存的时候的循环次数不一致。随便看看。
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int ms,n,m;
int isp(int x){
	if(x<2) return 0;
	for(int i=2;i<=(int)sqrt(x)+1;i++){
		if(x%i==0)
		return 0;
	}
	return 1;
	
}
int change(int x){
	while(!isp(x)) x++;
	return x;
}
int main(){
	cin>>ms>>n>>m;
	ms=change(ms);
	vector<int> v(ms); 
	for(int i=0;i<n;i++){
		int x;
		cin>>x;
		int f=1;
		for(int j=0;j<ms;j++){
			if(v[(x+j*j)%ms]==0){
				v[(x+j*j)%ms]=x;
				f=0;
				break;
			}
		}
		if(f)
		printf("%d cannot be inserted.\n",x);
	}
	int sum=0;
	for(int i=0;i<m;i++){
		int x;
		cin>>x;
		for(int j=0;j<=ms;j++){		//就这,我上面是<但是这里必须是<=,理解不了,应该有问题。 
			sum++;
			if(v[(x+j*j)%ms]==x||!v[(x+j*j)%ms])
					break;
		}
	
	}
	printf("%.1lf",sum*1.0/m);
		return 0;
}
举报

相关推荐

0 条评论