HashTable哈希表

概念

散列表(Hash Table),又称哈希表。是一种数据结构,特点是:数据元素的关键字与其存储地址直接相关
在顺序结构以及树型结构中,数据元素的关键字与其存储位置没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( l o g 2 N log_2 N log2N),搜索的效率取决于搜索过程中元素的比较次数。
那么在哈希中是如何建立关键字与存储地址的联系呢?
通过散列函数(哈希函数):hash(key) = key % capacity; capacity为存储元素底层空间总的大小。
举例:
在这里插入图片描述
这时我们引出两个概念

同义词和散列冲突

若不同的关键字通过散列函数映射到同一个值,则称它们为“同义词"通过散列函数确定的位置已经存放了其他元素,则称这种情况为“冲突”。

如何设计哈希函数?

引起哈希冲突的一个原因可能是:哈希函数设计不够合理。
哈希函数设计原则:

  1. 哈希函数的定义域必须包括需要存储的全部关键码,而如果散列表允许有m个地址时,其值域必须在0到m-1之间
  2. 哈希函数计算出来的地址能均匀分布在整个空间中
  3. 哈希函数应该比较简单

除留余数法

散列表表长为m,取一个不大于m但最接近或等于m的质数p,因为质数除了1和自身以外,不能被其他自然数整除,这样可以大大的让哈希函数计算出来的地址能够均匀分布在整个空间。

直接定址法

取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B
它适合关键字的分布基本连续的情况,若关键字分布不连续,空位较多,则会造成存储空间的浪费。
其实就是好像之前的计数排序,我们先计算数据之间的区间大小,然后再按照大小关系去从前到后排放。

如何处理冲突?

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

拉链法(开散列)

存放的每一个元素是一个链表,把相同关键字的数据链接起来,寻找数据的时候,先要找到该关键字的位置再去遍历一遍链表,找到该数据。如图:
在这里插入图片描述

开方地址法(闭散列)

线性检测

就是指可存放新表项的空闲地址既向它的同义词表项开放,又向它的非同义词表项开放。
其数学递推公式为:
在这里插入图片描述
m表示散列表表长;d为增量序列;i可理解为“第i次发生冲突
说人话就是,冲突了就往该冲突元素的后一个位置放。
如图:
在这里插入图片描述
因为线性检测的数据是直接往后堆的,所以而对于那些因为冲突而把数据放在后面的位置来说,他们不仅仅只放同义词的,他也会放非同义词,这样就会大大的影响我们查找数据的速度。

平方检测法

而平方探测法相当是对d(增量序列)做修改。在上面的线性探测来说,d的变化是每一次冲突后探测我就自增1,而平方探测法就是把每一次冲突后探测d自增 ±2^d。
如图:
在这里插入图片描述

代码实现

如何判断存储位置是否已经存值

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

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

相关文章

【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

文章目录 PyQt5 超详细入门级教程前言序篇:1-3部分:PyQt5基础与常用控件第1部分:初识 PyQt5 和安装1.1 什么是 PyQt5?1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运…

《论面向服务架构设计及其应用》写作框架,软考高级系统架构设计师

论文真题 面向服务架构(Service-Oriented Architecture, SOA) 是一种应用框架,将日常的业务应用划分为单独的业务功能服务和流程,通过采用良好定义的接口和标准协议将这些服务关联起来。通过实施基于SOA的系统架构,用户可以构建、部署和整合服务,无需依赖应用程序及其运…

计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

CCDO|数据跃动未来:首席数据官如何引领构建活数据引擎

