【数据结构 | 哈希表】一文了解哈希表(散列表)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍哈希表 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰: 2024-07-24 14:48:55

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、键值对(key-value pair)
  • 🎄三、哈希函数
  • 🎄四、哈希冲突(哈希碰撞)
    • ✨4.1 开发地址法
    • ✨4.2 链地址法
  • 🎄五、哈希表的使用
  • 🎄六、总结


在这里插入图片描述

在这里插入图片描述

🎄一、概述

在学习过的简单数据结构当中,
数组的特点:访问(寻址)速度较快的、但插入、删除操作较慢;
链表的特点:访问(寻址)速度较慢的、但插入、删除操作很快
所以,有些大牛就想着能不能结合这数组、链表的优点,造出一个 访问(寻址)速度较快的、插入、删除操作也很快 的数据结构,后面就造出来一个 哈希表。

哈希表(Hash Table):也叫做散列表。是根据关键码值(Key Value)直接进行访问的数据结构。

哈希表存储的都是键值对(Key-Value),即一个关键字对应一个内容,给出关键字就可以在哈希表中找到对应内容。

哈希表的工作过程:哈希表通过键值对的 关键字(key)哈希函数 计算出对应的一个位置,通常是数组下标,然后把整个 键值对(代码中叫Entry)存放到这个位置,以加快查找的速度。如果多个 关键字(key) 得到同一位置就会产生 哈希冲突,需要通过一个方法去解决。

这里面有好几个概念,会在后面的内容去介绍。


在这里插入图片描述

🎄二、键值对(key-value pair)

键值对(key-value pair):就是一个关键字(key)对应一个值(value)的组合,要求每个键值对的 关键字(key) 不能重复。下面表格就是一些键值对。

KeyValue
xia
za
zai
zan
zang

在代码里可以使用下面结构体去表现一个键值对:

struct table_entry{const char* key;void *value;
}

哈希表是存储 键值对 的,那它是怎样存储的呢?
哈希表要求每个键值对的 关键字(key) 不能重复,然后通过键值对的 关键字(key) 来定位每个键值对存放的位置,这个位置就是 哈希地址,而将 关键字(key) 映射成 哈希地址 的函数就是 哈希函数

在哈希表中,会把 键值对(key-value) 的key称为键值。


在这里插入图片描述

🎄三、哈希函数

哈希函数(Hash Function):也叫散列函数,将哈希表中元素的关键键值(key)映射为元素存储位置(哈希地址)的函数。

哈希函数是哈希表中最重要的部分。一般来说,哈希函数会满足以下几个条件:

  • 哈希函数应该易于计算,并且尽量使计算出来的索引值均匀分布。
  • 哈希函数计算得到的哈希值是一个固定长度的输出值。
  • 计算出来的哈希地址不同,则传入键值(key)肯定不同;
    Hash(key1) != Hash(key2),则 key1 != key2。
    
  • 如果 Hash(key1) 等于 Hash(key2),那么 key1、key2 可能相等,也可能不相等(会发生哈希冲突)

在哈希表的应用中,最常见的2种键值类型是:字符串、数字。而其他键值类型还可以是是字符串类型、浮点数类型、大整数类型,甚至还有可能是几种类型的组合。设计哈希函数时,要根据键值类型的特点去设计,一般会先将键值转成整型再去计算,因为最终计算出来的一般是一个数组下标(Index)。

常见的哈希函数方法有:直接定址法、除留余数法、平方取中法、基数转换法、数字分析法、折叠法、随机数法、乘积法、点积法等。

假设我们把上个小节的键值对存到一个哈希表,并通过哈希函数计算出哈希地址,如下表:

KeyValue哈希地址(Index)
xia517
za597
zai597
zan599
zang600

就像上面表格一样,哈希函数有时就将两个不同的键值计算出同一个哈希地址,这就造成了哈希冲突(哈希碰撞)


在这里插入图片描述

🎄四、哈希冲突(哈希碰撞)

哈希冲突(Hash Collision):不同的关键字通过同一个哈希函数可能得到同一哈希地址,即 key1 ≠ key2,而 Hash(key1) = Hash(key2),这种现象称为哈希冲突。

理想状态下,是每个key通过哈希函数都计算出不同的哈希地址,这样直接将键值对存入即可。但实际使用中一般都会出现哈希冲突的,这时就需要处理哈希冲突。处理哈希冲突的方法一般有两种:开放地址法、链地址法。

✨4.1 开发地址法

开放地址法(Open Addressing):指的是将哈希表中的 空地址 向处理冲突开放。当哈希表未满时,处理冲突时需要尝试另外的单元,直到找到空的单元为止。

