【C++、数据结构】哈希表——散列表(一)(概念/总结)

news2024/11/26 2:31:59

「前言」

🌈个人主页: 代码探秘者
🌈C语言专栏:C语言
🌈C++专栏: C++ / STL使用以及模拟实现
🌈数据结构专栏: 数据结构 / 十大排序算法
🌈Linux专栏: Linux系统编程 / Linux网络编程(准备更新)
🌈喜欢的诗句:天行健,君子以自强不息.

pic_8da49713.png

🥙1.散列表的基本概念

在这里插入图片描述

  • 散列表(哈希表,Hash Table):是⼀种数据结构。特点是:可以根据数据元素的关键字计算出它在散列表中的存储地址
  • 散列函数(哈希函数)Addr=H(key) 建⽴了“关键字”→“存储地址”的映射关系。

例:某散列表的⻓度为13,散列函数 H(key)=key%13。依次将数据元素 19、14、23 插⼊散列表:
在这里插入图片描述
19%13=6
14%13=1
23%13=10

理想情况下,在散列表中查找⼀个元素的时间复杂度为O1

  • 冲突:在散列表中插⼊⼀个数据元素时,需要根据关键字的值确定其存储地址,若该地址已经存储了其他元素,则称这种情况为“冲突(碰撞)
  • 同义词:若不同的关键字通过散列函数映射到同⼀个存储地址,则称它们为“同义词”
    *在这里插入图片描述
    关于冲突:
  • 减少冲突构造更适合的散列函数,让各个关键字尽可能地映射到不同的存储位置,从⽽减少“冲突”
  • 处理冲突拉链法、开放定址法(包含四种探测方法)

🥙2.散列函数的构造

1.散列函数定义

在这里插入图片描述

  • 散列函数(哈希函数)Addr=H(key) 建⽴了“关键字”→“存储地址”的映射关系。

2.设计散列函数注意点

设计散列函数时应该注意什么
在这里插入图片描述
在这里插入图片描述

3.常见的散列函数

1.除留余数法

  • 除留余数法 —— H(key) = key % p

  • 在这里插入图片描述

  • 散列表表⻓为m,取⼀个不⼤于m但最接近或等于m的质数p
    比如:m=15,15 不是素数,我找一个比它小的素数,13 或11
    在这里插入图片描述

p选质数的原因:

  • 原因:对质数取余,可以分布更均匀,从⽽减少冲突
    在这里插入图片描述

2.直接定址法

  • 直接定址法 —— H(key) = key 或 H(key) = a*key + b

在这里插入图片描述

  • 其中,a和b是常数。这种⽅法计算最简单,且不会产⽣冲突。若关键字分布不连续,空位较多,则会造成存储空间的浪费

在这里插入图片描述

3.数字分析法

  • 数字分析法 —— 选取数码分布较为均匀的若⼲位作为散列地址
  • 在这里插入图片描述

在这里插入图片描述

4.平⽅取中法

  • 平⽅取中法——取关键字的平⽅值的中间⼏位作为散列地址
  • 在这里插入图片描述
    在这里插入图片描述

4.总结

在这里插入图片描述

🥙3.处理冲突的方法

一.处理冲突-拉链法

在这里插入图片描述

  • 拉链法(⼜称链接法、链地址法):把所有同义词”存储在⼀个链表中。

在这里插入图片描述

1.插入操作

