【数据结构】搜索中散列构造时冲突处理方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaotang_sama/article/details/78835200

一、冲突产生原因

散列函数是一个压缩映象函数。关键码集合比散列表地址集合大得多。因此有可能经过散列函数的计算,把不同的关键码映射到同一个散列地址上,就会产生冲突。

二、处理冲突的方法之一—闭散列法,也称开地址法

1.线性探查法:
(1)方法概述
先用除留余数法计算散列地址 hash(key) = key % p
若发现冲突,则使用增量 i 探查空的散列地址,直至无冲突出现为止。
H0 = hash (key)
Hi = (H0 + i) % m, i =1, 2, …, m-1
例题:
这里写图片描述

(2)线性探查法平均搜索长度ASL
搜索成功的平均搜索长度 ASLsucc 是指找到表中已有表项的平均探查次数,是找到表中各个已有表项的探查次数的平均值。如:
这里写图片描述

2.二次探查法
(1)方法概述
先用除留余数法计算散列地址 hash(key) = key%p,若发现冲突,则使用增量 + i 2探查空的散列地址,直至无冲突出现为止。
H0 = hash(key)
Hi = (H0+i2) % m, Hi = (H0-i2)% m,
i = 1, 2, 3, …, (m-1)/2,m 是表的大小
二次探查法的探查序列形如:
H0, H0+1, H0-1, H0+4, H0-4, H0+9, H0-9, …。

举例:这里写图片描述

(2)二次探查法平均搜索长度
计算方法同线性探查法

3.伪随机探查法
先用除留余数法计算散列地址 hash(key) = key%p,
若发现冲突,则用一个伪随机数序列 探查空的散列地址,直至无冲突出现为止。
H0 = hash (key)
Hi = (H0 + i ) % m, i =r1, r2, r3, … (伪随机数序列)
举例:
这里写图片描述

4.双散列法
使用双散列方法时, 需要两个散列函数:
• 第一个散列函数按表项的关键码 key 计算散列地址,H0 = Hash(key)。
• 一旦发生冲突,就利用第二个散列函数ReHash()计算下一个散列地址的移位量。它的取值与key的值有关, 要求它的取值小于散列表的长度m,且与表长m为互质的正整数。
• H0 = Hash(key), p = ReHash(key);
• Hi = (Hi-1+ p) % m; p是小于m且与m互质的整数
• 利用双散列法, 按一定的距离, 跳跃式地寻找下一个空的散列地址, 减少了“堆积”的机会。
举例
这里写图片描述

这里写图片描述

二、处理冲突的方法之二—开散列法(链地址法)

这里写图片描述
即将同义词放在同一子集,前后用指针联结即可
优点:
① 处理冲突简单,无堆积现象,因此平均查找长度 较短; ② 由于链地址法中链表上的结点空间是动态申请的,故它更适合于构造散列表前无法确定表长的情况; ③ 开放定址法为减少冲突,必须保持大量空闲的存储空间以确保搜索效率;而链地址法中,当结点数目较大时,增加的指针域可忽略不计,因此能节省存储空间; ④ 用链地址法构造的散列表中,删除结点易于实现。而开放地址法构造的散列表,只能在被删的表项上做删除标记,不能真正删除表项。

注:图片来自于济南大学信息科学与工程学院数据结构课程课件

没有更多推荐了,返回首页