数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)

简介: 数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)

数字关键词的散列函数构造

一个“好”的散列函数一般应考虑下列两个因素

  1. 计算简单,以便提高转换速度;
  2. 关键词对应的地址空间分布均匀,以尽量减少冲突。

直接定址法

取关键词的某个线性函数值为散列地址,即 (a、b为常数)。

例如以年份(1990-2011)为关键词,那么就可以将散列函数构造成 image.png

除留余数法

散列函数为:

例如上篇里提到的:

地址 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
关键词 34 18 2 20 23 7 42 27 11 30 15

这里的散列函数就为:h(key) = key % 17

  • 此处p = TableSize = 17
  • 一般地,p取素数

选择素数p可以避免余数之间的相关性,降低哈希冲突的概率。如果选择合数作为模数,可能存在公因数,增加了冲突的概率。

数字分析法

分析数字关键字在各位上的变化情况,取比较随机的位作为散列地址。

比如:取11位手机号码key的后4位作为地址,则散列函数为: (char *key)

即,手机号码为12345678910,其地址就为“8910”。

例子

关键词key是18位的身份证号码: image.png 根据分析,发现变化比较大的就是我们标红的六位,所以我们以他们六位来设计散列函数:

当key[18] = ‘X’时,

当key[18]为‘0’~‘9’时,

(以十进制来计算地址,所以最高位为10的5次方)

折叠法

把关键词分隔成位数相同的几个部分,然后叠加。

比如:56793542,拆分成三部分

,取后三位391,所以h(56793542) = 391

平方取中法

将一个数平方之后再取中间位数的值。

比如:56793542

所以h(56793542)=641

字符关键词的散列函数构造

ASCII码加和法

对字符型关键词key定义散列函数如下:




但是这种方法冲突比较严重,a3(97+3)、b2(98+2)、c1(99+1)的ASCII码值加起来都等于100,eat(101+97+116)和tea(116+101+97)的ASCII码值加起来都等于314.


进行一下简单的改进

前三字符移位



(这里用27进制计算地址,原因是包括空格在内的单个字符共有27个)


但是这种方法仍然容易冲突:string、street、strong、structure等等;


而且会造成空间浪费,理论上来说,前三字符所有可能性的组合为种,但经过统计得到,实际中的组合约3000种,,即空间利用率大约30%,浪费了70%的空间。

移位法

涉及关键词所有n个字符,并且分布得很好;

例如:h(“abcde”) = ‘a’ * + ‘b’ *  + ‘c’ *  + ‘d’ * 32 + ‘e’。

用这个计算方法需要乘10次,我们看一下比较快的计算方法:

h(“abcde”) = (((‘a’ * 32 + b) * 32 + c) * 32 + d ) * 32 + e,

用这种方法,在计算时就只需要乘4次

还有没有更巧妙的办法呢?

我们发现32是2的5次方,于是可以通过移位,也就是将一个数往左二进制移位五次,就相当于*32.

于是有:

Index Hash(const char *Key, int TableSize)
{
    unsigned int h = 0; /* 散列函数值,初始化为0  */
    while( *Key != '\0')
    {
        h = (h << 5) + *Key++;
    }
    return h % TableSize;
}

end



目录
相关文章
|
2月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
227 3
|
5月前
|
机器学习/深度学习 边缘计算 算法
NOMA和OFDMA优化算法分析
NOMA和OFDMA优化算法分析
309 127
|
7月前
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
453 4
|
2月前
|
存储 边缘计算 算法
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
|
3月前
|
机器学习/深度学习 算法 5G
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
161 0
|
4月前
|
编解码 算法 5G
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
354 2
|
4月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
152 1
|
4月前
|
人工智能 自然语言处理 算法
2025 年 7 月境内深度合成服务算法备案情况分析报告
2025年7月,中央网信办发布第十二批深度合成算法备案信息,全国389款产品通过备案,服务提供者占比超七成。截至7月14日,全国累计备案达3834款,覆盖文本、图像、音视频等多模态场景,广泛应用于生活服务、医疗、金融等领域。广东以135款居首,数字人、AI客服等C端应用主导,民营企业成主力,国企聚焦公共服务。随着AI政策推动,备案已成为AI产品合规上线关键环节。
|
4月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
147 0
|
7月前
|
存储 监控 算法
员工行为监控软件中的 Go 语言哈希表算法:理论、实现与分析
当代企业管理体系中,员工行为监控软件已逐步成为维护企业信息安全、提升工作效能的关键工具。这类软件能够实时记录员工操作行为,为企业管理者提供数据驱动的决策依据。其核心支撑技术在于数据结构与算法的精妙运用。本文聚焦于 Go 语言中的哈希表算法,深入探究其在员工行为监控软件中的应用逻辑与实现机制。
189 14
下一篇
oss云网关配置