「数据结构」哈希表1:基本概念

🎇个人主页:Ice_Sugar_7
🎇所属专栏:Java数据结构
🎇欢迎点赞收藏加关注哦!

基本概念

  • 🍉哈希表
  • 🍉哈希冲突
    • 🍌负载因子调节
    • 🍌解决哈希冲突
      • 🥝1. 闭散列法
      • 🥝2. 开散列法(哈希桶)

🍉哈希表

哈希表是一种数据结构,它使用哈希函数将键映射到数组中的一个位置(即将元素的存储位置和它的key之间建立映射关系)

  • 在存储一个键值对时,哈希函数根据key计算出一个索引(哈希地址),然后将键值对存储在对应的索引位置上

举个例子:

数据集合{1,7,6,4,5,9}
哈希函数设置为:hash(key) = key % capacity(capacity为存储元素底层空间的大小)

那我们可以推出每个元素存储的位置为
在这里插入图片描述

  • 在搜索元素时,对元素的key进行同样的计算,把求得的函数值当做元素的存储位置,在哈希表中取这个位置的元素进行比较,若key相等,则搜索成功

因为通过哈希函数计算得到的索引可以直接指向元素所在的位置,所以在理想情况下,查找、插入和删除操作的时间复杂度可以达到O(1)


🍉哈希冲突

不同的关键字通过相同的哈希函数计算出相同的哈希地址,该种现象称为哈希冲突

造成哈希冲突的原因之一是:哈希函数设计不够合理
我们在设计哈希函数时,应遵循:

  1. 哈希函数的定义域需要包括所有待存储的关键码
  2. 计算出来的哈希地址能均匀分布在整个空间中
  3. 哈希函数应该比较简单

🍌负载因子调节

哈希表载荷因子定义为 α = 填入表中的元素个数 / 哈希表长度
α越大,表明填入表中的元素越多,发生冲突的可能性越大
当α超过一定阈值时,会触发哈希表的扩容操作

在Java中,HashMap默认负载因子是0.75,0.75是一个被认为在时间和空间效率上做了平衡的经验值,它既保证了空间的有效利用,又尽量减少了冲突的发生,是一个相对较优的选择。

负载因子和冲突率的关系粗略演示:
在这里插入图片描述

我们可以通过降低负载因子来降低冲突率,因为哈希表中已有的关键字个数是不可变的,那么我们能调整的就只有哈希表中的数组的大小
注意:哈希表扩容后,需要重新计算里面的关键字的哈希地址

🍌解决哈希冲突

解决哈希冲突两种常见的方法是:闭散列开散列

🥝1. 闭散列法

也叫开放定址法,发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置的“下一个”空位置中
那怎么找空位置呢?

  • 线性探测
    从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止
    比如对于刚才上面的例子:
    在这里插入图片描述
    如果要插入44,那它会和4产生冲突,采用线性探测解决冲突的话,那就会插入到下标为8这个空位置在这里插入图片描述

线性探测的缺陷是产生冲突的数据堆积在一块,这与其找下一个空位置有关系,因为找空位置的方式就是挨着往后逐个去找。如果表中只填入4,而接下来要填入44,14,24,34一系列数字的话:
在这里插入图片描述
采用二次探测可以避免这个问题

  • 二次探测
    二次探测通过下面的公式算出要插入哪个空位置
    在这里插入图片描述

比如对于上面的例子,使用二次探测解决冲突后得到:
在这里插入图片描述

🥝2. 开散列法(哈希桶)

又叫链地址法、开链法
先用哈希函数算出每个关键码的哈希地址,具有相同地址的关键码归于同一子集合,每个子集合称为一个,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中
在这里插入图片描述
从这个图可以看出:开散列中每个桶放的都是发生哈希冲突的元素

  • 在一些哈希表的实现中,当哈希桶中的链表长度超过一定阈值时,可能会将链表转换为红黑树。因为当链表长度较长时,查找、插入和删除操作的时间复杂度会变得较高,而红黑树的时间复杂度相对较低,将链表转换为红黑树可以提高哈希表的性能
  • 在JDK 8中的HashMap实现中,当链表长度超过8个元素时,会将链表转换为红黑树

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

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

相关文章

34 使用 LNMP 架构部署动态网站环境

源码包程序 LNMP 动态网站部署架构 LNMP 动态网站部署架构是一套由 Linux Nginx MySQL PHP 组成的动态网站系统 解决方案。 1. 准备工作 在使用源码包安装服务程序之前,首先要让安装主机具备编译程序源码的环境。这需要 具备 C 语言、C语言、Perl 语言的编译器&…

【Linux系统学习】2.Linux基础命令

Linux基础命令 Linux的目录结构 Linux命令入门 目录切换相关命令(cd/pwd) 相对路径、绝对路径和特殊路径符 创建目录命令(mkdir) 文件操作命令part1(touch、cat、more) 文件操作命令part2(cp、mv、rm) 查找命令(which、find) grep、wc和管道符…

AI绘画作品的展示和变现-2

4.7 制作红包封面 中国的节日和传统文化元素仍然可以成为创作者们的创作灵感,创造出更多的变现机会。比如元宵节,可以制作大型元宵图案,进行引流并卖出元宵。 而春分、谷雨等节气也可以成为创作的灵感来源,创作出与之相关的图案&…

双场板功率GaN HEMT电容模型以精确模拟开关行为

