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

一、概述

散列(哈希)函数的作用:将任意整数型 / 字符型关键字,通过固定运算,压缩映射为 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. 适用场景

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


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

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

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

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

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

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

相关推荐
w_zero_one5 小时前
算法--构造
java·数据结构·算法
lisw058 小时前
互联网上的数据结构可视化!
数据结构·信息可视化
老师我太想进步了202613 小时前
【数据结构-1】例解算法复杂度
数据结构·算法
YSL07012415 小时前
一文通关-----排序
数据结构·算法
夜不会漫长1 天前
C++:红黑树
数据结构·算法
冻柠檬飞冰走茶1 天前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
736c1 天前
固件开发岗算法
数据结构·算法
冻柠檬飞冰走茶1 天前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
PaperAccept1 天前
【研知有术论文发表】材料科学一区期刊,影响因子30+的纳米科技SCI,审稿严格但有效率
大数据·数据结构·科技·量子计算
Tairitsu_H2 天前
[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?
数据结构·c++·图论