散列查找

来源:互联网 发布:淘宝店铺处罚规则 编辑:程序博客网 时间:2024/05/16 04:43

简要步骤

若找到元素与其在数据集中的位置存在的某种对应关系,那么就能通过这种关系找到数据的位置。这种对应关系被称为散列函数(哈希函数),通过这种函数简历的表被称为散列表(哈希表)。在构建哈希表的过程中也可能会产生冲突(也就是产生了相同的哈希值),所以解决冲突也是构建哈希表重要的组成部分。


构造哈希表

1. 直接定址法

根据哈希函数f(key) = a * key + b建立哈希表,该方法需要知道数据集中元素的分布情况,在实际应用中,直接定址法并不常用。

2. 数字分析法
在知道数据集中元素的情况下,尽量取元素不重复的几位值组成哈希地址,构成哈希表。

3. 平方取中法
取元素平方后的中间几位值为哈希地址。

4. 折叠法
将元素分为位数相等的若干部分(最后一部分的位数可以不同),然后把这几部分的值相加作为哈希地址(舍去进位)。

5. 除留余数法
将元素除以一个数p(p不大于哈希表表长m),取得余数后作为哈希地址。该方法在实际应用中是最常用的。f(key) = key % p (p<=m)。

6. 随机数法
取元素的随机函数值作为哈希地址。f(key) = random(key)。


处理冲突

1. 开放定址法

线性探测法

直接举例说明,我们使用除留取余法针对集合{1, 2, 3, 11, 8},由f(key) = key % 5可以得到下表:


可以发现余数为1,3的位置有两个元素值,这种情况就是冲突。我们可以将元素值加1,f(11) = f(12) = 12 % 5 = 2,发现2的位置也被占了,直到余数是4时,位置为空,那么此时我们就将11存入4的位置。元素8同理存到了0的位置,最终得到下表:


使用上述方法开放定址法为线性探测法。


二次探测法

线性探测法解决冲突的方法是f(key) = f(key + di), di = 1, 2, 3…

而二次探测法是f(key) = f(key + di), di = 1, 4, 9…

两者的区别是线性探测法每次走一个步长,二次探测法每次走一个步长的平方。


双重散列法

使用两个哈希函数f(key)和f1(key)计算哈希地址。f(key) = f(key + i * f1(key)), di = i * f1(key), i = 0, 1, 2…


2. 拉链法

拉链法解决冲突的方法是将所有同一位置的冲突点都链接在一个单链表中。



3. 再哈希法

设计两种或多种哈希函数来避免冲突。



原创粉丝点击