在数字化浪潮汹涌澎湃的今天,数据已成为企业最宝贵的资产之一,它不仅记录着过去,更预示着未来的方向。随着大数据、人工智能、云计算等技术的飞速发展,数据的潜力被前所未有地激发,而首席数据官(CDO&#x…

opencv之图像梯度

图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分,其灰度值变化较大,梯度值也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小。一般情况下,图像梯度计…

string类--C++

文章目录 一、标准库中的string类1、string类2、auto和范围for2.1、auto关键字2.2、范围for 二、string类的常用接口说明1、string类对象的常见构造2、string类对象的容量操作3、string类对象的访问及遍历操作4、string类对象的修改操作5、string类非成员函数6、vs和g下string结…

004: VTK读入数据---vtkImageData详细说明

VTK医学图像处理---vtkImageData类 目录 VTK医学图像处理---vtkImageData类 简介: 1 Mricro软件的安装和使用 (1) Mricro安装 (2) Mricro转换DICOM为裸数据 2 从硬盘读取数据到vtkImageData 3 vtkImageData转RGB或RGBA格式 4 练习 总结 简介:…

堆的概念与实现

目录 一、堆的介绍 1.堆的概念 2.堆的性质: 3.堆的结构 二、堆的实现 1.堆的定义 2.接口函数 三、堆的实现 1.堆的初始化 2.堆的销毁 3.获取堆顶数据 4.判断堆是否为空 5. 堆的插入 向上调整算法(重点) 向下调整算法(重点) 6.删除…

【unity小技巧】unity 把window项目打包成只有一个exe的运行文件

文章目录 前言一、unity游戏打包window二、下载安装WinRAR压缩包打包工具三、添加压缩文件1、选择全部6个(5个也可以,这个64.exe文件可以省略)文件,右键点击添加到压缩文件2、修改压缩文件名,后缀改成.exe3、选择高级–…

【MySQL】索引和事物

索引和事物 索引索引是什么索引的基本操作索引部分原理数据结构讨论B-树B树 MySQL的索引实现 事物事物的概念事物的使用事物的四大特性(ACID)事物并发问题事物的隔离级别 索引 索引是什么 在正常情况下, 数据库去搜索数据, 都是通过一行行的遍历, 然后找到符合要求的行并且筛…

sql中索引查看是否生效

在pg数据库中有多种索引存在,在一般情况下我们取使用普通索引 以下是一些常见导致索引未命中的原因和优化策略 1.如果查询中的条件与索引字段的顺序不匹配,或者索引字段没有完全包含在查询条件中,索引可能不会被使用。 2.在查询中使用函数…

golang学习笔记05——golang协程池,怎么实现协程池?

推荐学习文档 golang应用级os框架,欢迎stargolang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学习笔记04——如何真正写好Golang代码&#xff1f…

从卫星和飞机等不同传感器方面由QGIS 遥感分析

在地理信息科学 (GIS) 中,遥感是指从远处获取有关地球表面特征信息的行为。遥感数据是从许多不同的平台获取而来,包括卫星、飞机和具有许多不同传感器的固定仪器,包括光谱图像(相机)和激光雷达。最常见的遥感数据形式是卫星和航空图像。 为了充分实现这些照片的价值,需要…

C++类型转换,特殊类设计,IO流

1.类型转换 什么是类型转换?我们知道有些数字类型可以相互转换,如double类型可以转换为int类型,这样的转换会发生切割将double类型的小数部分切割掉丢失精度;还有在前面的多态那块有一个虚函数指针表,这个虚函数指针表…

ZYNQ 入门笔记(二):动态时钟

文章目录 1 概述1.1 DRP1.2 AXI4-Lite 2 示例2.1 单时钟输出2.2 多时钟输出 3 参考文档 1 概述 Clocking Wizard 可通过配置内部寄存器动态调整输出频率,配置接口可选 DRP 或 AXI4-Lite,其中 AXI4-Lite 实际上是对 DRP 接口的封装 1.1 DRP 通过 DRP 接…

用RNN(循环神经网络)预测股票价格

RNN(循环神经网络)是一种特殊类型的神经网络,它能够处理序列数据,并且具有记忆先前信息的能力。这种网络结构特别适合于处理时间序列数据、文本、语音等具有时间依赖性的问题。RNN的核心特点是它可以捕捉时间序列中的长期依赖关系…

C2免杀--手工shellcode编译,shellcode免杀思路

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理C2免杀中 shellcode代码免杀的相关部分 shellcode概念 我们也不啰嗦,我直接直观的描述一下他。 他就是一串机器能运行的代码,但是他不是正统的python,c&#xff…

中伟视界:煤矿皮带运输机异物监测AI算法能检测哪几种异物,通过什么方式来判断异物?

在矿山运输系统中,运输皮带上可能出现各种异物,如大煤块、锚杆、钻杆、煤矸石、木板、铁棍等。这些异物会对运输系统造成损害,影响生产效率,甚至引发安全事故。为了实时监测并识别这些异物,现代技术采用AI算法进行分析…

QT串口读取Serial->readAll()踩过的坑

QT串口读取Serial->readAll接收不完全踩过的坑 Chapter1 QT串口读取Serial->readAll()踩过的坑坑一:坑二 Chapter2 [QT串口上位机BUG解决]json解析数据bug以及接收数据问题问题描述原因分析:解决方案:一、是数据采集端(单片…

Go语言?IDEA能支持吗?增删查走起?

序: 最近突然身边突然开始冒出关于go语言的只言片语,很好奇这个go语言是怎么样的?这几天有空就会去网上浏览一遍各位大咖的简介。这边主要是已学习为目的,关键人家都说它好这边记录一下学习过程的进坑和爬坑过程供大家娱乐一下。…