哈希(散列)查找

本文详细介绍了哈希表的数据结构定义、哈希函数的类型(如除留余数法、直接定址法和数字分析法),以及处理冲突的策略,包括开放定址法、再哈希法和拉链法。还提及了装填因子的概念。
摘要由CSDN通过智能技术生成

1.哈希表(HashTable)

(1)哈希表定义
又称散列表,是一种数据结构,数据元素的关键字与其存储地址直接相关
(2)同义词
若不同的关键字通过散列函数映射到同一个值,则称为“同义词”
(3)冲突
通过散列函数确定的位置已经存放了其他元素,则称这种情况为“冲突”
(4)填装因子
装填因子=表中记录数/散列表长度

2.常见哈希函数

哈希函数描述公式适用场景
除留余数法散列表表长为m,取一个不大于m但最接近或等于m的质数p H ( k e y ) = k e y % p H(key)=key\%p H(key)=key%p关键字范围相差较大的情况
直接定址法通过取关键字或关键字的某个线性函数值为哈希值,从而确定数据在哈希表中的存储位置 H ( k e y ) = k e y H(key)=key H(key)=key H ( k e y ) = a ∗ k e y + b H(key)=a*key+b H(key)=akey+b关键字的分布基本连续的情况
数字分析法选取数码分布较为均匀的若干位作为散列地址关键字集合已知,若更换了关键字,则需要重新构建新的哈希函数
平方取中法取关键字的平方值的中间几位作为散列地址关键字的每位取值都不够均匀或均小于散列地址所需的位数

3.常见处理冲突的方法

(1)开放定址法
指可存放新表项的空闲地址既向它的同义词表项开放,又向他的非同义词表项开放。其数学递推公式:
H i = ( H ( k e y ) + d i ) % m H_i=(H(key)+d_i)\%m Hi=(H(key)+di)%m; i = 0,1,2,…,k(k<=m-1);m表示散列表表长; d i d_i di为增量序列;i可理解为“第i次发生冲突”

开放定址法种类增量序列
线性探测法 d i = 0 , 1 , 2 , 3 , . . . , m − 1 d_i=0,1,2,3,...,m-1 di=0,1,2,3,...,m1
平方探测法 d i = 0 2 , 1 2 , ( − 1 ) 2 , 2 2 , ( − 2 ) 2 , . . . , k 2 , ( − k ) 2 d_i=0^2,1^2,(-1)^2,2^2,(-2)^2,...,k^2,(-k)^2 di=02,12,(1)2,22,(2)2,...,k2,(k)2 k < = m / 2 k<=m/2 k<=m/2;注:散列表长度m必须是一个可以表示成4j+3的素数,才能探测到所有位置
伪随机序列法 d i d_i di是一个伪随机序列

注:采用开放定址法解决冲突的时,删除结点不能简单地被删除结点的空间置为空,否则将截断在它之后填入散列表的同义词结点的查找路径,应进行逻辑删除

(2)再哈希法
除了原始的哈希函数之外,多准备几个哈希函数,当哈希函数冲突时,用下一个哈希函数计算新地址,直到不冲突为止

(3)拉链法
把所有同义词存储在一个链表里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码届艺术家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值