例:若散列表⻓度为13,散列函数 H(key)=key%13,⽤拉链法解决冲突。依次插⼊关键字 {19, 14, 23, 1, 68, 20, 84, 27, 55, 11, 10, 79}
在这里插入图片描述
如何在散列表(拉链法解决冲突)中插⼊⼀个新元素?

  • Step 1:结合散列函数计算新元素的散列地址
  • Step 2:将新元素插⼊散列地址对应的链表(可⽤头插法,也可⽤尾插法

在这里插入图片描述

2.插入操作的优化

  • 新元素插⼊链表时,若能保持链表有序,可以略微提⾼“查找”效率。
    在这里插入图片描述

3.查找元素

查找⻓度——在查找运算中,需要对⽐关键字的次数称为查找⻓度

  • 查找成功
    在这里插入图片描述
  • 查找失败
    在这里插入图片描述
    默认只统计关键字对比次数(空指针次数-部分才要求)
    在这里插入图片描述
    在这里插入图片描述

4.删除操作

  • 删除成功
    在这里插入图片描述
    在这里插入图片描述
  • 删除失败
    在这里插入图片描述

5.总结

在这里插入图片描述

二.处理冲突-开放定址法

在这里插入图片描述

  • 开放定址法:如果发⽣“冲突”,就给新元素找另⼀个空闲位置
  • 为什么叫“开放定址”?—— ⼀个散列地址,既对同义词开放,也对⾮同义词开放

在这里插入图片描述
探测方法:⽤什么规则确定“另⼀个空闲位置”

  • di 表示第 i 次发⽣冲突时,下⼀个探测地址与初始散列地址的相对偏移量。
    在这里插入图片描述

在这里插入图片描述

1.线性探测法

  • 插入操作
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

2.平⽅探测法(⼆次探测法)

在这里插入图片描述

3.双散列法

例:⻓度为13的散列表状态如下图所示,散列函数 H(key)=key%13,采⽤双散列法解决冲突,假设hash2(key)=13-(key %13)
分析:插⼊元素1、查找元素1 的过程。

在这里插入图片描述

  • 两个散列函数,第一个不行,开始使用第二个,计算di
    在这里插入图片描述

4.伪随机序列法

在这里插入图片描述
在这里插入图片描述

4.查找操作(统一)

查找操作原理类似,根据探测序列依次对⽐各存储单元内的关键字。

  • 若探测到⽬标关键字,则查找成功
  • 若探测到空单元,则查找失败

5.删除操作

如何删除⼀个元素:

  • Step 1:先根据散列函数算出散列地址,并对⽐关键字是否匹配。若匹配,则“查找成功”
  • Step 2:若关键字不匹配,则根据“探测序列”对⽐下⼀个地址的关键字,直到“查找成功”或“查找失败”
  • Step 3:若“查找成功”,则删除找到的元素

注:题⽬⼀定会说明具体是采⽤哪种探测序列(线性探测法、平⽅探测法、双散列法、伪随机序列法)

错误示范(注意-线性探测演示)

  • 先找15,删15
    在这里插入图片描述
  • 再要删1(开始探测了,会发现,找到原来放15的地方遇到空,这样就停止探测了)
    在这里插入图片描述

正确示范(逻辑删除)

  • 删15
    在这里插入图片描述
  • 找1
    在这里插入图片描述

注意

采⽤“开放定址法”(线性探测法、平⽅探测法、双散列法、伪随机序列法原)时,删除元素不能简单地将被删元素的空间置为空,否则将截断在它之后的探测路径,可以做⼀个“已删除”标记,进⾏逻辑删除

  • 逻辑删除定义一个flag=1, 删除则变0。(避免查找操作探测时,本来存在的数,没查到就停止探测了)。

在这里插入图片描述

6.总结

在这里插入图片描述

三.扩展:关于四种方法的探测覆盖率

线性探测法:采⽤线性探测法,⼀定可以探测到散列表的每个位置

  • 只要散列表中有空闲位置,就⼀定可以插⼊成功
  • 理想情况下,若散列表表⻓=m,则最多发⽣ m-1 次冲突即可“探测”完整个散列表

平⽅探测法:采⽤平⽅探测法,⾄少可以探测到散列表中⼀半的位置
在这里插入图片描述

  • 即便散列表中有空闲位置,也未必能插⼊成功
  • 若散列表⻓度 m 是⼀个可以表示成4j + 3的素数(如 7、11、19),平⽅探测法就能探测到所有位置

双散列法未必能探测到散列表的所有位置

  • 双散列法的探测覆盖率取决于第⼆个散列函数hash2(key) 设计的是否合理

  • hash2(key) 计算得到的值与散列表表⻓m互质,就能保证双散列发可以探测所有单元
    在这里插入图片描述

伪随机序列法:di 是⼀个伪随机序列,由程序员⼈为设计

  • 采⽤伪随机序列法,是否能探测到散列表中全部位置,取决于伪随机序列的设计是否合理

总结

在这里插入图片描述

🥙4.模拟实现哈希表

点击这里!

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

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

相关文章

山东路远生态科技有限公司竣工投产仪式暨产品发布会圆满举行

第二十届三中全会于2024年7月15日至18日在北京举行。全会审议通过了《关于进一步全面深化改革、推进中国式现代化的决定》。其中提到,“要健全因地制宜发展新质生产力体制机制”。 新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级而催生的当代先进生产力…

MD5(Crypto)

解题思路 打开文件发现一串代码,结合题目提示,应该是 MD5 加密。 找个在线的 MD5 解密网站,行云流水得到 flag。 题目设计原理 题目设计:无他,MD5 加密。 题目原理: MD5(Message-Digest Algo…

EHOME视频平台EasyCVR萤石设备视频接入平台视频诊断技术可以识别哪些视频质量问题?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。萤石设备视频接入平台EasyCVR不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能,还支持多种主流标准协议,如GB28181、GB35114、RTSP/Onvif…

QML项目实战:自定义Button

目录 一.添加模块 ​1.QtQuick.Controls 2.1 2.QtGraphicalEffects 1.12 二.自定义Button 1.颜色背景设置 2.设置渐变色背景 3.文本设置 4.点击设置 5.阴影设置 三.效果 1.当enabled为true 2.按钮被点击时 3.当enabled为false 四.代码 一.添加模块 1.QtQuick.Con…

实战攻略 | ClickHouse优化之FINAL查询加速

【本文作者:擎创科技资深研发 禹鼎侯】 查询时为什么要加FINAL 我们在使用ClickHouse存储数据时,通常会有一些去重的需求,这时候我们可以使用ReplacingMergeTree引擎。这个引擎允许你存储重复数据,但是在merge的时候会根据order …

labview学习总结

labview学习总结 安装labview的特点一、图形化编程范式二、并行执行机制三、硬件集成能力四、应用领域优势五、开发效率六、系统集成能力**labview基本组成示意图****常用程序结构图解**结语 基础知识介绍界面前后面板的概念平铺式和层叠式 帧的概念结构类型顺序结构for循环whi…

Linux 服务器使用指南:从入门到登录

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 🚩博主致力于用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩 目录 一…

《AI 大模型:重塑软件开发新未来》

引言 在科技的璀璨星河中,AI 大模型宛如一颗耀眼的新星,正以前所未有的力量改写着软件开发的篇章。随着其技术的持续演进,软件开发流程正经历着翻天覆地的变化。从代码自动生成的神奇魔法,到智能测试的精准洞察,AI 大…

acmessl.cn提供接口API方式申请免费ssl证书

目录 一、前沿 二、API接口文档 1、证书可申请列表 简要描述 请求URL 请求方式 返回参数说明 备注 2、证书申请 简要描述 请求URL 请求方式 业务参数 返回示例 返回参数说明 备注 3、证书查询 简要描述 请求URL 请求方式 业务参数 返回参数说明 备注 4、证…

windows server2019下载docker拉取redis等镜像并运行项目

一、基本概念 1、windows server 指由微软公司开发的“Windows”系列中的“服务器”版本。这意味着它是基于Windows操作系统的,但专门设计用于服务器环境,而不是普通的桌面或个人用户使用。主要用途包括服务器功能、用户和资源管理、虚拟化等 2、dock…

Docker-- cgroups资源控制实战

上一篇:容器化和虚拟化 什么是cgroups? cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,从而为系统…

解决ImportError: DLL load failed while importing _message: 找不到指定的程序。

C:\software\Anoconda\envs\yolov5_train\python.exe C:\Project\13_yolov5-master\train.py C:\software\Anoconda\envs\yolov5_train\lib\site-packages\torchvision\io\image.py:13: UserWarning: Failed to load image Python extension: [WinError 127] 找不到指定的程序…

超越Axure:探索新一代原型设计工具

Axure RP是一款被广泛认可的快速原型设计工具,专为专业设计师打造,用于创建高效的产品原型图,包括APP和网页的原型图、框架图和结构图等。Axure RP制作的原型图能够实现与实际APP相似的交互效果,便于向用户或客户展示,…

综合项目--博客

一。基础配置: 1.配置主机名,静态IP地址 2.开启防火墙配置 3.部分开启selinux并且配置 4.服务器之间使用同ntp.aliyun.com进行世家能同步 5.服务器之间实现SSH绵密登陆 二。业务需求 1.Sever-NFS-DNS主机配置NFS服务器,将博客网站资源…

dns欺骗

[[Ettercap]] 少不了这个 arp 毒化和流量截取的中间人工具。 dns欺骗原理 什么是 DNS 欺骗? DNS 欺骗(DNS Spoofing) 是一种网络攻击技术,攻击者通过修改 DNS 响应,将目标用户的 DNS 查询结果篡改,指向攻…

危机来临前---- 力扣: 876

危机即将来临 – 链表的中间节点 描述: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 示例: 何解? 1、遍历找到中间节点 : 这个之在回文链表中找…

SQL Server数据库中,报错:用户名或密码不正确

1、 用户名或密码不正确 2、解决方式 可能是服务器名称不对,检查服务器名称是否是安装sqlserver数据的服务器名称。安装sqlserver数据的服务器,没有开启1433端口,需要开启端口 下一步保证:TCP/IP 状态状态为:已启用 然…

PKG_CHECK_MODULES(FUSE,fuse)

运行 ./configure 命令报错如下: ./configure: line 13934: syntax error near unexpected token FUSE,fuse ./configure: line 13934: PKG_CHECK_MODULES(FUSE,fuse)解决方案: 命令窗口运行如下命令,安装 pkg-config: sudo …

不要只知道deepl翻译,这里有10个专业好用的翻译工具等着你。

deepl翻译的优点还是有很多的,比如翻译的准确性很高,支持翻译的语言有很多,并且支持翻译文件和文本。但是现在翻译工具那么多,大家需要翻译的场景也有很多,怎么能只拥有一个翻译工具呢。所以在这里我帮助大家寻找了一波…

如何检索 LINEMOD 数据集的相机内参

简介 BOP (Benchmark for 6D Object Pose Estimation) 是一个专为6D物体姿态估计而设计的基准测试平台。它为研究人员提供了多种数据集,以帮助评估和比较物体识别和姿态估计算法的性能。官方网站是 BOP,你可以在这里找到丰富的资源和信息。 检索 LINEM…