数据结构——散列查找

——本节内容为Bilibili王道考研《数据结构》P75~76视频内容笔记。


目录

一、散列表

二、散列函数的构造方法

三、处理冲突的方法

1.开放定址法

(1)线性探测法

(2)平方探测法

(3)再散列法

(4)伪随机序列法

2.拉链法


一、散列表

1.散列表(Hash Table),又称哈希表。根据关键字而直接访问的数据结构。也就是说,散列表建立了关键字和存储地址之间的一种直接映射关系(数据元素的关键字与其存储地址直接相关)。

2.散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr(这里的地址可以是数据下标,索引或内存地址等)。

3.散列函数可能会把两个或两个以上的不同关键字映射到同一地址,这种情况称为“冲突”,这些发生碰撞的不同关键字称为“同义词”。冲突越多,查找效率越低。

4.装填因子α=表中记录数/散列表长度,装填因子会直接影响散列表的查找效率。


二、散列函数的构造方法

1.在构造散列函数时,需注意以下几点:

(1)散列函数的定义域必须包含全部需要存储的关键字,而值域的范围则依赖于散列表的大小或地址范围。

(2)散列函数计算出来的地址应该能等概率、均匀地分布在整个地址空间中,从而减少冲突的发生。

(3)散列函数应尽量简单,能够在较短的时间内计算出任意一个关键字对应的散列地址。

2.常用的散列函数如下

(1)除留余数法

        假设散列表表长为m,取一个不大于m但最接近或等于m的质数p,利用以下公式把关键字转换成散列地址,散列函数为:

H(key)=key%p

(2)直接定址法

        直接取关键字的某个线性函数值为散列函数,散列函数为:

H(key)=key或a*key+b

        其中,a和b是常数。这种方法计算最简单,且不会产生冲突。它适合关键字的分布基本连续的情况,若关键字分布不连续,空位较多,则会造成存储空间的浪费。

(3)数字分析法——选取数码分布较为均匀的若干位作为散列地址

        设关键字是r进制数(如十进制),而r个数码在各位上出现的频率不一定相同,可能在某些位上分布均匀一些,每种数码出现的机会均等;而在某些位上分布不均匀,只有某几种数码经常出现,此时可选取数码分布较为均匀的若干位作为散列地址。这种方法适合于已知的关键字集合,若更换了关键字,则需要重新构造新的散列函数。

 (4)平方取中法——取关键字的平方值的中间几位作为散列地址

        具体取多少位要视实际情况而定。这种方法得到的散列地址与关键字的每位都有关系,因此使得散列地址分布比较均匀,适用于关键字的每位取值都不够均匀或均小于散列地址所需的位数。

3.散列查找总结

        散列查找是典型的“以空间换时间”的算法,只要散列函数设计的合理,则散列表越长,冲突的概率越低。


三、处理冲突的方法

1.开放定址法

        可存放新表项的空闲地址既向它的同义词表项开放,又向它的非同义词表项开放,其数学递推公式为:

H_{i}=(H(key)+d_{i})%m

        其中,H(key)为散列函数;i=0,1,2,...,k(k<=m-1);m表示散列表表长;d为增量序列。其中增量序列d的取法有以下四种:

(1)线性探测法

        d=0,1,2,...,m-1;即发生冲突时,每次往后探测相邻的下一个单元是否为空。

        发生第一次冲突时,代入d=0到递推公式中算得新的单元地址,如果新的单元还是冲突,代入d=1到递推公式中得到新的单元地址,以此类推,直到某个地址不再冲突,将元素放入该单元。

        这种方法会造成大量元素在相邻的散列地址上“聚集”起来,大大降低了查找效率(查找失败的条件为碰到空的单元)。

(2)平方探测法

        d=0,1,-1,4,-4,9,-9,...;此时散列表长度m必须是一个可以表示成4k+3的素数,又称二次探测法。

        发生第一次冲突时,代入d=0到递推公式中算得新的单元地址,如果还是冲突,带入1,还是冲突带入-1,还是冲突带入4,-4......直到某个地址不再冲突,将元素放入该单元。

        平方探测法不能探测到散列表上所有单元,但至少能探测到一半单元。

(3)再散列法

        除了原始的散列函数H(key)之外,多准备几个散列函数,当散列函数冲突时,用下一个散列函数计算一个新地址,直到不冲突为止。

(4)伪随机序列法

        当d=伪随机数序列时,称为伪随机序列法。

注意:在开放定址的情形下,不能随便物理删除表中的已有元素,因为若删除元素,则会截断其他具有相同散列地址的元素的查找地址。因此,要删除一个元素时,可给它做一个删除标记,进行逻辑删除,但这样做的副作用是:执行多次删除后,表面上看起来散列表很满,但实际上有许多位置未利用,因此需要定期维护散列表,要把删除标记的元素物理删除。

2.拉链法

        (链接法、链地址法):把所有的“同义词”存储在一个链表中。如下图所示:

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值