struct lnode是什么结构类型_从零开始学习数据结构>哈希表

本文详细讲解了哈希表的核心概念,包括哈希函数的构造(如除留余数法)、解决冲突的方法(线性探测、二次探测、双散列、链地址法),并以C语言为例,展示了数据前插、查找、删除等操作的实现。重点介绍了除留余数法配合开链法的实践。
摘要由CSDN通过智能技术生成
哈希表的本质就是 K-V 结构,V 可以是链表、数组、数组链表等形式,需要灵活掌握这些数据结构,在代码实现,才能真正的掌握。 1、哈希表 理想情况是不希望经过任何比较,一次存取,便可以直接定位,这是需要一种映射关系,我们把这个映射关系就叫为哈希函数。 哈希表在对大数据的处理查找上,有明显优势。 若数据有序,--->我们一般会想到二分查找;但是哈希查找更加犀利; 针对哈希查找,我们主要学习:(1) 、如何构造哈希函数;(2)、怎么解决冲突问题。 2、哈希函数 这个哈希函数的构造方法比较多:(1)、直接定址法,(2)、数字分析法,(3)、平方取中法,(4)、折叠法, (5)、除留余数法,(6)、随机数法; 简单说一下,直接定址法,用的少,且需要空间过大; 以上的哈希函数,最常用的是除留余数法;什么是除留余数法? 在哈希表中,总空间大小为m,选一个 p,p 满足两个条件: (1)、p <= m(越接近 m 越好); (2)、p 必须是质数;则哈希函数为:                                          hash(key) = kep % p; (p<=m;) p 为什么一定要选质数呢?                                        经过数学的理论推导,p 为质数时,可以保证模之后概率均等,均匀分布;p 要不是质数,则不满足随机、均匀这些条件,就不能保证每个数字均等存储。 3、解决冲突 (1)、线性探测法 线性探测法存储,此时存放的位置如下图,因为在下标为 1 处已经存放数字了,此时其后的数据也要存放到这个位置,产生冲突;按照线性探测法的解决方案:有冲突一直往后探测,直到有空间可以放数据时,就存储在那个位置。 模型图: 66e42b6b040cc7972c4ee563552e0f5b.png (2)、二次探测法 二次探测法存储,此时存放的位置如下图,因为在下标为 1 处已经存放数字了,此时其后的数据也要存放到这个位置,产生冲突;按照二次探测法的解决方案:有冲突先向左探测,若没有空间,再向右探测,来回左右探测,直到有空间可以放数据时,就存储在那个位置。 模型图: a65c2132d2653d25022f44ed7edcc837.png 以上的两种解决冲突的方案不是很好,缺点:定位准确度不高,查找起来效率较低。 (3)、双散列法 需要两个哈希函数,第一个元素直接就是记哈希表的下标,第二个记到达该数字的移位量,从而达到直接定位。 模型图: 8114406957ced0ac0ed63dea3c270f8a.png (4)、链地址法 哈希表中存放的是指针(指向结点的指针),在冲突处,通过指针连接起来。 模型图: b1a6d3887aa1a2a9b936fca2ff8d6c05.png 关于链表的连接问题: 头插----->效率比较高; 尾插----->效率相对来说比较低,(因为的一个一个的查找最后一个结点)。 解决尾插效率低的方案:以空间换时间,就是在哈希表中存放的是一个结构体类型,成员如下:
1
4、除留余数法+开链法(重点实现) 此次全部代码均用 C 语言实现,与 C++ 不牵扯。 我把函数声明和定义放到了一个 .h 文件中,只是为了方便实现,本应该分开存放; 除留余数法的重点是:hash() 函数;开链法的重点是:链表的操作。 哈希表上应有的操作函数(其实主要是链表的操作)
1
(1)、数据前插
1
(2)、数据展示
 1
(3)、数据后插
 1
(4)、查找函数
 1
(5)、删除函数
 1
5、完整代码 (1)、完整代码
  1
(2)、测试代码
 1
(3)、测试结果 2c67721e19c95e8e1657bbd6956edfc4.png 推荐阅读: 从零开始学习数据结构-->入门篇 从零开始学习数据结构-->链表 从零开始学习数据结构-->线性表 从零开始学习数据结构-->栈 从零开始学习数据结构-->队列 从零开始学习数据结构-->矩阵+串 认真的人 自带光芒

1cd199044e04eb14607f6b36072bf114.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值