哈希算法和解决哈希冲突的四种方法

哈希算法和解决哈希冲突的四种方法

http://blog.csdn.net/qq_27093465/article/details/52269862
哈希函数有五种实现方式:
A. 直接定址法:取关键字的线性函数值作为哈希地址。
B. 数字分析法:取关键字的中的若干位作为哈希地址。
C. 平方取中法:取关键字平方后的中间几位作为哈希地址。
D. 折叠法:将关键字分割成位数相同的几部分(最后一部分可以不同),然后取这几部分的叠加和作为哈希地址。
E. 除留余数法:H(key) = key MOD p ,p<=m ,m为不大于哈希表的数。
F. 随机函数法
上述五中实现方式中最常用的是除留余数法,而通过哈希函数寻址的过程可能出现“冲突”------即若干个不同的key却对应相同的哈希地址。解决哈希冲突有如下的方法:

1、开放定址法(线性探测,二次探测,伪随机探测)

2、链地址法

3、再散列(双重散列,多重散列)

当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突。缺点:计算时间增加。

4、建立一个公共溢出区

假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。

image.png

一个线性探测再散列(开放定址法线性探测)的例子:

已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key) = key%7计算散列地址,并散列存储在散列表A【0....6】中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为()//平均查找长度就是各数查找次数之和/6。

解题步骤:

线性表(38,25,74,63,52,48)

1:进行38这个数据处理 :38%7 = 3,直接把38放在3这个位置1

[0][1][2][3][4][5][6]---->[0][1][2][38][4][5][6]

2:处理25 25%7=4,同样把25放在4就行 2

[0][1][2][38][25][5][6]

3:接下来是74 74%7=4,但是这时候4上已经放了25了。得进行线性探测。3

H(74) = 4;根据线性探测:D(i)=(H(i)+d)MOD M(M为散列表长度7)

d=1时候 D(1) = (4+1)%7=5散列表中5位置为空,所以可以把74放在位置5处。4

[0][1][2][38][25][74][6]

4:接下来是63 63%7=0直接把63放在0处 5

[63][1][2][38][25][74][6]

5:接下来是52 52%7=3但是位置3已经有38了冲突6

线性探测:D(1)=(3+1)%7=4 4上有25了 冲突7

D(2)=(3+2)%7=5 5上有74了 冲突 8

D(3) = (3+3)%7=6可以 把52放在6位置上9

[63][1][2][38][25][74][52]

6:接下来是48

48%7=6 6位置有52了冲突10

D(1)=(6+1)%7=0 0上有63了冲突11

D(2)=(6+2)%7=1 1上还木有。可以放12

最终结果:[63][48][2][38][25][74][52]
从表中可以看出2位置为空。冲突和比较一共进行了12次,有6个元素。长度为12/6=2.

猜你喜欢

转载自blog.csdn.net/u010412301/article/details/86471138