数据结构---哈希表
基本概念
哈希函数(Hash Function)是一种将输入的数据(通常是任意大小的)映射到固定大小的输出(通常是一个固定长度的值)的函数。这个输出值通常称为“哈希值”(Hash Value)或“哈希码”(Hash Code)。
- 基本特点:
- 确定性:同样的输入必须产生相同的输出。
- 快速计算:哈希函数应该能够快速计算出来,特别是在处理大量数据时。
- 输出固定大小:无论输入数据的大小如何,哈希函数的输出应该是固定长度的。
- 均匀分布:哈希值应该尽量均匀地分布在输出空间中,以减少哈希冲突。
- 哈希冲突(Hash Collision)是指不同的输入数据经过哈希函数处理后,映射到相同的哈希值或相同的哈希槽(桶)中。由于哈希表的槽位是有限的,而输入的可能性是无限的,因此哈希冲突是不可避免的。为了有效地管理哈希冲突,我们需要使用冲突解决策略。
选择冲突解决策略的考虑因素:
- 负载因子:负载因子是指哈希表中元素个数与表的大小之比。如果负载因子过高,冲突会增多,性能也会下降。链式法在负载因子较高时性能依然较好,而开放地址法则可能出现性能瓶颈。
- 存储需求:链式法需要额外的空间来存储链表或其他数据结构,而开放地址法则不需要额外的空间,但可能会在高负载因子时导致查找效率下降。
- 查找和插入频率:如果哈希表中的查找操作多于插入操作,使用链式法可能更合适,因为在链式法中查找冲突的元素比较简单。对于插入和查找都频繁的场景,开放地址法或渐进式哈希可能表现得更好。
哈希冲突解决方法:
链式法(Chaining):
- 在这种方法中,每个哈希桶不仅仅存储一个元素,而是存储一个元素链表(或其他数据结构,如链表、二叉树等)。当多个元素哈希到同一个桶时,它们就以链表的形式存储在该桶中。
- 优点:
- 实现简单。
- 不需要额外的空间重新哈希(如果槽位已满,只需动态扩展链表即可)。
- 哈希表大小可以灵活扩展,不需要预先确定哈希表的大小。
- 缺点:
- 在极端情况下(所有元素都哈希到同一个桶),查找的时间复杂度可能退化为 O(n)。
- 链表的管理和扩展可能需要额外的空间开销。
开放地址法(Open Addressing):
在开放地址法中,所有元素都存储在哈希表的主数组中,而不使用额外的数据结构(如链表)。当发生冲突时,形成某个探测序列;按此序列逐个探测散列表中的其他地址,直到给定的关键字或一个空地址(开放的地址)为止,将发生冲突的记录放到该地址中。
散列地址的计算公式:Hi(key)=(H(key)+di) MOD m,i=1,2,…,k(k<=m-1)
- H(key):哈希函数
- m:散列表长度
- di:第i次探测时的增量序列;
- Hi(key):经过i次探测后得到的散列地址。
- 常见的开放地址法有:
1.线性探测(Linear Probing):
将散列表T[0,…m-1]看成循环向量。当发生冲突时,从初次发生冲突的位置依次向后探测其他的地址。
增量序列:di=0,1,2,3,…m-1
设初次发生冲突的地址是h,则依次探测T[h+1],T[h+2]…,直到T[m-1]时又循环到表头,再次探测T[0],T[1]…,直到T[h-1]
探测终止的情况:
1.表中对应位置,已经存在该元素
2.直到循环完成,仍为探测到空地址,散列表满。
- 优点:只要散列表未满,总能快速简单的找到一个不冲突的散列地址。
- 缺点:容易形成聚集(clustering),每个产生冲突的记录被散列到离冲突最近的空地址上,从而又增加了更多的冲突机会。
2.二次探测(Quadratic Probing):
增量序列:d= ±1^2、±2^2、±3^2…±n^2 等。(具体增量序列根据题目要求来)
- 优点:探测序列跳跃式的散列到整个表中,比线性探测减少了聚集问题。
- 缺点:不能保证探测到散列表的所有地址。
3.伪随机探测法
增量序列使用一个伪随机函数来产生一个落在闭区间[1,m-1]的随机序列。
双重哈希(Double Hashing):
使用第二个哈希函数来计算冲突元素的探测间隔。具体来说,若一个元素哈希到的位置已被占用,则使用另一个哈希函数来决定下一个探测位置。
优点:冲突的概率较小,避免了聚集问题。
缺点:需要额外的哈希函数,且实现较为复杂。
再哈希法(Rehashing):
- 再哈希法是解决哈希冲突的一种方法,它涉及使用多个哈希函数。当使用第一个哈希函数产生冲突时,再哈希法会尝试第二个哈希函数,如果仍然冲突,就继续使用第三个,以此类推,直到找到一个没有冲突的哈希值。
- 优点:
- 能够降低冲突率,提高查找效率。
- 适用于处理大量数据的场景。
- 缺点:
- 再哈希会导致重新计算所有元素的哈希值,增加计算时间和空间开销。
- 当哈希表扩展时,可能会出现性能问题(尤其是在元素非常多时)。
渐进式哈希(Cuckoo Hashing):
- 渐进式哈希是一种更复杂的解决冲突的方法。在这种方法中,每个元素有两个哈希位置。如果一个位置已经被占用,新的元素会“逐出”原来的元素,原来的元素会被移动到它的备用位置(通过另一个哈希函数)。这样逐步交换直到没有冲突。
- 优点:
- 查找操作时间复杂度始终保持在 O(1)。
- 极低的冲突率,适合大规模数据。
- 缺点:
- 插入操作较为复杂。
- 需要较多的空间,且逐出和迁移元素的过程可能导致性能下降。
以人言善我,必以人言罪我。 —韩非
相关文章:
数据结构---哈希表
基本概念 哈希函数(Hash Function)是一种将输入的数据(通常是任意大小的)映射到固定大小的输出(通常是一个固定长度的值)的函数。这个输出值通常称为“哈希值”(Hash Value)或“哈希…...
DataWhale组队学习 leetCode task4
1. 滑动窗口算法介绍 想象你正在用一台望远镜观察一片星空。望远镜的镜头大小是固定的,你可以通过滑动镜头来观察不同的星区。滑动窗口算法就像这台望远镜,它通过一个固定或可变大小的“窗口”来观察数组或字符串中的连续区间。 滑动操作:就像…...
【ESP32】ESP-IDF开发 | WiFi开发 | UDP用户数据报协议 + UDP客户端和服务器例程
1. 简介 UDP协议(User Datagram Protocol),全称用户数据报协议,它是一种面向非连接的协议,面向非连接指的是在正式通信前不必与对方先建立连接, 不管对方状态就直接发送。至于对方是否可以接收到这些数据内…...
【PyQt5】数据库连接失败: Driver not loaded Driver not loaded
报错内容如下: 可以看到目前所支持的数据库驱动仅有[‘QSQLITE’, ‘QMARIADB’, ‘QODBC’, ‘QODBC3’, ‘QPSQL’, ‘QPSQL7’] 我在网上查找半天解决方法未果,其中有一篇看评论反馈是可以使用的,但是PyQt5的版本有点低,5.12…...
Unity游戏(Assault空对地打击)开发(1) 创建项目和选择插件
目录 前言 创建项目 插件导入 地形插件 前言 这是游戏开发第一篇,进行开发准备。 创作不易,欢迎支持。 我的编辑器布局是【Tall】,建议调整为该布局,如下。 创建项目 首先创建一个项目,过程略,名字请勿…...
Rust:如何动态调用字符串定义的 Rhai 函数?
在 Rust 中使用 Rhai 脚本引擎时,你可以动态地调用传入的字符串表示的 Rhai 函数。Rhai 是一个嵌入式脚本语言,专为嵌入到 Rust 应用中而设计。以下是一个基本示例,展示了如何在 Rust 中调用用字符串传入的 Rhai 函数。 首先,确保…...
A星算法两元障碍物矩阵转化为rrt算法四元障碍物矩阵
对于a星算法obstacle所表示的障碍物障碍物信息,每行表示一个障碍物的坐标,例如2 , 3; % 第一个障碍物在第二行第三列,也就是边长为1的正方形障碍物右上角横坐标是2,纵坐标为3,障碍物的宽度和高度始终为1.在rrt路径规划…...
【C++】设计模式详解:单例模式
文章目录 Ⅰ. 设计一个类,不允许被拷贝Ⅱ. 请设计一个类,只能在堆上创建对象Ⅲ. 请设计一个类,只能在栈上创建对象Ⅳ. 请设计一个类,不能被继承Ⅴ. 请设计一个类,只能创建一个对象(单例模式)&am…...
单细胞分析基础-第一节 数据质控、降维聚类
scRNA_pipeline\1.Seurat 生物技能树 可进官网查询 添加链接描述 分析流程 准备:R包安装 options("repos"="https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packages("BiocManager",update = F,ask =…...
多项日常使用测试,带你了解如何选择AI工具 Deepseek VS ChatGpt VS Claude
多项日常使用测试,带你了解如何选择AI工具 Deepseek VS ChatGpt VS Claude 注:因为考虑到绝大部分人的使用,我这里所用的模型均为免费模型。官方可访问的。ChatGPT这里用的是4o Ai对话,编程一直以来都是人们所讨论的话题。Ai的出现…...
每日一题-判断是否是平衡二叉树
判断是否是平衡二叉树 题目描述数据范围题解解题思路递归算法代码实现代码解析时间和空间复杂度分析示例示例 1示例 2 总结 ) 题目描述 输入一棵节点数为 n 的二叉树,判断该二叉树是否是平衡二叉树。平衡二叉树定义为: 它是一棵空树。或者它的左右子树…...
FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验
文章目录 FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验概述笔记my_fltk_test.cppfltk_test.hfltk_test.cxx用adjuster工程试了一下,好使。END FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验 概述 用fluid搭建UI…...
《多阶段渐进式图像修复》学习笔记
paper:2102.02808 GitHub:swz30/MPRNet: [CVPR 2021] Multi-Stage Progressive Image Restoration. SOTA results for Image deblurring, deraining, and denoising. 目录 摘要 1、介绍 2、相关工作 2.1 单阶段方法 2.2 多阶段方法 2.3 注意力机…...
AWScurl笔记
摘要 AWScurl是一款专为与AWS服务交互设计的命令行工具,它模拟了curl的功能并添加了AWS签名版本4的支持。这一特性使得用户能够安全有效地执行带有AWS签名的请求,极大地提升了与AWS服务交互时的安全性和有效性。 GitHub - okigan/awscurl: curl-like acc…...
QT使用eigen
QT使用eigen 1. 下载eigen https://eigen.tuxfamily.org/index.php?titleMain_Page#Download 下载后解压 2. QT引入eigen eigen源码好像只有头文件,因此只需要引入头文件就好了 qt新建项目后。修改pro文件. INCLUDEPATH E:\222078\qt\eigen-3.4.0\eigen-3.…...
揭示Baklib企业内容管理系统CMS的核心功能与应用价值
内容概要 企业内容管理系统(CMS)是指通过一系列工具和技术,帮助企业高效地创建、存储、管理和分发数字内容的系统。这些系统在现代企业运作中发挥着至关重要的作用,尤其是在信息量大、业务流程复杂的环境中。Baklib作为一个突出的…...
如何跨互联网adb连接到远程手机-蓝牙电话集中维护
如何跨互联网adb连接到远程手机-蓝牙电话集中维护 --ADB连接专题 一、前言 随便找一个手机,安装一个App并简单设置一下,就可以跨互联网的ADB连接到这个手机,从而远程操控这个手机做各种操作。你敢相信吗?而这正是本篇想要描述的…...
flume和kafka整合 flume和kafka为什么一起用?
Flume和Kafka一起使用的主要原因是为了实现高效、可靠的数据采集和实时处理。12 实时流式日志处理的需求 Flume和Kafka结合使用的主要目的是为了完成实时流式的日志处理。Flume负责数据的采集和传输,而Kafka则作为消息缓存队列,能够有效地缓冲数据,防止数据堆积或丢…...
java.util.Random类(详细案例拆解)(已完结)
前言: 小编打算近期更俩三期类的专栏,一些常用的专集类,给大家分好类别总结和详细的代码举例解释。 今天是除夕,小编先祝贺大家除夕快乐啦!! 今天是第六个 java.lang.Math 包中的 java.util.Random类 我…...
Java后端之AOP
AOP:面向切面编程,本质是面向特定方法编程 引入依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>示例:记录…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
