处理散列冲突的方法
2016-03-03 08:59
211 查看
1. 开放定址法
开放定址法就是一旦发生冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。
Hi =
(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列。di可有下列三种取法:
(1)di=1,2,3,…,
m-1,称为线性探测再散列;
(2)di=1^2,
-(1^2), 2^2, -(2^2), 3^2, …, ±(k^2),(k<=m/2),称二为次探测再散列;
(3)di=伪随机数序列,称为伪随机探测再散列。
所谓伪随机数,用同样的随机种子,将得到相同的数列。
2. 再散列函数法
Hi=RHi(key),
i=1,2,…,k RHi均是不同的散列函数(比如除留余数、折叠、平方取中),在同义词产生地址冲突时就换用另一个散列函数计算散列地址,直到碰撞不再发生,这种方法不易产生“聚集”,但增加了计算时间。
3. 链地址法
将所有关键字为同义词的记录存储在一个单链表中,称这种表为同义词子表,在散列表中只存储所有同义词子表的头指针。
链地址法对于可能会造成很多冲突散列函数来说,提供了绝不会出现找不到地址的保障。但也就带来了查找时需要遍历单链表的性能损耗。
4. 公共溢出区法
为所有冲突的关键字记录建立一个公共的溢出区来存放。在查找时,对给定关键字通过散列函数计算出散列地址后,先与基本表的相应位置进行比对,如果相等,则查找成功;如果不相等,则到溢出表进行顺序查找。如果相对于基本表而言,在有冲突的数据很少的情况下,公共溢出区的结构对查找性能来说还是非常高的。
开放定址法就是一旦发生冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。
Hi =
(H(key) + di) MOD m, i=1,2,…, k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列。di可有下列三种取法:
(1)di=1,2,3,…,
m-1,称为线性探测再散列;
(2)di=1^2,
-(1^2), 2^2, -(2^2), 3^2, …, ±(k^2),(k<=m/2),称二为次探测再散列;
(3)di=伪随机数序列,称为伪随机探测再散列。
所谓伪随机数,用同样的随机种子,将得到相同的数列。
2. 再散列函数法
Hi=RHi(key),
i=1,2,…,k RHi均是不同的散列函数(比如除留余数、折叠、平方取中),在同义词产生地址冲突时就换用另一个散列函数计算散列地址,直到碰撞不再发生,这种方法不易产生“聚集”,但增加了计算时间。
3. 链地址法
将所有关键字为同义词的记录存储在一个单链表中,称这种表为同义词子表,在散列表中只存储所有同义词子表的头指针。
链地址法对于可能会造成很多冲突散列函数来说,提供了绝不会出现找不到地址的保障。但也就带来了查找时需要遍历单链表的性能损耗。
4. 公共溢出区法
为所有冲突的关键字记录建立一个公共的溢出区来存放。在查找时,对给定关键字通过散列函数计算出散列地址后,先与基本表的相应位置进行比对,如果相等,则查找成功;如果不相等,则到溢出表进行顺序查找。如果相对于基本表而言,在有冲突的数据很少的情况下,公共溢出区的结构对查找性能来说还是非常高的。
相关文章推荐
- VMware Workstation下Centos安装VMware Tools的解决方法
- 使用Eclipse进行远程调试
- 通过html<map>标签给图片加链接
- 【微积分】 05 - 多元微分
- SelectedRows.CurrentRowSelected 和 DeleteItem
- 【Android】17.0 第17章 服务绑定—本章示例主界面
- 解析Mysql字符集概念
- CSS布局:水平居中
- 看看baidu是如何AJAX跨域的[转]
- 插入排序
- linux存储技术与应用:UDEV配置
- 334. Increasing Triplet Subsequence
- 天声人語 20160303 認知症の人々の「世界」
- 2.leetcode题7:Reverse Integer
- javascript简介-
- 栈的弹入序列问题
- NSOperationQueue与GCD的使用原则和场景
- bananapi之DSI
- mac连接linux服务器
- 《基于MFC的OpenGL编程》Part 10 Blending, Antialiasing and Fog