Description
使用线性探测法(Linear Probing)可以解决哈希中的冲突问题,其基本思想是:设哈希函数为h(key) =d,并且假定哈希的存储结构是循环数组,则当冲突发生时,继续探测d+1,d+2,…,直到冲突得到解决。
例如,现有关键码集为{47,7,29,11,16,92,22,8,3},设哈希表表长为m=11,哈希函数为Hash(key)=key mod 11,采用线性探测法处理冲突。
建哈希表如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 22 | 47 | 92 | 16 | 3 | 7 | 29 | 8 |
现在给定哈希函数为Hash(key)=key mod m,要求按照上述规则,使用线性探测法处理冲突。要求建立起相应哈希表,并按要求打印。
Input
仅有一个测试用例,第1行为整数n与m(1<= n, m<=10,000),n代表key的总数,m代表哈希表的长度,并且令哈希函数为Hash(key)=key mod m。
接下来n行,每行一个整数,代表一个key,其中key与key两两不相同(0<=key<=10,000)。
Output
输出建立好的hash表,比如下表:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 22 | 47 | 92 | 16 | 3 | 7 | 29 | 8 |
应输出
0#11
1#22
2#NULL
3#47
4#92
5#16
6#3
7#7
8#29
9#8
10#NULL
Sample Input
3 5 1 5 6
Sample Output
0#5 1#1 2#6 3#NULL 4#NULL
直接上代码:
1 #include <iostream> 2 using namespace std; 3 4 int hash(int key, int len) { 5 return (key % len); 6 } 7 8 int hashTable[10000]; 9 10 void initializeHash(int size, int lenOfHash) { 11 int temp; 12 13 for (int i = 0; i < size; i++) { 14 cin >> temp; 15 16 if (hashTable[hash(temp, lenOfHash)] == -1) { 17 hashTable[hash(temp, lenOfHash)] = temp; 18 } else { 19 int pos = hash(temp, lenOfHash); 20 while (hashTable[pos] != -1) { 21 pos = (pos + 1) % lenOfHash; 22 } 23 24 hashTable[pos] = temp; 25 } 26 } 27 } 28 29 void print(int lenOfHash) { 30 for (int i = 0; i < lenOfHash; i++) { 31 if (hashTable[i] != -1) { 32 cout << i << "#" << hashTable[i] << endl; 33 } else { 34 cout << i << "#NULL" << endl; 35 } 36 } 37 } 38 39 int main() 40 { 41 int numOfKey, lenOfHash; 42 43 cin >> numOfKey; 44 cin >> lenOfHash; 45 46 for (int i = 0; i < lenOfHash; i++) { 47 hashTable[i] = -1; 48 } 49 50 initializeHash(numOfKey, lenOfHash); 51 52 print(lenOfHash); 53 54 return 0; 55 }