首先要知道Quadratic probing的中文意思:二次探测法。
二次探测法用于解决hash冲突问题,如果不清楚,可以翻阅《数据结构与算法分析 C语言描述》系统地复习一遍,会更有帮助。
值得注意的是,二次探测法有可能插入失败,失败判断条件是增量i大于等于散列表的size,这个可以用公式证明。
下面是插入的关键函数
int insert(int x,int TSize)
{
int pos = x%TSize;
int increment = 1;
while (hash[pos] == true) // occupied, Quadratic probing
{
pos = (x%TSize + increment*increment) % TSize;
// end condition
if (increment > TSize)
{
return -1;
}
increment++;
}
return pos;
}
AC代码
#include<stdio.h>
int prime[11000];
bool mark[11000];
int primeSize = 0;
bool hash[11000];
void init()
{
for (int i = 0; i < 11000; i++)
{
hash[i] = false;
}
for (int i = 0; i < 11000; i++)
{
mark[i] = false;
}
for (int i = 2; i < 150; i++)
{
if (mark[i] == true)
{
continue;
}
for (int j = i*i; j < 11000; j += i)
{
mark[j] = true;
}
}
for (int i = 2; i < 11000; i++)
{
if (mark[i] == false)
{
prime[primeSize++] = i;
}
}
}
int redefineTSize(int MSize)
{
for (int i = 0; i < primeSize; i++)
{
if (prime[i] >= MSize)
{
return prime[i];
}
}
return -1;
}
int insert(int x,int TSize)
{
int pos = x%TSize;
int increment = 1;
while (hash[pos] == true) // occupied, Quadratic probing
{
pos = (x%TSize + increment*increment) % TSize;
// end condition??
if (increment > TSize)
{
return -1;
}
increment++;
}
return pos;
}
int main()
{
int MSize, N;
scanf("%d%d", &MSize, &N);
init();
MSize = redefineTSize(MSize);
int n;
scanf("%d", &n);
int pos = insert(n, MSize);
printf("%d", pos);
hash[pos] = true;
for (int i = 1; i < N; i++)
{
scanf("%d", &n);
pos = insert(n, MSize);
if (pos == -1)
{
printf(" -");
}
else
{
printf(" %d", pos);
hash[pos] = true;
}
}
printf("\n");
return 0;
}