哈希表简单介绍

概念

顺序结构以及平衡树中,元素关键字与他们存储的位置并没有直接的映射关系,从而会影响查找关键字的效率,顺序结构中查找关键字的时间复杂度为O(N),平衡树查找关键字的时间复杂度为O(log2^N)。

最理想的搜索方法——只搜索一次就能找到关键字。

如果有一种数据结构,能够使得关键字根据某种映射规则,将关键字和它的存储位置一一映射起来,那么在查找时通过映射规则就能够很快将关键字查找出来。

在这个数据结构中

插入元素:

根据某种特定的映射规则,找到关键字在存储结构中的位置,然后插入。

搜索元素:

根据某种特定映射规则,将求得的函数值作为元素的存储位置,然后与结构中此位置的元素比较,若关键字相等,则搜索成功。

该方式就被称为哈希或者散列,使用的映射函数就为哈希函数或者散列函数,构造出来的存储结构就为哈希表或者散列表。

比如:数据集合{1,7,6,4,5,9}

如果哈希函数设置为hash(key)=key%10,则数据在存储结构内会呈现以下关系

该方法查找每一个数只需要进行一次比较,效率很高,但是这种存储方式在实际使用的时候会导致很多的空间浪费,有些空间为空,被没有被有效利用起来,所以实际使用时模数的取值一般为不超过存储结构容量的最大质数。

哈希冲突

哈希冲突的原因是由于,当有一组数据需要通过相同的映射规则存储到到一个存储结构时,此时就有可能两个数得到的hash(key)的值相同,但是又不可能将两个数字同时存储在一个空间里面,这时就造成了哈希冲突,或者叫哈希碰撞。

此时把具有相同哈希地址的不同关键字记为“同义词”。

发生哈希表该如何处理呢?

处理方法

拉链法

比如:数据集合{1,7,6,4,5,9,12,25,36}

加入存储结构容量为7,则哈希函数为hash(key)=key%7。

这种情况就将哈希地址相同的数据元素依次链接到之前元素的后面。

成功查找的平均查找长度 ASL成功=(6*1+2*2)/9=1.11

ASL失败=9/7=1.286。

装填因子=表中记录数/散列表长度。

装填因子越大表示表装得越满。

直接定址法

取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B

由于这是一个一次函数,所以对于每一个不相同的元素对应的值就不相同,所以哈希地址不会存在冲突。

优点:简单、均匀

缺点:需要事先知道关键字的分布情况
使用场景:适合查找比较小且连续的情况

开放定址法

线性探测法

意思就是通过哈希函数处理后得到的关键字哈希地址如果存在冲突,那么就依次往后面去找空位将这个数放进去。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.Net6/.Net8(.Net Core) IIS中部署 使用 IFormFile 上传大文件报错解决方案

描述 最近使用.Net6 WebAPI IFormFile对象接收上传文件时大于30MB(兆)的文件就会报错 原因分析 IIS上传文件有大小默认限制大约28.6MB 解决办法 .无论是Net6还是.Net8写法都一样 方法一:IIS可视化操作 1.打开Internet Information Services (llS)管理器&…

Pandas读取某列、某行数据——loc、iloc区别

loc:通过行、列的名称或标签来索引 iloc:通过行、列的索引位置来寻找数据 首先,我们先创建一个DataFrame生成数据 import pandas as pddata {a:[1,2,3,4,5],b:[6,7,8,9,10],c:[11,12,13,14,15] } data pd.DataFrame(data) print(data) 运行…

关于【禁止new对象时在for循环内定义申明变量】

文章目录 简介代码分析反编译之后对比性能测试内存与垃圾回收情况JDK和常用框架怎么写总结依赖 简介 不知道是谁最先提出了一个不要将变量定义在循环内。 然后我们在代码扫描中有一项是:【禁止new对象时在for循环内定义申明变量】 我也好奇为什么不能&#xff1f…

e冒泡排序---复杂度O(X^2)