开放地址法主要有三种实现:

  • 线性探测(Linear Probing):发生冲突时,依次检查下一个地址,直到找到空闲位置。
  • 二次探测(Quadratic Probing):冲突时,以二次函数的方式探查空闲位置。
  • 双重哈希(Double Hashing):使用两个哈希函数,当发生冲突时,使用第二个哈希函数计算新的探查位置。

✨4.2 链地址法

链地址法(Chaining):将具有相同哈希地址的元素(或记录)存储在同一个线性链表中。

链地址法是一种更加常用的哈希冲突解决方法。相比于开放地址法,链地址法更加简单。

具体的做法是当哈希地址的位置是空的话,就直接将 键值对 存入该位置;如果不为空,就将 键值对 存到该地址的链表中,所以在代码实现时,会在键值对所在结构体中加一个next指针,用于实现链表。

struct TableEntry {TableEntry* fNext;char const* key;void* value;
};

在这里插入图片描述


在这里插入图片描述

🎄五、哈希表的使用

虽然上面说了那么多的概念,但只是使用哈希表并不需要知道这些。如果是要看别人实现哈希表的代码,则必须要清楚上面的那些概念,这里再总结一下:

  • 1、键值对(Key-Value Pair):是一种数据结构的表示形式,其中“键(Key)”是用于标识和查找数据的唯一标识符,“值(Value)”则是与该键相关联的数据。例如,在字典中,单词(键)与其释义(值)就构成了键值对。
  • 2、哈希函数(Hash Function):是一种将输入(通常是键)转换为固定长度输出(称为哈希值)的函数。哈希函数的设计目标是使得不同的输入尽可能产生不同的输出,并且输出分布均匀。
  • 3、哈希值(Hash Value):通过哈希函数对输入(键)进行计算得到的固定长度的数值。
  • 4、哈希地址(Hash Address):哈希值所对应的存储位置。通常,哈希表会根据哈希值来确定数据在内存中的存储位置。
  • 5、哈希冲突(Hash Collision):当两个或多个不同的键通过哈希函数计算得到相同的哈希值时,就发生了哈希冲突。这可能导致这些键对应的元素需要存储在同一个哈希地址,从而引发数据存储和检索的问题。

如果只是使用哈希表的话,只需要知道哈希表提供了哪些操作即可。哈希表至少会提供三个操作:插入、删除、查询。我们只需要知道怎样插入键值对、怎样删除、怎样查询就差不多了。


在这里插入图片描述

🎄六、总结

👉本文介绍哈希表实现过程中的重要概念:键值对、键值、哈希函数、哈希冲突、处理哈希冲突等,看完后可以对哈希表有一定的了解。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
https://blog.csdn.net/zy_dreamer/article/details/131036258
https://blog.csdn.net/sinat_33921105/article/details/103344078
https://blog.csdn.net/m0_65781965/article/details/136987203

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1487295.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

昇思学习打卡-22-生成式/DCGAN生成漫画头像

