Hash表的平方探测思路:如果当前这个没存放数值,就放进去,如果当前这个地方Hash [ i ] 已经有数值了,就以平方的间隔左右寻找没有存放数的空白 Hash [ i ]。
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int a[2000];
int Hash[2000];
int main()
{
int n,p;
while(~scanf("%d%d",&n,&p))
{
for(int i = 0; i < n; i ++)
{
scanf("%d",&a[i]);
}
memset(Hash,inf,sizeof(Hash)); //初始化一下。
for(int i = 0; i < n; i ++)
{
int d = a[i] % p;
if(Hash[d] == inf) // 如果这个地方没有存放数据,可以存放
{
Hash[d] = a[i];
a[i] = d; //里面更改成存放 a[i] 的下标值
}
else {
for(int j = 1; ; j ++) // 正反向寻找
{
int tm = j * j;
if(Hash[(d + tm)%p] == inf) // 记住别忘记 MOD p ,因为可能会超过给的表的长度
{
Hash[(d + tm)%p] = a[i];
a[i] = (d + tm)%p;
break;
}
else if(Hash[(d -tm)%p] == inf)
{
Hash[(d - tm)%p] = a[i];
a[i] = (d - tm)%p;
break;
}
}
}
}
for(int i = 0; i < n; i ++)
{
if(i == 0)printf("%d",a[i]);
else printf(" %d",a[i]);
}
printf("
");
}
return 0;
}