哈希表及处理冲突的方法
来源:互联网 发布:php asp.net 编辑:程序博客网 时间:2024/05/16 09:09
哈希表及处理冲突的方法
(2011-10-10 15:32:22)杂谈
分类: 其他哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表称为哈希表。这种方法的基本思想是:首先在元素的关键字k和元素的存储位置p之间建立一个对应关系f,使得p=f(k),f称为哈希函数。创建哈希表时,把关键字为k的元素直接存入地址为f(k)的单元;以后当查找关键字为k的元素时,再利用哈希函数计算出该元素的存储位置p=f(k),从而达到按关键字直接存取元素的目的。
综上所述,哈希法主要包括以下两方面的内容:
8.4.1 哈希函数的构造方法
下面介绍构造哈希函数常用的五种方法。
1.
2.
当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。
例:我们把英文字母在字母表中的位置序号作为该英文字母的内部编码。例如K的内部编码为11,E的内部编码为05,Y的内部编码为25,A的内部编码为01, B的内部编码为02。由此组成关键字“KEYA”的内部代码为11052501,同理我们可以得到关键字“KYAB”、“AKEY”、“BKEY”的内部编码。之后对关键字进行平方运算后,取出第7到第9位作为该关键字哈希地址,如图8.23所示。
关键字
内部编码
内部编码的平方值
H(k)关键字的哈希地址
KEYA
11050201
122157778355001
778
KYAB
11250102
126564795010404
795
AKEY
01110525
001233265775625
265
BKEY
02110525
004454315775625
315
图8.23平方取中法求得的哈希地址
3.
1
6
2
1
+)
(a)移位叠加
4.
假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为
h(k)=k
例如,已知待散列元素为(18,75,60,43,54,90,46),表长m=10,p=7,则有
此时冲突较多。为减少冲突,可取较大的m值和p值,如m=p=13,结果如下:
此时没有冲突,如图8.25所示。
0
54
43
18
46
60
75
90
5.
在实际应用中,应根据具体情况,灵活采用不同的方法,并用实际数据测试它的性能,以便做出正确判定。通常应考虑以下五个因素
l
l
l
l
l
8.4.2
1.
这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi
l
这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
l
l
具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点。
例如,已知哈希表长度m=11,哈希函数为:H(key)= key
0
47
26
60
69
0
69
47
26
60
0
47
26
60
69
从上述例子可以看出,线性探测再散列容易产生“二次聚集”,即在处理同义词的冲突时又导致非同义词的冲突。例如,当表中i, i+1 ,i+2三个单元已满时,下一个哈希地址为i,
2.
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。
3.
例如,已知一组关键字(32,40,36,53,16,46,71,27,42,24,49,64),哈希表长度为13,哈希函数为:H(key)= key % 13,则用链地址法处理冲突的结果如图8.27所示:
图8.27
本例的平均查找长度
4、建立公共溢出区
这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及 冲突处理方法
- hadoop
- Linux下添加FTP账号和服务器、增加密码和用户,更改FTP目录
- MYSQL常用命令
- nginx安装和使用
- 软件架构设计箴言理解
- 哈希表及处理冲突的方法
- Oracle GoldenGate 监控工具:ggserr.log 错误日志不可忽视
- Myeclipse下java.lang.OutOfMemoryError: Java heap space的解决
- 141 - The Spot Game
- QT 停顿1秒、QT LCD显示
- Ubuntu安装Eclipse及SVN插件
- Servlet概述
- linux下编译flash
- Data Guard日志传输优化------网络传输优化实践