注意:這裏說了探測只有正的探測,然後使用平方探測法、進行插入時,i的最大值爲size(table)-1 (也有部分說是size(table)/2,這裏倒是都能過了PAT的測試點);使用平方探測法進行查找時,i的最大值爲size(table), 否則你湊不出4個數字的查找需要進行11次。。。。
關於平方探測法,看到了一篇文章寫得不錯,也有關於一般質數表長,一半空白必可插入的證明,感覺選擇質數的表長是爲了方便在mod後得到唯一值
https://www.cnblogs.com/hongshijie/archive/2018/08/06/9432838.html
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int isPrime(int a)
{
if(a<2)
return 0;
for(int i=2; i<=sqrt(a); i++)
{
if(a%i==0)
return 0;
}
return 1;
}
int main()
{
int Msize,N,M;
cin>>Msize>>N>>M;
while(isPrime(Msize)==0)
Msize++;
int ha[Msize];
fill(ha,ha+Msize,-1);
int sn[M];
for(int i=0; i<N; i++)
{
int num;
cin>>num;
int signIn=0;
for(int step=0; step<=Msize/2; step++)
{
if(ha[(num+step*step)%Msize]==-1)
{
signIn=1;
ha[(num+step*step)%Msize]=num;
break;
}
}
if(signIn==0)
{
printf("%d cannot be inserted.\n",num);
}
}
int searchTime=0;
for(int i=0; i<M; i++)
{
int num;
cin>>num;
for(int step=0; step<=Msize; step++)
{
searchTime++;
int pos=num+step*step;
//cout<<pos<<' '<<(num+step*step)%Msize<<endl;
if(ha[(num+step*step)%Msize]==num||ha[(num+step*step)%Msize]==-1)
{
break;
}
}
}
//cout<<searchTime;
printf("%.1f",searchTime/(double)M);
return 0;
}