Hash函数简单理解(二)

好的哈希函数可以减少冲突,但是不能完全避免冲突。在查找哈希表和创建哈希表都会遇到冲突;在解决这两种冲突时采用统一的方法。常见的四种方法:(1)开放定址法(2)建立公共溢出区(3)链地址法(4)再哈希法。
(1)开放定址法:核心思想:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,……….直到找出一个不冲突的哈希地址pi 。
通用的再算列函数形式:
Hi = (H(key)+di)%m ; i=1,2,3,……..,n(H(key)是哈希函数,di为增量序列,m是表长)
根据不同增量序列(di)再算列可以进一步分为三种方式( a); b); c)三种方式 )

例子:m=11,哈希函数为H(key)=key%11,则H(47)=3,H(26)=4,H(60)=5,假设下一个关键字为69,则H(69)=3,与47发生冲突。

a)伪随机探测再散列:di=为伪随机数序列,利用伪随机数处理冲突;建立一个伪随机发生器(如i=(i+p)%m),定一个随机数为起点。
伪随机数序列为:2,5,9………;下一个哈希地址为H1=(3 + 2)% 11 = 5,仍然冲突,再找下一个哈希地址为H2=(3 + 5)% 11 = 8,此时不再冲突,将69填入8号单元。

b)用线性探测再散列处理冲突: di=1,2,3,…,m-1;这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
用线性探测再散列处理冲突,下一个哈希地址为H1=(3 + 1)% 11 = 4,仍然冲突,再找下一个哈希地址为H2=(3 + 2)% 11 = 5,还是冲突,继续找下一个哈希地址为H3=(3 + 3)% 11 = 6,此时不再冲突,将69填入5号单元。
这里写图片描述

c)二次探测再散列: di=1^2,-1^,2^2,-2^2,…,k^2,-k^2 ( k<=m/2 ); 该方法特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。
k<=5.5;di = 1, -1, 4, -4, 9, -9, 16, -16, 25, -25; 下一个哈希地址为H1=(3 + 12)% 11 = 4,仍然冲突,再找下一个哈希地址为H2=(3 - 12)% 11 = 2,此时不再冲突,将69填入2号单元。
这里写图片描述
以上三种方式理解有参考他人博客部分参考内容链接

(2)建立公共溢出区:建立一个公共溢出区域,就是把冲突的都放在另一个地方;将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。具体内容参考

(3)链地址法:这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
参考网上ppt

(4)再哈希法:Hi=RHi(key) ; i=1,2,3,……..k;产生冲突时计算另一个哈希函数地址,直到冲突不再发生为止。哈希地址H1=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间
具体方法讲解

总结:(1)开放定址法(开放定址法;二次探测再散列;伪随机探测再散列)
(2)建立公共溢出区
(3)链地址法
(4)再哈希法。
以上四种方法是在查找哈希表和创建哈希表都会遇到冲突时常用的四种方法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值