1078 Hashing (25 分)
题意
给出一组数,把这组数插入hash表,散列公式为 H(key)=key%TSize 。解决冲突方法为正向平方探测法(H+1^2 H+2^2 H+3^2…)。当给出的TSize不是质数时把它变为不小于它的最小质数。输出插入数据的位置,如果某数无法插入,输出‘-’。
TSize<10^4
思路
先用欧拉筛找出范围内的素数,得到不小于TSize的最小质数。然后对给出的数进行散列插入。注意正向平方探测的范围应该是0-TSize-1(设一个很大的数也可以卡过),证明见算法笔记p216。注意1不是质数。注意TSize的范围在10^4之内,但不小于它的最小质数可能要超过1e4。
代码
#include<stdio.h>
#include<string.h>
int number[1000007],prime[1000007];
int x[10007],vis[1000007];
void Prime()
{
int n=1000007;
int count=0;
memset(number,0,sizeof(number));
number[1]=1;
for(int i=2;i<n;i++){
if(number[i]==0){
prime[count++]=i;
}
for(int j=0;j<count&&i*prime[j]<n;j++){
number[i*prime[j]]=1;
if(i%prime[j]==0){
break;
}
}
}
}
int main()
{
Prime();
int n,msize,pos,flag;
memset(vis,0,sizeof(vis));
scanf("%d%d",&msize,&n);
if(number[msize]!=0){
for(int i=0;;i++){
if(prime[i]>msize){
msize=prime[i];
break;
}
}
}
for(int i=0;i<n;i++){
scanf("%d",&x[i]);
}
for(int i=0;i<n;i++){
if(i!=0){
printf(" ");
}
flag=0;
for(int j=0;j<msize;j++){
pos=(x[i]+j*j)%msize;
if(vis[pos]==0){
printf("%d",pos);
vis[pos]=1;
flag=1;
break;
}
}
if(flag==0){
printf("-");
}
}
return 0;
}