原题
题目大意及思路
利用平方探测法构建表并搜查得到平均搜寻时间
代码
#include<iostream>
#include<map>
using namespace std;
bool isPrime(int a){
for(int i=2;i*i<=a;i++) if(a%i==0) return false;
return true;
}
int main(){
int maxsize,n,m;
cin>>maxsize>>n>>m;
while(isPrime(maxsize)==false) maxsize++;
int hash[maxsize]={0};
while(n--){
int now,k;
cin>>now;
for(k=0;k<maxsize;k++){
int index=(now+k*k)%maxsize;
if(hash[index]==0){
hash[index]=now;
break;
}
}
if(k==maxsize) printf("%d cannot be inserted.\n",now);
}
int ans=0;
for(int i=0;i<m;i++){
int query;
cin>>query;
for(int k=0;k<=maxsize;k++){
ans++;
int index=(query+k*k)%maxsize;
if(hash[index]==query||hash[index]==0) break;
}
}
printf("%.1lf\n",ans*1.0/m);
return 0;
}
运行截图
收获
- 平方探测法:首先看下标为
key%maxsize
的位置是否空,不空则看(key+i*i)%maxsize
是否为空,空则插入,其中i从0到maxsize-1;在搜查时,和插入时的方法一致,不同的是i的范围变到了[0, maxsize],且判断hash[index]是否等于搜寻的元素或0,满足其中一个条件则break.
与其说收获,不如说是对这个题的总结,因为实际上是没有做出来的,不理解很多判断条件:i的取值范围为什么插入和搜寻的时候不一致,这个疑惑正在解决中…也望各位指教!