/*
1.只含有正的增量序列
2.不存在hash的判断:
当k >= m 时开始从与k = 0重复,故仅需判断k <= m即可;
*/
#include <stdio.h>
#include <string.h>
#include <math.h>
int H[100005];
int Hash(int x, int m) {
int k = 1, pos;
pos = x%m;
if(H[pos] == -1) {
H[pos] = 1;
return pos;
}
else {
while(H[pos] != -1) {
if(H[(pos+k*k)%m] == -1) {
H[(pos+k*k)%m] = 1;
return (pos+k*k)%m;
}
k++;
if(k >= m) return -1;
}
}
}
int NextPrime(int n) {
int p = n%2==0 ? n+1 : n+2;
if(n == 1) return 2;
int i;
while(1) {
for(i = (int)sqrt(p); i > 2; i--)
if(p%i == 0) break;
if(i == 2) break;
else p += 2;
}
return p;
}
int main() {
int m, n, x;
int i;
int flag = 1, t;
scanf("%d%d", &m, &n);
m = NextPrime(m);
for(i = 0; i < m; i++) H[i] = -1;
for(i = 0; i < n; i++) {
scanf("%d", &x);
if(flag) flag = 0;
else printf(" ");
t = Hash(x, m);
if(t != -1) printf("%d", t);
else printf("-");
}
return 0;
}
11-散列2 Hashing (25分)
最新推荐文章于 2022-09-03 12:46:35 发布