散列表(HASH)

本文深入探讨了散列表的基本概念,包括其作为数组结构推广的特点及优势。介绍了直接寻址散列表和带函数散列表的不同应用场景,并详细分析了各种散列函数的设计原理与优缺点。此外,还讨论了冲突解决策略如链地址法和开放寻址法,以及完全散列的实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


散列表是数组结构的推广,数组是在整数索引的基础上进行直接寻址操作,O(1)的时间复杂度带来高效的访问


直接寻址HASH表

关键字的范围比较小,集合中的冲突基本为0的情况下,使用HASH,达到O(1)查找,插入,删除


缺点:

关键字范围大时不适用,

范围大(但适用)然而集合数目小,数据填充率低,空间浪费严重;


带函数HASH表

为了解决空间浪费问题,使关键字集合范围集中

散列函数:一种好的方法导出的散列值,在某种程度上应独立于数据可能存在的任何模式,形式相近的关键字应具有截然不同的散列值

除法取余:一个不太接近2的幂的素数,通常是比较合理的选择

乘法:h(k)=m(kA mod 1)

全域散列:随机选择hash函数,使其独立于关键字的特性

// by zjerry 算法导论中设计了一个,需要利用到数论中的知识,暂时先放放


缺点:

引入了冲突问题


避免冲突:尽量随机化

解决冲突:只能尽可能解决

1.链地址法:将散列函数值相同的元素放入到链表中

2.开放寻址法:

利用 探查序列,将HASH表全部利用完,节省了指针链表的空间,缺点是删除问题不好解决

探查序列分类:

线性探查:简易但容易造成聚集

二次探查:容易造成二次聚集(轻度聚集)

双重散列:两个不同函数对关键字求值,相加之和,获得随机性的HASH值


完全散列

可以用两级HASH函数或两级HASH方式来设计完全散列


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值