目录
一、冲突问题
当关键字集合很大时,关键字值不同的元素可能会映射到哈希表的同一地址上,即
,但
,这种现象称为冲突,此时称
和
为同义词。
二、处理冲突的方法
线性探测再散列
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
47 | 26 | 60 | 69 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
69 % 11 | 69 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(3+1) % 12 | 69 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(3+2) % 12 | 69 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(3+2) % 12 | 69 |
三、算法思想
1、首先计算 = hash(K);
2、如果单元 为空,则所查元素不存在;
3、 如果单元 中元素的关键字为K,则找到所查元素;
4、否则重复线性探测再散列法解决冲突的过程。
四、算法
#define m 12 /* 哈希表的长度 */
#define NULLKEY 32767 /* 代表空记录的关键字值 */
typedef int KeyType; /* 假设关键字为整型 */
/* 所使用的哈希函数 */
int hash(KeyType k) {
return k % 11;
}
/* 哈希表的查找算法 */
int HashSearch(HashTable ht, KeyType K) {
/* h0 —— 初次得到的哈希地址,hi —— 再散列得到的哈希地址 */
int h0 = hash(K), hi, i;
if (ht[h0].key == NULLKEY)
return -1;
else if (ht[h0].key == K)
return h0;
else {
for (i = 1; i <= m - 1; ++i) {
hi = hash(h0 + i);
if (ht[hi].key == NULLKEY)
return -1;
else if (ht[hi].key == K)
return h0;
}
return -1; /* 所有再散列的地址已被查找,代表所查元素不存在 */
}
}