将一个由若干个不同正整数构成的整数序列插入到一个哈希表中,然后输出输入数字的位置。
哈希函数定义为 H(key)=key%TSize,其中 TSize 是哈希表的最大大小。
利用只具有正增量的二次探测法来解决冲突。
注意,哈希表的大小最好是素数,如果用户给出的最大大小不是素数,则必须将表大小重新定义为大于用户给出的大小的最小素数。
输入格式
第一行包含两个整数 MSize 和 N,分别表示用户定义的表的大小以及输入数字的数量。
第二行包含 N 个不同的正整数,数字之间用空格隔开。
输出格式
在一行中,输出每个输入数字的相应位置(索引从 0 开始),数字之间用空格隔开,行尾不得有多余空格。
如果无法插入某个数字,则输出 -。
数据范围
1≤MSize≤104,
1≤N≤MSize,
输入数字均在 [1,105] 范围内。
输入样例:
4 4
10 6 4 15
输出样例:
0 1 4 -
哈希平方探测解决冲突。
哈希函数mod=(x+k·k)%size,k为0代表直接为mod=x%size。而且可以证得k在0-size-1内是有效判断,超过即是重复判断,可跳出。即mod=(x+k·k)%size==(x+(k+size)·(k+size))%size,所以循环size-1次就可判断。
#include <bits/stdc++.h>
using namespace std;
int a[10010],num[10010];
int n,m;
vector<int> v;
bool f(int x)
{
if(x==1)
return false;
if(x==2)
return true;
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0)
return false;
}
return true;
}
int main()
{
cin >> n >>m;
int siz;
for(siz=n;;siz++)
{
if(f(siz))
break;
}
for(int i=1;i<=m;i++)
{
int x;
cin >> x;
int k;
for( k=0;k<siz;k++)
{
int mod = (x+k*k)%siz;
if(a[mod] == 0)
{
a[mod] = x;
v.push_back(mod);
break;
}
}
if(k>=siz)
v.push_back(-1);
}
for(int i=0;i<v.size();i++)
{
if(i)
cout <<" ";
if(v[i]==-1)
cout <<"-";
else
cout <<v[i];
}
return 0;
}