这题有点坑爹,数据结构课没有认真听的我看见平方探测法真是一脸懵。
思路:
1.平方探测可以解决线性探测中的一次聚集问题,常用的函数是f(i)=±i2,题目所说是正增长,则f(i)=i2;
2.在i的范围这块,我一直有疑问,i的范围应该是0~TableSize-1,因为(a+TableSize2)%TableSize==a,到TableSize多此一举,但是这题的范围就是到TableSize;
代码:
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
bool isPrime(int n)
{
if(n<2) return false;
int sqr=(int)sqrt(n*1.0);
for(int i=2;i<=sqr;i++)
if(n%i==0) return false;
return true;
}
int main()
{
int msize,n,m,value,j;
float count=0;
scanf("%d%d%d",&msize,&n,&m);
while(!isPrime(msize)) msize++;
vector<int> v(msize);
for(int i=0;i<n;i++)
{
scanf("%d",&value);
for(j=0;j<msize;j++)
if(v[(value+j*j)%msize]==0)
{
v[(value+j*j)%msize]=value;
break;
}
if(j==msize)
printf("%d cannot be inserted.\n",value);
}
for(int i=0;i<m;i++)
{
scanf("%d",&value);
for(j=0;j<=msize;j++)
{
count++;
if(v[(value+j*j)%msize]==value||v[(value+j*j)%msize]==0) break;
}
}
printf("%.1f",count/m);
return 0;
}