标题:Capacitance Modeling in Dual Field-Plate Power GaN HEMT for Accurate Switching Behavior(TED.16年) 摘要 本文提出了一种基于表面电位的紧凑模型,用于模拟具有栅极和源极场板(FP)结构的AlGaN/G…

更新至2022年,各省人口高质量城镇化指标体系构建原始数据(13个指标)

更新至2022年,各省人口高质量城镇化指标体系构建原始数据 1、时间:更新至2022年,具体每个指标时间见下文 2、来源:整理自国家统计局、统计年鉴 3、范围:31省市 4、指标: 2008-2022年每十万人口高等学校…

vue3 腾讯tdesign 后台管理框架的使用

1.介绍 TDesign 是具有包容性的设计体系,它强调为业务提供产品、服务等过程中,追求以人为本、人人受益的包容性,要求搭建过程中,了解业务底层,理解业务场景的多样性,并在繁杂的业务场景中寻找共性和特性&a…

下个目标,突破 10w+

转眼间,2023 年已经过去了,今天是大年初四,还有十来天就马上除夕了,迈入新的一年。 回顾 2023 年,如果让我给自己打分,我算是 7.5 分吧。 在这一年了,工作上表现平平,并没有什么突…

Ubuntu Desktop - Screenshot (截图工具)

Ubuntu Desktop - Screenshot [截图工具] 1. Search your computer -> Screenshot -> Lock to Launcher2. gnome-screenshot3. System Settings -> Keyboard -> ShortcutsReferences 1. Search your computer -> Screenshot -> Lock to Launcher 2. gnome-s…

网络渗透测试:Wireshark抓取qq图片

Wireshark Wireshark Downloadhttps://www.wireshark.org/download.html 简介 WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程中各种问题定位。本文主要内容包括: 1、Wireshar…

【Vitis】Vitis HLS简介

Vitis HLS简介 Vitis™HLS是一种高层次综合工具,支持将C、C和OpenCL™函数硬连线到器件逻辑互连结构和RAM/DSP块上。 Vitis HLS可在Vitis应用加速开发流程中实现硬件内核,并使用C/C语言代码在VivadoDesign Suite中为赛灵思器件设计开发RTL IP。 【Vitis…

智慧医院系统架构整体设计与实现

随着信息技术的不断发展,智慧医院系统作为医疗行业的重要应用,正在逐渐成为医院管理和服务的重要工具。本文将介绍智慧医院系统的整体架构设计原则和关键组件,以及如何实现一个安全、高效和可扩展的智慧医疗服务平台。 内容: 1.…

MQTT的学习与应用

文章目录 一、什么是MQTT二、MQTT协议特点三、MQTT应用领域四、安装Mosquitto五、如何学习 MQTT 一、什么是MQTT MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,设计用于在低带宽、不稳定的网络环境中进行高效的通信…

Codeforces Round 729 (Div. 2)B. Plus and Multiply(构造、数学)

题面 链接 B. Plus and Multiply 题意 给定 n , a , b n,a,b n,a,b 可以进行的操作 ∗ a *a ∗a b b b 最开始的数是1 问能否经过上面的两种操作将1变为n 题解 这题的关键是能不能想出来这个集合里面…

Java实现免税店商城管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2 研究方法 三、系统展示四、核心代码4.1 查询免税种类4.2 查询物品档案4.3 新增顾客4.4 新增消费记录4.5 审核免税 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的免税店商城管理系…

RK3568笔记十四:yolov8pose部署

若该文为原创文章,转载请注明原文出处。 本篇参考山水无移大佬文章,并成功部署了yolov8pose在RK3568板子上,这里记录下全过程。 在此特感谢所有分享的大佬,底部附大佬的链接。 一、环境 1、平台:rk3568 2、开发板: …

牛客错题整理——C语言(实时更新)

1.以下程序的运行结果是&#xff08;&#xff09; #include <stdio.h> int main() { int sum, pad,pAd; sum pad 5; pAd sum, pAd, pad; printf("%d\n",pAd); }答案为7 由于赋值运算符的优先级高于逗号表达式&#xff0c;因此pAd sum, pAd, pad;等价于(…

QAnything之BCEmbedding技术路线

QAnything和BCEmbedding简介 QAnything[github]是网易有道开源的检索增强生成式应用&#xff08;RAG&#xff09;项目&#xff0c;在有道许多商业产品实践中已经积累丰富的经验&#xff0c;比如有道速读和有道翻译。QAnything是一个支持任意格式文件或数据库的本地知识库问答系…

java微服务面试篇

目录 目录 SpringCloud Spring Cloud 的5大组件 服务注册 Eureka Nacos Eureka和Nacos的对比 负载均衡 负载均衡流程 Ribbon负载均衡策略 自定义负载均衡策略 熔断、降级 服务雪崩 服务降级 服务熔断 服务监控 为什么需要监控 服务监控的组件 skywalking 业务…

【开源】SpringBoot框架开发农家乐订餐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核心代码4.1 查询菜品类型4.2 查询菜品4.3 加购菜品4.4 新增菜品收藏4.5 新增菜品留言 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的农家乐订餐系统&#xff0c…

Ubuntu Desktop - scrolling (Terminal 缓存更多终端历史输出内容)

Ubuntu Desktop - scrolling [Terminal 缓存更多终端历史输出内容] 1. ubuntu-14.04.5-desktop-amd64.iso2. ubuntu-16.04.3-desktop-amd64.isoReferences Terminal -> 右键 Profiles -> Profile Preferences 1. ubuntu-14.04.5-desktop-amd64.iso 2. ubuntu-16.04.3-de…