数据结构中处理散列冲突的四种方法

1 开放定址法

1.1 定义

开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址

1.2 要求

只要散列表足够大

空的散列地址总能找到,并将记录存入

1.3 线性探测法

使用该公式用于解决冲突的开放定址法称为线性探测法

对于线性探测法,在出现冲突时,它只能晚后一步一步检测看是否有空位置

假设此时该冲突位置后续没有可用位置,但前面有一个空位置

尽管可以不断地求余数后得到结果,但效率很差

1.4 二次探测法

因此可以改进该算法,增加双向寻找可能的空位置,这种新算法称为二次探测法:

1.5 随机探测法

此外还有一种方法是,在冲突时,对于位移量 di采用随机函数计算得到,我们称为随机探测法


注意

这里的随机其实是伪随机数

即设置相同的随机种子,则不断调用随机函数的过程中就可以生成不会重复的数列

同时,在查找时,用同样的随机种子,它每次得到的数列也是相同的

因此相同的di就可以得到相同的散列地址

2 再散列函数法

2.1 散列函数

即提供多个散列函数

2.2 解释

这里的RHi就是不同的散列函数然后每当发生散列地址冲突时

就换一个散列函数计算

相信总会有一个可以把冲突解决掉(todo:: how to search??)

2.3 优点弊端

2.3.1 优点

这种方法能够使得关键字不产生聚集

2.3.2 弊端

当然,相应地也增加了计算的时间

3 链地址法

3.1 定义

将所有关键字为同义词(即哈希地址相同)的记录存储在一个单链表中,我们称这种表为同义词子表

在散列表中只存储所有同义词子表的头指针

3.2 优点弊端

3.2.1 优点

链地址法对于可能会造成很多冲突的散列函数来说

提供了绝不会出现找不到地址的保障

3.2.2 弊端

当然,这也就带来了查找时需要遍历单链表的性能损耗

4 公共溢出区法

即为所有冲突的关键字建立一个公共的溢出区来存放

在查找时,对给定值通过散列函数计算出散列地址后先与基本表的相应位置进行比对如果相等,则查找成功如果不相等,则到溢出表去进行顺序查找如果对于基本表而言,有冲突的数据很少的情况下

公共溢出区的结构对查找性能来说还是非常高的

相关推荐
米尔的可达鸭2 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana22 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
Frostnova丶3 小时前
(15)LeetCode 189. 轮转数组
数据结构·算法·leetcode
来一碗刘肉面5 小时前
顺序表的按值查找
数据结构·c++·算法
小肝一下6 小时前
2. 顺序表和链表
c语言·数据结构·c++·链表·dijkstra·依蕾娜·香香的依蕾娜
j7~6 小时前
【数据结构初阶】带头双向循环链表 (DSList) --增删查改完整实现详解
c语言·数据结构·链表·带头双向循环链表
石像鬼₧魂石6 小时前
贵州商会管理系统 —— 商协会数字化运营一站式平台
大数据·数据结构·物联网·eclipse·数据库架构
Java面试题总结6 小时前
区间树:反向映射的前置数据结构
java·前端·数据结构
想做小南娘,发现自己是女生喵16 小时前
【无标题】
数据结构·算法
凤凰院凶涛QAQ21 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构