hash问题,考察的知识点有,查询次数计算,平方探针解决冲突的原理,素数的判断方法。
关键词
Quadratic probing 平方探针
坑点如下
1,素数的判断方法
bool isprime(int x){
if(x<=1)return false;
for(int i=2;i*i<=x;i++){
if(x%i==0)return false;
}
return true;
}
注:1既不是质数也不是合数。
整体代码如下
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
bool isprime(int x){
if(x<=1)return false;
for(int i=2;i*i<=x;i++){
if(x%i==0)return false;
}
return true;
}
int main(){
int tsize,n,m,v,ans=0;
scanf("%d%d%d",&tsize,&n,&m);
while(!isprime(tsize))tsize++;
vector<int>hash(tsize);
for(int i=0;i<n;i++){
scanf("%d",&v);
bool flag=false;
for(int j=0;j<tsize;j++){
if(hash[(v+j*j)%tsize]==0)
{hash[(v+j*j)%tsize]=v;
flag=true;
break;}
}
if(!flag)printf("%d cannot be inserted.\n",v);
}
for(int i=0;i<m;i++){
scanf("%d",&v);
for(int j=0;j<=tsize;j++){
ans++;
if(hash[(v+j*j)%tsize]==v||hash[(v+j*j)%tsize]==0)
break;
}
}
printf("%.1f\n",(1.0*ans)/m);
return 0;
}