哈希表及处理冲突的方法
来源:互联网 发布:域名 端口写法 编辑:程序博客网 时间:2024/05/16 09:37
哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表称为哈希表。这种方法的基本思想是:首先在元素的关键字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、建立公共溢出区
这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及处理冲突的方法
- 哈希表及 冲突处理方法
- 数据结构实验之栈一:进制转换
- 深度学习与计算机视觉(11)_基于deep learning的快速图像检索系统
- vue父子组件互相传值
- 恶搞别人电脑关机
- Linux内核Makefile文件
- 哈希表及处理冲突的方法
- HDU 1172 猜数字
- 数据类型
- 第四周项目3-单链表应用(3)
- c/c++经典算法面试题
- C++--开始(一)
- 浅谈关于CPU的架构和工艺(1)
- 密码变换
- 网站前端架构的优化总结