哈希(HASH)冲突的处理方法

通过构造良好的哈希函数可以减少冲突,但一般不能完全避免冲突。因此解决冲突是哈希法的另一个关键问题。常用的解决冲突方法有以下四种。

  • 开放地址法
    这种方法也称再散列法,基本思想是当关键字key的哈希地址p = H(key)冲突时,以p为基础再产生一个新的哈希地址p1,p1再冲突时,再以p为基础,产生地址p2……知道产生一个不冲突的地址pi,再将key填入其中,这种方法都有一个通用的再散列表达式
Hi = (H(key)+ di)%m
其中H(key)是哈希函数,m为表长,di是增量序列,增量的取值方式不同,相应的再散列方式也不相同,主要有以下三种。

(1)线性探测再散列

i = 1,2,3,4……..m-1.
采用这种方法冲突发生时,查看下一单元,直到找到一个空的单元,或者遍历全表。

(2)二次探测再散列

m = 1^2,-1^2 ,2^2,-2^2……k^2,-k^2.(k < m/2).
采用这种方法冲突发生时在表的左右进行探测比较灵活。

(3)伪随机探测再散列

i = 伪随机数序列
具体实现时需要建立一个伪随机数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希冲突是指不同的键值对被哈希函数映射到了同一个桶中,解决哈希冲突方法主要有以下几种: 1. 地址(Chaining):在每个哈希桶中维护一个表,发生冲突时将新的键值对插入表中。这种方法简单易懂,但是可能导致表过长,影响查找效率。 2. 开放地址(Open Addressing):当一个哈希桶被占用时,尝试将键值对插入到其他未被占用的桶中,直到找到一个空桶或者所有桶都被占用。常见的开放地址包括线性探测二次探测和双重哈希等。 3. 建立公共溢出区(Overflow Area):当哈希桶被占用时,将冲突的键值对存储在一个公共的溢出区中。这种方法需要额外的存储空间,而且查找效率可能降低。 举个例子,假设我们有一个哈希表,其中存储了以下键值对: ``` {"apple": 3, "banana": 5, "orange": 2, "pear": 4} ``` 如果我们使用简单的取余哈希函数将键映射到桶中,可能出现以下情况: ``` hash("apple") % 4 = 3 hash("banana") % 4 = 1 hash("orange") % 4 = 2 hash("pear") % 4 = 0 ``` 可以看到,"apple" 和 "pear" 映射到了同一个桶中,发生了哈希冲突。如果我们使用地址来解决冲突,可以在第三个桶中维护一个表,将 "apple" 和 "pear" 存储在表中。如果我们使用开放地址来解决冲突,可以尝试将 "apple" 插入到第四个桶中,但发现已经被占用了,于是继续尝试第一个桶,发现空闲,于是将 "apple" 存储在第一个桶中。这样就避免了哈希冲突
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值