哈希表的设计与冲突解决
来源:互联网 发布:张玉宁荷甲数据 编辑:程序博客网 时间:2024/05/16 08:25
哈希法又称散列法、杂凑法以及关键字地址计算法等,相应的表称为哈希表。这种方法的基本思想是:首先在元素的关键字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
图8.25
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.
4、建立公共溢出区
这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表
- 哈希表的设计与冲突解决
- Hash表的设计与冲突解决
- 哈希表冲突的解决
- U8与RTX2006冲突的解决
- NetBeans与SCIM的冲突解决
- 解决验证控件与 OnClientClick 的冲突
- VC2005与IE8的冲突解决
- 解决VC6与Office2007冲突的问题
- 解决UpdatePanel 与 jQuery的冲突
- VC2005与IE8的冲突解决
- apache2 与 IIS端口冲突的解决
- 解决VC6与Office2007冲突的问题
- svn 冲突的产生与解决
- 解决UpdatePanel 与 jQuery的冲突
- 解决jboos7与项目log4j的冲突
- 解决distinct与order by 的冲突
- listview 与activity的onTouchevent 冲突解决
- OpenLayers与Bootstrap样式冲突的解决
- 关于海量数据查找排序问题
- java基础之反射
- qt creater 编程自动补全和快捷键
- Eclipse控制台乱码
- windows下java JNI编程技巧——JAVA调用c/c++(4) .
- 哈希表的设计与冲突解决
- libzmq.so.3 => not found
- 使用LVPM缩小wubi安装的ubuntu虚拟硬盘
- 使用C++调用NLTK
- Android权限大全
- VBS设置系统的环境变量
- 指令 ssh 及 putty Linux 和 Windows客户端
- iOS学习之iOS程序名称及内容国际化(本地化) .
- js单步调试方法