数据结构复习之散列查找

本文详细介绍了散列表的概念,包括如何构造散列函数,如直接地址法、除余数法、平方取中法和折叠法。同时探讨了处理冲突的各种方法,如开放定址法(线性探查法、二次探查法、双重散列法)和拉链法。通过实例展示了不同方法的平均查找长度计算,强调了选择合适散列函数和冲突解决策略对提高查找效率的重要性。

数据结构,最后一部分内容

散列表概念

基本思想是通过由散列函数决定的键值与散列地址之间的对应关系来实现存储组织和查找运算。既是一种存储方式,又是一种查找方法。
散列技术时需要考虑的两个主要问题是:①如何构造(选择)"均匀的"散列函数?②用什么方法解决冲突?

如何构造散列函数

  1. 直接地址法
    直接地址法是以关键字key本身或关键字加上某个常量C作为散列地址的方法。对 应的散列函数H(key)为:H(key)=key+C
    特点:方法计算简单,并且没有冲突。它适合于关键字的分布基本连续的情况,若关键字分布不连续,空号较多,将会造成较大的空间浪费。
  2. 数字分析法
    数字分析法是假设有一组关键字,每个关键字由n位数字组成,数字分析法是从中提取数字分布比较均匀的若干位作为散列地址。
  3. 除余数法
    除余数法是一种最简单也最常用的一种散列函数构造方法。散列函数:H(k)=k%p
    其中,p最好选取小于或等于表长m的最大素数1
  4. 平方取中法
    取关键字平方的中间几位作为散列地址的方法
  5. 折叠法
    折叠法是首先把关键字分割成位数相同的几段(最后一段的位数可少一些),段的位数取决于散列地址的位数,由实际情况而定,然后将它们的叠加和(舍去最高进位)作为散列地址的方法。
    关键字k=98 123 658,散列地址为3位,则将关键字从左到右每三位一段进行划分,得到的三个段为981、236和58,叠加后值为1275,取低3位275作为关键字98 123 658的元素的散列地址

处理冲突的方法

开放定址法

开放定址法的思想:使用某种方法在散列表中形成一个探查序列,沿着此序列逐个单元进行查找,直到找到一个空闲的单元时将新结点存入其中。开放定址法又分为线性探插法、二次探查法和双重散列法。

线性探查法 必考

探查序列可以由下述公式得到:di=(d+i) % m
其中:di表示第i次探查的地址,m表示散列表的长度。d由散列函数计算出的地址。
如题:2021年4月
在这里插入图片描述

解:根据散列函数计算,散列地址
h(15)=1;h(72)=2;h(52)=3;h(65)=2;h(23)=2;h(68)=5,先填上没有重复的值

下标 0 1 2 3 4 5 6
散列表 15 72 52 65 68 23
探查次数 1 1 1 3 1 5

查找成功时的平均查找长度ASL=(1*4+3*1+5*1)/ 6=2

扩展

查找不成功平均查找长度:计算不成功的查找次数,要查找的数字肯定不在散列表中,根据哈希函数地址为MOD7,因此任何一个数经散列函数计算以后的初始地址只可能在0~6的位置。
计算查找不成功的次数就直接找该关键字到第一个地址上关键字为空的距离即可。上题中,1到0需要探查7次,2到0探查6次…所以查找不成功的次数就是:(7+6+5+4+3+2+1)/ 7

注意:查找成功时,分母为哈希表元素个数,查找不成功时,分母为哈希表长度。
相关软考总结:软考考点之散列表(哈希)等概率平均查找长度

二次探查法

二次探查法的探查序列为:加减 平方形式
d0=H(K),
d1=(d0+1^2)% m
d2=(d0 -1^2)% m,
d3=(d0+2^2)% m,
d4=(d0 -2^2)% m,
……

双重散列法

思想:与线性探查法一样,唯一的不同是它不是检查冲突位置后的每一个位置,而是采用另一个散列函数产生一个固定的增量。(跳跃式检查和插入,减小聚焦大小)

双重散列法是几种方法中最好的方法,它的探查序列为:hi=(H(key)+i*H1(key))%m (0≤i≤m-1)
即探查序列为:d=H(key),(d+i*H1(key))%m,(d+2*H1(key))%m,…等。

拉链法(链地址法)

把具有相同散列地址的关键字(同义词)值放在同一个单链表中,称为同义词链表。

例子

设散列函数为h(key)=key%1l;,对关键字序列{27,13,55,32,18,49,24,38,43),用拉链法构造散列表,并计算查找成功时的平均查找长度。

在这里插入图片描述

散列表查找

开放定址法数据结构

# define <
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

guangod

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

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

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

打赏作者

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

抵扣说明:

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

余额充值