哈希表学习

什么是哈希表?

散列表(Hash Table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

简单来说,哈希表是一种表结构,我们可以直接根据给定的key值计算出目标位置。在工程中这一表结构实现通常采用数组。

与普通的列表不同的地方在于:

普通列表仅能通过下表来获取目标位置的值,而哈希表可以根据给定的key计算得到目标位置的值。

在列表查找中,使用最广泛的二分查找算法,复杂度为O(log2n),但其始终只能用于有序列表。

普通无序列表只能采用遍历查找,复杂度为O(n)。

拥有较为理想的哈希函数实现的哈希表,对其任意元素的查找速度始终为常数级,即O(1)。

(图摘自参考资料1中链接)

我们将数组总长度设为模数,将key值直接对其取模,所得的值为数组下标。如图所示的三组数据,分别被映射到下标为0和7的位置中,显而易见,第1、3组数据发生了哈希碰撞。

如何解决哈希碰撞?

如果哈希函数设计的不好,就会经常出现哈希碰撞的现象。有两种方法:

方法一:拉链法

所谓拉链法,就是字面意思,将冲突的数据拉开。"链"就是"链表"的意思,将指向索引1的第一个学生的键值之后设计一个next指针,指向下一个学生也是指向索引1的键值,这就形成了一个链表的形状。

需要注意的是,如果遭到恶意哈希碰撞攻击,拉链法会导致哈希表退化为链表,即所有元素都被存储在同一个节点的链表中,此时哈希表的查找速度=链表遍历查找速度=O(n)。

方法二:线性探测法

就是成一个线状的趋势去探测,是否有下一个空位置给冲突的数据暂时存放,如果表中有空位,就不用将他们挤到一起形成一个链状了,链表太长也会浪费空间。注意,只能往后找空位,不能往前找。

哈希表的优势

通过前面的概念了解,哈希表可以通过关键值计算直接获取目标位置,对于海量数据中的精确查找有非常惊人的速度提升,理论上即使有无限的数据量,一个实现良好的哈希表依旧可以保持O(1)的查找速度,而O(n)的普通列表此时已经无法正常执行查找操作。

哈希表的主要应用场景

在工程上,经常用于通过名称指定配置信息,通过关键字传递参数、建立对象与对象的映射关系等。目前最流行的NoSql数据库之一Redis,整体的使用了哈希表思想。所有使用了键值对的地方,都运用到了哈希表的思想。

参考资料:

1、一篇文章教你读懂哈希表-HashMap https://zhuanlan.zhihu.com/p/84327339

2、数据结构 | 一文带你快速入门【哈希表】

相关推荐
魔力军7 分钟前
Rust学习Day3: 3个小demo实现
java·学习·rust
●VON26 分钟前
HarmonyOS应用开发实战(基础篇)Day01-《ArkTS基本知识》
学习·华为·harmonyos·鸿蒙·von
玄同76539 分钟前
Python Random 模块深度解析:从基础 API 到 AI / 大模型工程化实践
人工智能·笔记·python·学习·算法·语言模型·llm
Pluchon42 分钟前
硅基计划4.0 算法 简单模拟实现位图&布隆过滤器
java·大数据·开发语言·数据结构·算法·哈希算法
符哥200843 分钟前
C++ 适合初学者的学习笔记整理
c++·笔记·学习
曦月逸霜1 小时前
Python快速入门——学习笔记(持续更新中~)
笔记·python·学习
AI视觉网奇1 小时前
blender 导入fbx 黑色骨骼
学习·算法·ue5·blender
星火开发设计1 小时前
this 指针:指向对象自身的隐含指针
开发语言·数据结构·c++·学习·指针·知识
Gain_chance1 小时前
37-学习笔记尚硅谷数仓搭建-ADS层分析并以各品牌商品下单统计为例
笔记·学习
魔力军1 小时前
Rust学习Day2: 变量与可变性、数据类型和函数和控制流
开发语言·学习·rust