【C++:哈希】

目录

哈希概念

哈希冲突

如何解决哈希冲突?

闭散列

开散列/哈希桶(链地址法)

负载因子


哈希概念

哈希:

  1. 一种高效用来搜索的数据结构。
  2. 哈希利用某一种函数使元素的存储位置与它的关键码之间建立一个映射关系,方便查找元素。
  3. 哈希中建立这种映射关系的函数叫做哈希函数,也叫做散列函数。
  4. 散列函数就是计算元素在哈希中所存储的位置,通过该函数来存放元素。

    小例子:手机通序录对联系人的分配,通讯录根据人名的首字母对联系人进行分类存储。这种就是哈希存储。通序录通过名字的首字母与联系人之间产生一种映射关系

哈希冲突

  1. 哈希的底层是一个数组实现的,叫做哈希表(散列表)
  2. 通过哈希函数计算元素在哈希中存储的下标
  3. 不可避免的的是,哈希函数计算出来的存储位置很有可能会与之前计算出来的其他元素的存储位置一样,但该位置不为空,这种现象叫做哈希冲突。

如何解决哈希冲突?

  • 闭散列

从发生哈希冲突的位置开始查找“下一个”空位置,俩种查找方式:

  1. 线性探测:从发生哈希冲突的位置接着往下查找,如果查找到末尾也没有发现空位置就会哈希表的起始位置继续查找,找到空位置即查找结束。
  2. 二次探测:不是探测俩次,而是当发生哈希冲突时,该元素的位置会被重新计算,H(i)=H(0)+i^2或者H(i)=H(0)-i^2  该表达式意思:本次哈希地址=前一次哈希地址+2*i,    i是第几次线性探测                                                                                                         线性探测的优点:当发生哈希冲突时,查找下一个空位方便                                                             缺点:如果发生哈希冲突,冲突的元素容易连成一片
  3. 赋予每一个空间一个状态标记                                                                                       当空间被元素占取,则标记为EXIT,空间为空,则标记为EMPTY。
  • 开散列/哈希桶(链地址法)

  1.  数组+链表的集合                                                                                                             数组中每个元素都是链表,每个链表都是发生发生哈希冲突的元素
  2. 如何使用?

(1)insert

  • 利用哈希函数计算出桶号
  • 创造节点
  • 头插进入哈希桶中

(2)扩容

  • new开辟空间
  • 把旧桶中的链表一一取下,计算新的桶号,头插到新桶中
  • 释放旧桶

(3)find

  • 通过哈希函数计算出需要查找的元素所对应的桶号
  • 检测该元素是否在该桶的链表中

(4)earse

  • 通过find函数查看所删除的元素是否存在
  • 如果存在,通过哈希函数计算出需要删除元素所对应的桶号,找到元素并删除

负载因子

负载因子:已存储元素个数/哈希表长度


为了减少哈希冲突,提高哈希性能,这里引入了负载因子的概念。当哈希表存储了一定元素时,发生扩容,并重新计算元素间的映射关系。 


为什么扩容之后,不直接使用memcpy把旧表中的元素拷贝到新表中?

哈希是一个存在位置映射关系的表,当表的容量发生变化时,意味着表中的元素会重新计算表中的位置

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

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

相关文章

SpringBoot+Vue 数据的批量导入和导出

导出 总结了三种导出数据为表格的情况,直接上代码!! 整体导出 后端接口: // 批量导出数据GetMapping("/export")public void exportDate(HttpServletResponse response) throws IOException {ExcelWriter writer…

前端axios发送请求如何导出excel文件?

// 导出方法 function down(){let reqUrl import.meta.env.BASE_URL /api/AboutView/downLoad?aboutTypeadmin_temp;let _token sessionStorage.get(token).replace(/\"/g, "");let xhr new XMLHttpRequest();xhr.open("get", reqUrl, true);xhr…

计算机网络 交换机的安全配置

一、理论知识 1.交换机端口安全功能介绍 交换机端口安全功能是针对交换机端口进行安全属性的配置,以控制用户的安全接入。主要包括以下两种配置项: ①限制交换机端口的最大连接数:控制交换机端口连接的主机数量;防止用户进行恶…

Java常用类--String类--上

String类 String类介绍 (1)创建的每个字符串实际上都是String类的对象。即使是字符串字面值实际上也是String对象。 (2)String类型的对象是不可变的;一旦创建了一个String对象,其内容就不能再改变。即&a…

【华为OD机试】Linux发行版的数量(C++ Java JavaScript Python )

题目 题目描述 Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。 发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有…

kafka基础概念

目录 1、kafka简介 2、kafka使用场景 3、kafka基础概念 3.1、消息 3.1.1、消息构成详解 3.1.2、消息存储设计 3.2、topic 3.3、partition 3.4、offset 3.5、replication 3.5.1、replication简介 3.5.2、副本角色 3.5.3、副本类型 3.5.3.1、副本类型简介 3.5.3.2、…

