- 题目
11-散列2 Hashing (25分) - 分析
这一道题的难点在于对于那些永远无法插入的数字,何时可以断定它无法插入。
冲突解决方法是平方探测,且只有正数,那么每次冲突后的增量便是:1^2, 2^2, 3^2, 4^2, … , tableSize*2,(tableSize+1)^2, (tableSize+2)^2, …
当达到(tableSize + i)^2 = tableSize*tableSize + 2*tableSize + i^2 时,我们就发现 ,它展开之后对tableSize取余,有影响的只有i,而i已经算过了。所以一旦增量达到tableSize*2,我们便可以断定该数字无法插入哈希表中了。 - 我的代码
int nextPrime(int n){
if(n==1) return 2;
int p = (n%2==1) ? n+2 : n+1;
while (1) {
int i;
for(i=3; i*i<=p; i+=2){
if(p%i == 0) break;
}
if(i*i > p) break;
else p += 2;
}
return p;
}
int getPos(int hashTable[], int data, int tableSize){
int oldKey = data%tableSize, newKey = oldKey;
int step = 1;
while (1) {
if(hashTable[newKey] == -1){
hashTable[newKey] = data;
return newKey;
}else{
newKey = (oldKey+step*step)%tableSize;
}
step++;
if(step > tableSize) return -1;
}
}
int main(int argc, const char * argv[]) {
int M, N, tmp;
int pos;
scanf("%d%d", &M, &N);
int tableSize = nextPrime(M);
int hashTable[tableSize];
for(int i=0; i<tableSize; i++){
hashTable[i] = -1;
}
for(int i=0; i<N; i++){
scanf("%d", &tmp);
pos = getPos(hashTable, tmp, tableSize);
if(pos == -1) printf("-");
else printf("%d", pos);
if(i != N-1) printf(" ");
else printf("\n");
}
return 0;
}