文章目录 DCGAN网络数据处理构造网络生成器判别器损失函数优化器 结果展示 我们将学习DCGAN网络如何数据处理、设置网络,包括生成器、判别器、损失函数、优化器等。 DCGAN网络 DCGAN(深度卷积对抗生成网络,Deep Convolutional Generative Ad…

windows下运行sh文件

1、打开git bash 2、进入sh文件所在文件夹,使用sh xx.sh运行

普发Pfeiffer TPG300手侧配置安装操作技术资疗包含

普发Pfeiffer TPG300手侧配置安装操作技术资疗包含

学习笔记:MySQL数据库操作2

1. 建库建表 创建数据库 mydb8_worker。使用该数据库 mydb8_worker。创建职工表 t_worker,字段包括: department_id: 部门号,整型,不允许为空。worker_id: 职工号,主键,整型,不允许为空。worke…

硬盘数据恢复的基本原理是什么 硬盘数据恢复教程

无论是电脑硬盘,还是日常办公过程中使用系统硬盘,都是由多个存储空间组成的。如果这些存储空间中的信息被删除了,那内部的文件也会跟着消失。下面,小编就以“硬盘数据恢复工具恢复原理,硬盘数据恢复教程”这两个问题为…

昇思25天学习打卡营第18天 | DCGAN生成漫画头像

探索DCGAN在生成动漫头像的实用性 通过深入学习和实践DCGAN(Deep Convolutional Generative Adversarial Networks),我对这种深度学习模型在生成动漫头像方面的应用有了更全面的理解。DCGAN作为一种改进的GAN模型,通过在生成器和…

MP的使用

1、MP简介 MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生 官网:MyBatis-Plus 🚀 为简化开发而生 参考教程:https://baomidou.c…

土地规划中的环境影响评估:守护绿水青山的科学指南

土地规划,作为指导区域开发与保护的蓝图,其决策不仅关乎经济发展,更与生态环境息息相关。环境影响评估(EIA)作为土地规划不可或缺的一环,旨在预测、评估规划项目对自然环境和社会环境的潜在影响&#xff0c…

英语科技写作 希拉里·格拉斯曼-蒂(英文版)pdf下载

下载链接: 链接1:https://pan.baidu.com 链接2:/s/1fxRUGnlJrKEzQVF6k1GmBA 提取码:b69t 由于是英文版,可能有些看着不太方便,可以在网页版使用以下软件中英文对照着看,看着更舒服,…

【echarts区域地图】

背景:我们在制作大屏的时候,经常会使用到echarts制作各种图表,饼图,柱状图,折线图。有时候也会用到地图的交互,使大屏效果看起来更加高级。 我们要完成上面的效果需要准备什么呢? 首先是需要我…

Gson的基本使用:解析Json格式数据 序列化与反序列化

目录 一,Gson和Json 1,Gson 2,Json 3,Gson处理对象的几个重要点 4,序列化和反序列化 二,Gson的使用 1,Gson的创建 2,简单对象序列化 3,对象序列化,格…

基于ansible进行运维自动化的研究以及相关的属性

一、ansible-简介 介绍 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点, 实现了批量系统配置、批量程序部署、批量运行命令等功能。 无客户端。 …

【LeetCode】71.简化路径

1. 题目 2. 分析 3. 代码 我写了一版很复杂的代码&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:operator [] # 操作符的栈dir_name [] # 文件名的栈idx 0cur_dir_name ""while(idx < len(path)):if path[idx] /:operator.ap…

最新可用度盘不限速后台系统源码_去授权开心版

某宝同款度盘不限速后台系统源码&#xff0c;验证已被我去除&#xff0c;两个后端系统&#xff0c;账号和卡密系统 第一步安装宝塔&#xff0c;部署卡密系统&#xff0c;需要环境php7.4 把源码丢进去&#xff0c;设置php7.4&#xff0c;和伪静态为thinkphp直接访问安装就行 …

音频处理过程

1、音频 &#xff08;1&#xff09;打开设备 &#xff08;2&#xff09;从音频设备中读取数据 &#xff08;3&#xff09;将音频设备中读取的数据写入文件夹中 &#xff08;4&#xff09; 通过界面控制开始录制和结束录制&#xff08;使用多线程和状态码控制&#xff09; &…

C++与C中,由函数形参test(int *a)引出的问题

文章参考来源&#xff1a; 1.c函数中形参为引用的情况&#xff1b;C中a和&a的区别 描述&#xff1a; 最近在看循环单链表时&#xff0c;看到有篇文章中&#xff0c;链表初始化函数为图下&#xff0c;我在想&#xff0c;这个函数形参(类似 "int * & a"一样)到…

【C# WInForm】将TextBox从输入框设置为文本框

1.需求情形&#xff1a; textbox作为最常用的控件之一&#xff0c;通常是用来输入文本信息或者显示文字&#xff0c;但是如果要在界面中显示大段文本&#xff0c;一个带有边框、可选中的文本样式似乎不合适。像这样&#xff1a; 我需要的是这段文字不仅能跨行&#xff0c;而且…

Geoserver介绍与安装

Geoserver简介 概览 GeoServer是一个使用Java编写的&#xff0c;允许用户分享、编辑地理空间数据的开源软件。它在设计时就考虑了互操作性&#xff0c;其支持使用开放标准发布多数主流格式的空间数据。 作为一个社区驱动的项目&#xff0c;GeoServer由来自世界各地的个人和组…

记一次因敏感信息泄露而导致的越权+存储型XSS

1、寻找测试目标 可能各位师傅会有苦于不知道如何寻找测试目标的烦恼&#xff0c;这里我惯用的就是寻找可进站的思路。这个思路分为两种&#xff0c;一是弱口令进站测试&#xff0c;二是可注册进站测试。依照这个思路&#xff0c;我依旧是用鹰图进行了一波资产的搜集&#xff…

HTTP模块(二)

HTTP 设置 HTTP 响应报文 HTTP报文常见属性&#xff1a; const http require(http);const server http.createServer((request, response) > {// 设置请求状态码 2xx 4xx 5xxresponse.statusCode 200;// 设置请求描述 了解即可response.statusMessage hello// 指定响…