散列方法
哈系表有 m 个槽,如何将关键字 key 散列到哈系表的槽中呢?
除法散列方法
散列结果由下列散列函数决定:
hash(key) mod m
其中 m 是 hash 表的大小,注意 m 的选择:
(1) m 不应是 2 的幂。原因分析如下:
散列的发散程度取决于 hash(key) mod m 的分布范围,
假设 m = 2^p, 对 m 取余,结果等于哈系值中二进制的最低 p 位,
如果哈希值最低 p 位的排列很相似,则 hash(key) mod m 的分布
范围很小,关键字的发散程度就不够好。
(2) 经验表明, 取 m 为与 2 的整数幂不太接近的素数。
可以选择与 [ 2^p + 2^(p+1) ] /2 最接近的一个素数。
一个经典的哈系函数
不断地乘以 33, 至于为什么选择 33, 还没足够充分的解释,经验所得。
unsigned long hash(unsigned char *str)
{
unsigned long value = 5381;
unsigned char *p;
for (p = str; *p; p++) {
value = (value << 5) + value + *p;
}
return value;
}
处理冲突的方法
链

本文介绍了散列表的散列方法,包括除法散列和一个经典的哈希函数。在处理冲突方面,讨论了开放寻址法,详细阐述了线性探查、二次探查和双重散列三种技术,分析了它们的优缺点及群集现象。

8678

被折叠的 条评论
为什么被折叠?



