数据结构--散列函数的构造方法

一、概述

散列(哈希)函数的作用:将任意整数型 / 字符型关键字,通过固定运算,压缩映射为 0~表长 - 1 范围内的散列地址。构造原则(必背):

计算简单、速度快;

地址分布均匀,尽量减少哈希冲突;

能够覆盖整个散列表空间。

常用五种标准构造方法:直接定址法、除留余数法、数字分析法、平方取中法、折叠法。


二、直接定址法

  1. 公式

H(key)=key或H(key)=a×key+b、为常数,做线性映射。

  1. 原理

直接利用关键字本身,或经过简单线性变换,作为散列地址,一一对应。

  1. 特点

优点:无哈希冲突,计算最简单;

缺点:关键字必须连续、分布集中,若关键字跨度大,会造成散列表空间大量浪费。

  1. 适用场景

关键字取值连续、范围狭小、分布规律明确的场景。


三、数字分析法

  1. 原理

针对位数固定的数字关键字,分析每一位数字的分布规律:

剔除重复多、分布集中的无效位;

选取数字随机、分散性强的若干位,组合作为散列地址。

  1. 举例

一组学号:20260311、20260315、20260320前几位固定重复,中间段集中,取末尾两位作为地址,分布更均匀。

  1. 特点

优点:地址均匀,冲突少;

缺点:必须预先掌握全部关键字的数字规律,无法通用。

  1. 适用场景

关键字位数固定、样本已知、批量静态数据。


四、平方取中法

  1. 原理

对关键字整体进行平方运算;

平方后数值会打乱原有数字规律;

截取平方结果中间若干位作为散列地址。

  1. 核心优势

关键字首尾数字容易集中重复,中间位随机性最强,映射更均匀,有效降低冲突。

  1. 特点

优点:无需分析关键字规律,通用性强,分散效果好;

缺点:大数平方运算稍复杂,计算开销略大。

  1. 适用场景

关键字分布无规律、无法提前分析数位的情况。


五、折叠法

  1. 原理

将关键字按固定长度分割成若干段,对所有分段数值进行叠加求和,再取后几位作为散列地址。分为两种:

移位叠加:分段直接相加;

边界叠加:相邻段反向翻转后再相加,进一步打乱规律。

  1. 举例

关键字:5689427,按 3 位分割:568 | 942 | 7分段求和,取低位作为存储地址。

  1. 特点

优点:适合关键字位数多、数值范围大的数据;

缺点:分割规则需要人为设定,随机度一般。

  1. 适用场景

超长数字关键字、大数值编号类数据。


六、除留余数法

  1. 公式

H(key)=key Mod p

p 为选取的模数。

  1. 选取规则(必考)

设散列表表长为 m,要求:p<m;

p 优先选取质数;

避免选取含有大量公因数的合数(如偶数、5 的倍数),防止地址聚集。

  1. 原理

利用取模运算,将大范围关键字压缩到 0∼p−1区间,运算简单、映射稳定。

  1. 特点

优点:计算极简、实现容易、通用性最强、适配所有类型关键字;

缺点:若 p 选取不当,会出现地址集中、冲突增多。

  1. 适用场景

绝大多数散列表的默认构造方法,笔试、代码、工程全部通用。


七、五种方法整体对比总结

直接定址法:无冲突,仅限连续关键字;

数字分析法:靠数位筛选,适合已知固定样本;

平方取中法:平方乱序,中间取值,分散性好;

折叠法:分段叠加,适合长关键字;

除留余数法:万能通用,考试核心、首选方法。

相关推荐
如君愿1 小时前
考研复习 Day 25 | 习题--计算机网络第三章(数据链路层 上)、数据结构(串)
数据结构·计算机网络·考研
夏末蝉未鸣011 小时前
Sort-Merge Join【排序连接算法】详解(python代码实现,以FULL JOIN为例)
数据结构·算法
_日拱一卒1 小时前
LeetCode:23合并K个升序链表
java·数据结构·算法·leetcode·链表·职场和发展
求学的小高3 小时前
数据结构Day10(ASL、二分查找、分块查找)
数据结构·笔记·考研
算法鑫探3 小时前
算法与数据结构 以及算法复杂度
c语言·数据结构·算法·新人首发
迷途之人不知返3 小时前
List的学习
数据结构·c++·学习·list
啊哦呃咦唔鱼3 小时前
Leetcodehot100-215. 数组中的第K个最大元素
数据结构·算法·leetcode
苏渡苇3 小时前
Redis 核心数据结构(二)——List 与消息队列
数据结构·redis·list·redis发布订阅
shehuiyuelaiyuehao4 小时前
算法12,滑动窗口,将x减到0的最小操作数
java·数据结构·算法