leetcode-代码随想录-哈希表-哈希理论基础
哈希表理论基础
哈希表:或者称为散列表,是根据关键码的值而直接进行访问的数据结构。
哈希法:用于快速判断一个元素是否出现在集合里
哈希函数是⼀种映射关系,根据关键词key,经过⼀定函数关系 f 得到元素的位置。
存储位置 = f (关键字)
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使得每个关键字 key 对应一个存储位置 f(key)。
把这种对应关系 f 称为散列函数,又称为 哈希函数。采用散列技术将记录存储在一块连续的存储空间中,这种连续的存储空间称为散列表或哈希表。关键字对应的记录存储位置称为散列地址。
散列技术既是一种存储方法,也是一种查找方法。
最适合查找的求解问题是查找与给定值相等的记录 / 用来快速的判断一个元素是否出现在集合里。
直白来讲其实数组就是一张哈希表;
哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示:
哈希函数
例如要查询一个名字是否在这所学校里。
我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。
将学生姓名映射到哈希表上就涉及到了hash function ,也就是哈希函数。
常见的哈希函数构造方法
- 直接定址法:
取关键字或关键字的某个线性函数值为散列地址。
fkey) = a * key + b,其中a和b为常数
简单、均匀,不会产生冲突,适合查找表较小且连续的情况。
- 除留余数法:
取关键字被某个不大于散列表长度m 的数 p 求余,得到的作为散列地址。
f(key) = key % p, p < m
。
通常 p 为小于或等于表长 m 的最小质数或不包含小于20质因子的合数。
- 叠加法:
将关键字分为位数相同的几部分,然后取这几部分的叠加和(舍去进位)作为散列地址。
用于关键字位数较多,并且关键字中每⼀位上数字分布⼤致均匀。
- 随机数法:
选择⼀个随机函数,把关键字的随机函数值作为它的哈希值。
f(key) = random(key)。random是随机函数。
通常当关键字的⻓度不等时⽤这种⽅法。
当关键字是整数类型时就可以⽤除留余数法;如果关键字是⼩数类型,选择随机数法会⽐较好
哈希碰撞
不同关键字通过相同哈希函数计算出相同的哈希地址,该种现象称为哈希冲突或哈希碰撞。
哈希冲突的解决:
- 开放地址法(前提是散列表的长度大于等于所要存放的元素):
发⽣哈希冲突后,按照某⼀次序找到下⼀个空闲的单元,把冲突的元素放⼊。
fi(key) = (f(key) + di) mod m (di是一个随机数列)
- 平方探查法:
从发生冲突的单元加上12,22,32,…,n2,直到遇到空闲的单元
- 再散列函数法:
事先准备多个散列函数,当发生冲突时,就换一个散列函数计算,总有一个可以把冲突解决掉。
- 链地址法:
将哈希值相同的元素构成⼀个链表,head放在散列表中。⼀般链表长度超过了8就转为红⿊树,⻓度少于6个就变为链表。 缺点:指针需要额外的空间
常见的三种哈希结构
当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。
- 数组
- set (集合)
- map(映射)
在C++中,set 和 map 分别提供以下三种数据结构,其底层实现以及优劣如下表所示:
集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
std::set | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
std::multiset | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) |
std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。
映射 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
std::map | 红黑树 | key有序 | key不可重复 | key不可修改 | O(logn) | O(logn) |
std::multimap | 红黑树 | key有序 | key可重复 | key不可修改 | O(log n) | O(log n) |
std::unordered_map | 哈希表 | key无序 | key不可重复 | key不可修改 | O(1) | O(1) |
std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。
当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。
那么再来看一下map ,在map 是一个key value 的数据结构,map中,对key是有限制,对value没有限制的,因为key的存储方式使用红黑树实现的。
相关文章:
leetcode-代码随想录-哈希表-哈希理论基础
哈希表理论基础 哈希表:或者称为散列表,是根据关键码的值而直接进行访问的数据结构。 哈希法:用于快速判断一个元素是否出现在集合里 哈希函数是⼀种映射关系,根据关键词key,经过⼀定函数关系 f 得到元素的位置。 存…...
《科学》期刊发布新成果:量子计算迎来原子 - 光腔集成新时代
《Error-detected quantum operations with neutral atoms mediated by an optical cavity》 -《Science》 2025.3.21 摘要 光镊(optical tweezers)束缚的可编程原子阵列已成为量子信息处理(quantum information processing)和量…...
Spring Boot 与 TDengine 的深度集成实践(一)
引言 在当今数字化时代,数据处理与存储对于各类应用的重要性不言而喻。Spring Boot 作为一款流行的 Java 开发框架,以其快速开发、约定大于配置、内嵌容器等特性,大大提升了 Java 企业级应用的开发效率,降低了开发门槛࿰…...
SpringBoot + Netty + Vue + WebSocket实现在线聊天
最近想学学WebSocket做一个实时通讯的练手项目 主要用到的技术栈是WebSocket Netty Vue Pinia MySQL SpringBoot,实现一个持久化数据,单一群聊,支持多用户的聊天界面 下面是实现的过程 后端 SpringBoot启动的时候会占用一个端口ÿ…...
数据结构实验2.3:Josephus问题求解
文章目录 一,问题描述二,基本要求三,算法设计(1)存储结构设计(2)算法设计 四,示例代码五,运行效果 一,问题描述 在现实生活以及计算机科学的一些场景中&…...
Ruby语言的代码重构
Ruby语言的代码重构:探索清晰、可维护与高效的代码 引言 在软件开发的过程中,代码的质量直接影响到项目的可维护性、扩展性和整体性能。随着时间的推移,系统的需求变化,代码可能会变得混乱和难以理解,因此࿰…...
CAN/FD CAN总线配置 最新详解 包含理论+实战(附带源码)
看前须知:本篇文章不会说太多理论性的内容(重点在理论结合实践),顾及实操,应用,一切理论内容支撑都是为了后续实际操作进行铺垫,重点在于读者可以看完文章应用。(也为节约读者时间&a…...
杰文字悖论:效率提升的副作用
最近,Deepseek的火爆让我们开始反思一个有趣的现象:杰文斯悖论。这是1856年,经济学家杰文斯提出来的一个有趣的现象:当技术效率提高时,资源的使用量反而会增加,而不是减少。听起来可能有点不可思议。杰文斯…...
AcWing 6118. 蛋糕游戏
贪心 为了方便描述,下面将贝茜和埃尔茜分别称为a、b。 已知蛋糕的数量为偶数个,b每次只能吃左右边界上的蛋糕,a每次操作将两个蛋糕变成一个,发现都会使蛋糕的数量减一,且a先操作将蛋糕数量从偶数变成奇数,…...
【前端】【Nuxt3】Nuxt 3 开发中因生命周期理解不足导致的常见错误分类及其解决方案
以下是 Nuxt 3 开发中因生命周期理解不足导致的常见错误分类及其解决方案,以结构化形式呈现: 一、数据获取与异步处理 错误 1:错误使用客户端钩子获取数据 问题:在 onMounted 中获取数据,导致 SSR 失效。示例&#x…...
【kubernetes】BusyBox
目录 1. 说明2. 在 Kubernetes 中的角色2.1 轻量级调试工具2.2 临时容器2.3 网络测试2.4 文件系统检查 3. 为什么选择 BusyBox?4. 常见用法5. 注意事项 1. 说明 1.BusyBox 是一个轻量级、开源的 Linux 工具集,将多种常见的 Unix 工具(如 ls、…...
Leetcode——239. 滑动窗口最大值
题解一 思路 第一次做困难的题,确实把我既困住了又难住了,确实自己一点都想不出来。 这个思路,差不多就是,自己定义一个单调队列。 添加的时候,判断是否比队列最后的元素大,如果比它大,就把…...
kubernetes configMap 存储
1.模型 首先会在每一个节点上安装一个叫 agent 端 agent 端要做的作用就是监听当前的目标配置中心的配置选项是否发送更新动作 如果有的话 我的agent 端的话要从远程的配置中心 去下载最新的配置文件 替换我当前的 再去触发nginx实现重载 当然对于后期的运维工程师 如果想去发…...
架构思维:查询分离 - 表数据量大查询缓慢的优化方案
文章目录 Pre引言案例何谓查询分离?何种场景下使用查询分离?查询分离实现思路1. 如何触发查询分离?方式一: 修改业务代码:在写入常规数据后,同步建立查询数据。方式二:修改业务代码:…...
A2DP(Advanced Audio Distribution Profile)是蓝牙协议栈中用于音频传输的一个标准化协议
A2DP(Advanced Audio Distribution Profile)是蓝牙协议栈中用于音频传输的一个标准化协议,主要用于高质量音频流的无线传输。以下是A2DP协议的详细信息: 定义 A2DP协议允许音源设备(Source,简称SRC&#…...
Redisson使用详解
一、Redisson 核心特性与适用场景 Redisson 是基于 Redis 的 Java 客户端,提供分布式对象、锁、集合和服务,简化分布式系统开发。 典型应用场景: 分布式锁:防止重复扣款、超卖控制(如秒杀库存)。数据共享…...
GraalVM 24 正式发布阿里巴巴贡献重要特性 —— 支持 Java Agent 插桩
作者:林子熠、饶子昊 2025 年 3 月 18 日 Oracle 双箭齐发,正式发布了 JDK 24 和 GraalVM 24,带来了众多新特性。 JDK 24 在性能和安全性方面均有改进(特性列表链接见下),其中较大的一处改动是在 JDK 中…...
游戏编程模式学习(编程质量提升之路)
文章目录 前言一、命令模式(Command Pattern)1.命令模式练习场景I.需求场景 2.解耦命令与执行者3.使用命令对玩家角色和AI的操作进行统一抽象4. 命令模式的撤销实现 二、享元模式1.应用场景2.目的3.实现方式 三、原型模式1.运用场景2.实现方式 四、状态模…...
计算机视觉五大技术——深度学习在图像处理中的应用
深度学习是利用“多层神经网络”实现人工智能的一种方式 计算机视觉:“对图像中的客观对象构建明确而有意义的描述”,识别图片中的含义进行处理 1.图像分类——“图里有狗” 判断整张图片属于哪个类别,判断图片是“猫”还是“狗” 思路&a…...
Mixed Content: The page at https://xxx was loaded over HTTPS
一、核心原因分析 Mixed Content 警告是由于 HTTPS 页面中引用了 HTTP 协议的资源(如脚本、图片、iframe 等),导致浏览器因安全策略阻止加载这些非加密内容。HTTP 资源可能被中间人攻击篡改,破坏 HTTPS 页面的整体安全性。 二、推荐解决方案 1. 强制资源升级为 HTTPS •…...
transforms-pytorch4
数据通常不会直接是机器学习算法可以使用的“最终格式”。我们使用转换(transforms)来对数据进行处理,使其适合训练。 所有的 TorchVision 数据集都提供了两个参数:transform 用于修改特征,target_transform 用于修改…...
Springboot----@Role注解的作用
Role(BeanDefinition.ROLE_INFRASTRUCTURE) 是 Spring 框架中的一个注解,用于显式标记 Bean 的角色,表明该 Bean 是 Spring 容器内部的基础设施组件(如后置处理器、工具类等),而非用户直接使用的业务 Bean。其核心作用…...
SpringBoot项目报错: 缺少 Validation
目录 为什么需要Validation?如何使用Validation? 缺少validation?这不过是代码的一个小小问题,就像被风带走的一片叶子,轻轻一吹就能解决啦! 在你的项目中,如果你发现自己需要进行数据验证&…...
MySQL vs MSSQL 对比
在企业数据库管理系统中,MySQL 和 Microsoft SQL Server(MSSQL)是最受欢迎的两大选择。MySQL 是一款开源的关系型数据库管理系统(RDBMS),由 MySQL AB 开发,现归属于 Oracle 公司。而 MSSQL 是微…...
预测分析(四):面向预测分析的神经网络简介
文章目录 面向预测分析的神经网络简介神经网络模型1. 基本概念2. 前馈神经网络3. 常见激活函数4. 循环神经网络(RNN)5. 卷积神经网络(CNN) MPL结构工作原理激活函数训练方法 基于神经网络的回归——以钻石为例构建预测钻石价格的M…...
实战交易策略 篇十四:江南神鹰捕捉热点和熊市生存交易策略
文章目录 系列文章捕捉热点是股市最大的掘金术市场温度不低于50是热点产生的必要条件题材的大小和新颖程度决定热点的持续时间和涨幅炒作热点的3个阶段捕捉热点的方法与步骤操作实战案例熊市生存术“熊市最好的做法是离开股市”的说法是一句空话熊市盈利模式:不轻言底部,超跌…...
去中心化衍生品(以Synthetix为例)
去中心化衍生品(以Synthetix为例) 核心概念 合成资产(Synths): 定义:链上追踪现实资产价值的代币化合约(如sXAU追踪黄金,iBTC反向追踪比特币)。 类型: 正…...
JavaScript重难点突破:事件循环
想了解事件循环,首先要了解js中线程的概念。 宿主环境 在浏览器环境中,js实际上包含了三个部分ECMAScript、DOM(文档对象模型)、BOM(浏览器对象模型),我们最熟悉的js代码指的是ECMAScript这一…...
Python每日一题(15)
Python每日一题2025.4.4 一、题目题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 二、分析三、源代码四、deepseek 一、题目 题目描述 您需要写一种数据结构,来维护一些数(都是绝对值 1 0 9 10^9 109 以内的数)的集合,…...
#SVA语法滴水穿石# (003)关于 sequence 和 property 的区别和联系
在 SystemVerilog Assertions (SVA) 中,sequence 和 property 是两个核心概念,它们既有区别又紧密相关。对于初学者,可能不需要过多理解;但是要想写出复杂精美的断言,深刻理解两者十分重要。今天,我们汇总和学习一下该知识点。 1. 区别 特性sequenceproperty定义描述一系…...
有人DTU使用MQTT协议控制Modbus协议的下位机-含数据库
本文为备忘录,不做太多解释。 DTU型号:G780 服务器:win2018 一。DTU设置 正确设置波特率,进入配置状态,获取当前参数,修改参数,设置并保存所有参数。 1.通道1设置 2.Modbus轮询设置 二&am…...
Smart Link 技术全面解析
1.1 网络冗余技术的演进与需求 1.2 Smart Link 的核心价值与本文目标 第一章 Smart Link 技术概述 2.1 Smart Link 的应用场景与背景 2.2 Smart Link 的基本概念与组网角色 2.3 Smart Link 与传统技术的对比 第二章 Smart Link 工作原理 3.1 Smart Link 组的构成与运行机…...
【学Rust写CAD】30 Alpha256结构体补充方法(alpha256.rs)
源码 impl Alpha256 {#[inline]pub fn alpha_mul(&self, x: u32) -> u32 {let mask 0xFF00FF;let src_rb ((x & mask) * self.0) >> 8;let src_ag ((x >> 8) & mask) * self.0;(src_rb & mask) | (src_ag & !mask)} }代码分析 功能 输…...
提升 Web 性能:使用响应式图片优化体验
在现代 Web 开发中,图片通常占据页面加载的大部分带宽,如何高效管理图片资源直接影响用户体验和性能得分。Google 的 Lighthouse 工具在性能审计中特别强调“使用响应式图片”(Uses Responsive Images),旨在确保图片在…...
基于K8s的演示用单机ML服务部署
这是仅用一台机器(比如一台MacBook)模拟在k8s上部署一个机器学习服务的演示用实例。 项目地址:https://github.com/HarmoniaLeo/Local-K8s-ML-Demo 该实例分为以下几个部分: 使用KerasTensorflow搭建并训练神经网络,…...
强化中小学人工智能教育:塑造未来社会的科技基石
在数字化浪潮席卷全球的今天,人工智能(AI)已成为推动社会进步与经济发展的核心力量。面对这一不可逆转的趋势,如何培养具备AI素养与创新能力的下一代,成为各国教育改革的重中之重。辽宁省教育厅近日发布的《关于加强中小学人工智能教育的实施方案》,无疑为我国中小学人工…...
音视频基础(视频的主要概念)
文章目录 **1. 视频码率(Bitrate)****概念****分类****码率对比** **2. 视频帧率(Frame Rate, FPS)****概念****常见帧率****帧率 vs. 观感** **3. 视频分辨率(Resolution)****概念****常见分辨率****分辨率…...
JWT与Session的实战选择-杂谈(1)
JWT与Session的实战选择:从原理到踩坑心得 作为在金融科技领域经历过多次认证方案迭代的开发者,我想分享一些实战经验。这两种方案适用场景各异,选型需慎重考量。 一、本质差异:状态管理方式 Session机制:服务端维护…...
SQL Server安装后 Reporting Services 配置失败
问题现象: 完成 SQL Server 2022 安装后,尝试配置 Reporting Services (SSRS) 时失败,错误提示 “报表服务器数据库配置无效” 或 “无法启动 Reporting Services 服务”(错误代码 0x80070005)。 快速诊断 检查服务状态…...
操作系统面经(一)
部分参考来自小林coding 线程、进程、协程 进程是操作系统分配资源(内存、文件等)的基本单位,每个进程独立运行,互相隔离,稳定性高但开销大;线程是CPU调度的基本单位,属于同一进程的多个线程共…...
Qt 中 findChild和findChildren绑定自定义控件
在 Qt 中,findChild 和 findChildren 是两个非常实用的方法,用于在对象树中查找特定类型的子对象。这两个方法是 QObject 类的成员函数,因此所有继承自 QObject 的类都可以使用它们。当您需要查找并绑定自定义控件时,可以按照以下…...
对模板方法模式的理解
对模板方法模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1087)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用模板方法模式1、代码2、问题 三、采用模板方法模式1、代码 四、总结 一、场景 1、题目【来源】 …...
SpringMVC+Spring+MyBatis知识点
目录 一、相关概念 1.关系 2.网页 3.架构 4.URL 5.http 6.https 7.服务器 8.Tomcat 9.Servelet 10.Javaweb作用域对象 11.JSP 二、相关操作 1.RequestDispatcher 2.sendRedirect 3.cookie 4.Session 5.Filter过滤器 6.Listener监听器 7.MVC模型 8.JDBC连接…...
程序化广告行业(58/89):系统架构与广告反作弊深度剖析
程序化广告行业(58/89):系统架构与广告反作弊深度剖析 大家好!在程序化广告这个充满挑战与机遇的领域,不断学习和探索是保持竞争力的关键。今天,我希望和大家一起学习进步,深入了解程序化广告行…...
一周学会Pandas2 Python数据处理与分析-NumPy简介
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩…...
第二十七章:Python-Aquarel库与多种主题库结合实现Matplotlib美化
资源绑定附上完整资料供读者参考学习! 一、库介绍与安装 1.1 Aquarel库 Aquarel是一个轻量级的Python库,用于简化Matplotlib的样式配置,使数据可视化更加美观和高效。 1.2 Catppuccin库 Catppuccin是一个社区驱动的粉彩主题库࿰…...
leetcode155.最小栈
思路源自 【力扣hot100】【LeetCode 155】最小栈 为了让检索时间达到o(1),采用空间换时间,维护两个栈,第一个栈实现正常的push、pop、top,另一个栈的栈顶每次都只放以一个栈中最小的元素 class MinStack …...
Mysql 中的 MyISAM 引擎
🧱 什么是 MyISAM? MyISAM 是 MySQL 早期的默认存储引擎,特点是结构简单、读取速度快,但不支持事务和行级锁。 它适合那些 读多写少、对事务安全要求不高 的场景,比如旧版博客系统、数据仓库等。 📦 MyISA…...
操作系统、虚拟化技术与云原生及云原生AI简述
目录 操作系统基础 操作系统定义 操作系统的组成 操作系统的分类 Linux操作系统特性 虚拟化技术 概述 CPU虚拟化 内存虚拟化 I/O虚拟化 虚拟化技术 虚拟化平台管理工具 容器 容器与云原生:详细介绍 容器的特点 什么是云原生? 云原生的特点 容器与云原生的…...
Java EE期末总结(第二章)
目录 一、JSP页面里的page指令 二、JSP脚本元素 1、全局声明<%!……%> 2、表达式<%……%> 3、脚本程序段<%……%> 三、文件包含指令include 四、引入标签库指令taglib 五、JSP动作标签 1、包含文件动作标签 2、请求转发动作标签 3、JavaBean动作标签 …...