30分钟学习如何搭建扩散模型的运行环境【pytorch版】【B站免费视频教程!】【解决环境搭建问题】

30分钟学习如何搭建扩散模型的运行环境【B站免费视频教程!】【解决环境搭建问题】 动手学习扩散模型 点击以下链接即可进入学习: B站免费视频教程环境配置安装(配套讲解文档) 视频 讲解主要内容 一、环境设置 1.本地安装&…

用Python设置Excel工作表网格线的隐藏与显示

Excel表格界面的直观性很大程度上得益于表格中的网格线设计,这些线条帮助用户精确对齐数据,清晰划分单元格。网格线是Excel界面中默认显示的辅助线,用于辅助定位,与单元格边框不痛,不影响打印输出。然而,在…

fyne的对话框

对话框 import "fyne.io/fyne/v2/dialog"dialog包 定义了应用程序GUI的标准对话框窗口。 NewError NewError()为应用程序错误在指定的窗口上创建一个对话框。该消息是从提供的错误中提取的(不应为nil)。创建后,您应该调用Show()…

gpu测试渲染网站有哪些?免费GPU渲染平台介绍

GPU作为渲染领域的核心硬件,对于提高渲染速度和质量起着决定性作用。尽管购买高性能GPU的成本相对较高,但是通过GPU云渲染平台,用户可以以较低的成本享受到高效渲染服务的便利。现在,探索一些提供免费试用的GPU云渲染服务网站&…

深入理解DB2中的日志管理与监控:SYSIBMADM.LOG_UTILIZATION和SYSIBMADM.SNAPDB视图

深入理解DB2中的日志管理与监控:SYSIBMADM.LOG_UTILIZATION和SYSIBMADM.SNAPDB视图 DB2是一个强大的关系数据库管理系统,日志管理和监控是其运维管理的重要组成部分。本文将深入探讨两个关键的系统管理视图:SYSIBMADM.LOG_UTILIZATION 和 SY…

怎么查找企业的经营动态信息?

很多人都会查询企业的经营动态,比如很多投资者会关注企业的财务状况,市场战略,经营决策等信息;职场上也需要了解竞争对手和合作伙伴的相关经营动态,新品发布,技术专利申请等等。还有一些行业研究人员需要了…

Qt源码阅读笔记:初步了解QtCore模块目录结构

Qt框架是一个跨平台的C应用程序框架,广泛用于开发图形用户界面程序以及用于无界面后台操作的工具和服务器。它由多个模块组成,其中QtCore模块提供了核心的非GUI功能。 QtCore 提供了元对象系统,扩展了c 在元对象系统的基础上,qt又…

14、电科院FTU检测标准学习笔记-录波功能2

作者简介: 本人从事电力系统多年,岗位包含研发,测试,工程等,具有丰富的经验 在配电自动化验收测试以及电科院测试中,本人全程参与,积累了不少现场的经验 ———————————————————…

光猫BOB 功率调测误差分析与校验指南

DDM(Digital Diagnostic Monitoring)数字诊断监控技术,是光模块中使用的技术,以便用户能够监控光模块的实时参数。这些参数包括工作温度、工作电压、工作电流、发射和接收光功率等,还可以显示模块的常规波长、速率、传…

工控机和电脑一直ping不通

问题 工控机和电脑通过网线直连,电脑端是USB-网口转换器,一直互相ping不通,反复确认两端的IP地址、子网掩码及路由配置是对的。 原因 具体原因不明。 解决办法 但是通过将电脑端网卡的速度和模式属性由原来的“自动检测”修改为“100 Mb…

KaTeX数学公式语法手册

文章目录 基础数学符号根号与对数求和与积分矩阵与行列式特殊符号与希腊字母基本算术运算与分数上标与下标求和与积矩阵与向量括号与大括号微积分符号希腊字母特殊函数括号与大括号分段函数、案例与对齐层叠与叠加更多高级用法 借鉴的文档: KaTeX 支持大部分 LaTeX 数学模式中的…

iptables规则生成脚本

清除防火墙规则,以实际情况为准 iptables -F && iptables -X && iptables -Z 自动生成iptables规则脚本,针对于k8s的nodeport端口需要同时drop容器内端口和映射端口,同时如果k8s master集群是高可用需要3个节点都设置防火墙…

解决 pandas 读取 SQL Server 中的数据时,遇到 varchar 属性的中文字符显示乱码的问题(新)

通用解决办法(通杀) 读取SQL server中的数据 import pandas as pd from sqlalchemy import create_engine# 根据实际情况修改服务器地址、数据库名、用户名和密码 server your_server_address database your_database_name username your_username pa…

持续增强国产适配 | 宁盾身份域管与南大通用、飞腾完成产品兼容性认证

随着党政、央国企、金融信创国产化改造日益深入,企业对国产 IT 基础设施生态兼容适配的需求日益迫切。为践行给企业提供“开箱即用”的交付体验承诺,宁盾身份域管持续增强多元异构产品的兼容适配。近日,宁盾身份域管与天津南大通用数据技术股…