排序原理: 1.比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。 2.对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值, public class 冒泡排序 {public static void main(String[] args) {I…

学习使用LangGraph x GPT-Researcher构建一个多智能体架构的AI自主研究助理

原文:学习使用LangGraph x GPT-Researcher构建一个多智能体架构的AI自主研究助理 - 百度智能云千帆社区 本文为大家剖析一个通过多智能体协作来完成的AI研究助理,可以用来帮助进行各种综合的在线研究任务并输出报告。该应用基于LangGraph以及开源的GPT-…

electron有关mac构建

针对 Mac M1/2/3 芯片的设备,proces.archarm64. 执行下面命令,检查下按照的 node.js 版本是不是 intel x64 指令集,如果是的话安装下 arm64 指令集的 node.js终端中执行以下命令:node -p process.arch 对应的node版本也是arm版 …

YoloV10 训练自己的数据集(推理,转化,C#部署)

目录 一、下载 三、开始训练 train.py detect.py export.py 超参数都在这个路径下 四、C#读取yolov10模型进行部署推理 如下程序是用来配置openvino 配置好引用后就可以生成dll了 再创建一个控件,作为显示 net framework 4.8版本的 再nuget工具箱里下载 …

春之学习:SpringBoot在线教育平台构建

第三章 系统分析 3.1 系统设计目标 在线视频教育平台主要是为了用户方便对首页、个人中心、用户管理、教师管理、课程信息管理、课程类型管理、我的收藏管理、系统管理、订单管理等信息进行查询,也是为了更好的让管理员进行更好存储所有数据信息及快速方便的检索功能…

僵尸网络开发了新的攻击技术和基础设施

臭名昭著的 Quad7 僵尸网络(也称为 7777 僵尸网络)不断发展其运营,最近的发现表明其目标和攻击方法都发生了重大变化。 根据 Sekoia.io 的最新报告,Quad7 的运营商正在开发新的后门和基础设施,以增强僵尸网络的弹性&a…

K8s利用etcd定时备份集群结合钉钉机器人通知

如何通过脚本的方式进行K8s集群的备份 查看K8s中master节点中etcd集群的状态 kubectl get pods -n kube-system | grep etcd由于使用的etcd服务是K8s搭建时自身携带的,并不是独立搭建的etcd集群信息。使用 K8s 搭建集群时,etcd 是 Kubernetes 集成的一个重要组件因此需要查…

DDR3AXI4接口读写仿真

前文已经介绍了DDR3和AXI4总线的相关知识,我们知道MIG ip核除了可以生成native接口还能生成AXI4接口,今天就练习一下将AXI4接口的DDR3打包成FIFO。首先我们生成一个AXI4接口的MIG ip核,其余步骤与Native接口的ip核相同,如果我们勾…

vue3.0 使用echarts与echarts-gl 实现3D饼图

效果 安装echarts npm install echarts npm install echarts-gl 3d饼图组件&#xff1a; <template><div style"width: 100%; height: 100%" ref"echart"></div> </template><script setup> import { reactive, ref, onMou…

质量追溯管理在MES系统中举足轻重

1. 质量追溯管理概述 质量追溯管理是指通过记录和监控产品在生产过程中的关键信息&#xff0c;确保在产品出现质量问题时&#xff0c;能够迅速追踪到问题源头&#xff0c;并采取相应措施的一种管理方法。在现代制造业中&#xff0c;质量追溯管理对于保障产品质量、提升客户满意…

关于 vue/cli 脚手架实现项目编译运行的源码解析

1.vue项目运行命令解析 在日常开发中&#xff0c;vue 项目通过vue-cli-service脚手架包将项目运行起来&#xff0c;常用的命令例如&#xff1a; npm run serve npm run build 上述执行命令实际一般对应为项目中 package.json 文件的 scripts属性中编写的脚本命令&#xff0c;在…

Python 课程5-NumPy库

在数据处理和科学计算中&#xff0c;NumPy 是一个非常强大且基础的库。除了基本的创建数组功能之外&#xff0c;NumPy 提供了许多强大的函数和方法&#xff0c;用于执行高级的矩阵运算、统计分析、逻辑操作等。以下是一些常用且非常有用的 NumPy 指令&#xff0c;涵盖了创建数组…

java: 程序包org.junit.jupiter.api不存在

明明idea没有报错&#xff0c;引用包也没问题&#xff0c;为啥提示java: 程序包org.junit.jupiter.api不存在&#xff1f; 配置&#xff01;还TMD是配置&#xff01; 如果是引用包的版本不对或者其他&#xff0c;直接就是引用报错或者pom里面飘红了。 这个应该是把generat…

设置使用阿里云服务器DNS

由于云服务器是从腾讯云迁移到阿里云&#xff0c;然后使用ssl验证时一直无法使用dns验证&#xff0c;也无法创建三级域名&#xff0c;原来需要把阿里云服务器改成阿里云的dns使用 如果使用其他服务器DNS会下面会显示当前DNS服务器&#xff0c;

冯诺依曼体结构与系统

冯诺依曼结构 我们的计算机&#xff0c;以及服务器&#xff0c;还有我我们日常使用的洗衣机都遵循冯诺依曼体结构。 以我们日常使用qq聊天时举例&#xff0c;冯诺依曼体结构可以这样画 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成 输入单元…

基于SpringBoot+Vue+MySQL的美术馆管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着文化艺术产业的蓬勃发展&#xff0c;美术馆作为展示与传播艺术的重要场所&#xff0c;其管理工作变得日益复杂。为了提升美术馆的运营效率、优化参观体验并加强艺术品管理&#xff0c;我们开发了基于SpringBootVueMySQL的美…

SAP B1 营销单据 - 单据字段介绍(中)

背景 营销单据&#xff0c;SAP B1 中一群神秘的单据&#xff0c;在官方说明文档中并未指明【营销单据】范围&#xff0c;却经常使用这一说法。它们结构相似&#xff0c;在 用户定义字段(UDF) 功能里统一受【营销单据】部分增加字段的影响&#xff0c;可以相互复制&#xff08;…