1078 Hashing (25分)
分析:
给一个mszie和n个数,要求输出每一个数在散列表中的位置。使用正向平方探测法。如果msize不是质数,则往上寻找一个最小的质数替代。
使用hashTable记录每个位置是否存放值。
注意正向平方探测的方法是 M = (a + step * step) % msize ,step从1一直增长到msize(可以证明如果达到msize时还无法插入,则这个元素无法被插入)。
C++:
#include <cstdio>
#include <cmath>
const int maxn = 10010;
bool hashTable[maxn];
bool isPrime(int n) {
if (n <= 1) return false;
int sqr = (int) sqrt(n * 1.0);
for (int i = 2; i <= sqr; i++) {
if (n % i == 0) return false;
}
return true;
}
int main() {
int msize, n;
scanf("%d %d", &msize, &n);
while (isPrime(msize) == false) {
msize++;
}
int a;
for (int i = 0; i < n; i++) {
scanf("%d", &a);
int mod = a % msize;
if (hashTable[mod] == false) {
hashTable[mod] = true;
if (i == n - 1) {
printf("%d", mod);
} else {
printf("%d ", mod);
}
} else {
int step;
for (step = 1; step < msize; step++) {
mod = (a + step * step) % msize;
if (hashTable[mod] == false) {
hashTable[mod] = true;
if (i == n - 1) {
printf("%d", mod);
} else {
printf("%d ", mod);
}
break;
}
}
if (step >= msize) {
if (i == n - 1) {
printf("-");
} else {
printf("- ");
}
}
}
}
return 0;
}