整型关键字的平方探测法散列
将给定的无重复正整数序列插入一个散列表,输出每个输入的数字在表中的位置。所用的散列函数是 H(key)=key%TSize,其中 TSize 是散列表的表长。要求用平方探测法(只增不减,即H(Key)+i^2)解决冲突。
注意散列表的表长最好是个素数。如果输入给定的表长不是素数,你必须将表长重新定义为大于给定表长的最小素数。
输入格式:
首先第一行给出两个正整数 MSize(≤10^4)和 N(≤MSize),分别对应输入的表长和输入数字的个数。随后第二行给出 N 个不重复的正整数,数字间以空格分隔。
输出格式:
在一行中按照输入的顺序给出每个数字在散列表中的位置(下标从 0 开始)。如果某个数字无法插入,就在其位置上输出 -。输出间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
4 4
10 6 4 15
输出样例:
0 1 4 -
#include<bits/stdc++.h>
using namespace std;
#define SIZE 10001
bool isprime(int n)
{
for (int i = 2; i <= n / 2; i++)
{
if (n % i == 0) return false;
}
return true;
}
int main()
{
vector<int> v;
int MSize, N;
cin >> MSize >> N;
if (MSize == 1)
{
MSize = 2;
}
while (!isprime(MSize))
{
MSize++;
}
int* a = new int[MSize];
fill(a, a + MSize, 0); //数组初始化为0
int elem,pos,cpos;
int k = 1;
bool flag=false;
for (int i = 0; i < N; i++)
{
k = 1;
flag = false;
cin >> elem;
pos = elem % MSize;
if (a[pos] == 0) //该位置可插入
{
v.push_back(pos);
a[pos] = 1;
}
else
{
cpos = pos;
while (a[pos] != 0)
{
pos = (cpos + k * k) % MSize;
++k;
if (pos==cpos) //没有找到插入位置
{
flag = true;
break;
}
}
if (flag == true) v.push_back(-101);
else
{
v.push_back(pos);
a[pos] = 1;
}
}
}
for (int i = 0; i < v.size(); i++)
{
if (v[i] == -101) cout << "-";
else cout << v[i];
if (i != v.size() - 1) cout << " ";
}
delete[]a;
return 0;
}