哈希表——C++
目录
一、首先使用拉链法:
二、开放寻址法
三、字符串哈希
1.具体如何使用进制的方式来存储字符前缀的可以看这个y总的这个图
2.接下来说一说算某个中间的区间的字符串哈希值
哈希表是一种数组之间互相映射的数据结构,比如举个简单的例子一个十个的数组要用一个五个的数组表示,我们可以使用取模的方法将十个数组中的数组映射到五个数字的小数组中。
核心思想是将数据项的键值(Key)通过哈希函数转换成数组的索引,从而直接访问数组中的位置来存储或查找数据项。
但是一个大的数组映射到小的数组中是很难避免映射冲突的问题的,为了解决这类问题,我们常用两个方法来解决;
- 拉链法
- 开放寻址法
一、首先使用拉链法:
拉链法顾名思义就是一个数组,每个数组上链接一个单链表,形状类似拉链,故拉链。
但是如何取模运算,是我们需要解决的问题。
听y总说寻找大于规定范围最小的质数是冲突最小(我不知道为撒,但是听说数学有证明)
#include<iostream>
#include<cstring>
using namespace std;int main()
{for(int i=1e5;;i++){bool flag=true;for(int j = 2 ; j * j <=i;j++){if(i % j == 0){flag=false;break;}}if(flag){cout<<i<<endl;break;}}return 0;
}
例题:https://www.acwing.com/activity/content/problem/content/890/
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+3;
int h[N],e[N],ne[N],idx;void insert(int x)
{int k=(x%N+N)%N; //保证k的值不为负数e[idx]=x;ne[idx]=h[k];h[k]=idx;idx++;
}bool find(int x)
{int k=(x%N+N)%N; //保证k的值不为负数for(int i=h[k];i!=-1;i=ne[i]){if(e[i]==x) return true;}return false;
}int main()
{int m;cin>>m;memset(h,-1,sizeof (h));while(m--){char op[2];int x;scanf("%s%d",op,&x);if(*op=='I'){insert(x);}else{if(find(x)) puts("Yes");elseputs("No");}}return 0;
}
二、开放寻址法
开放寻址法可以叫它为蹲坑法,通常N要是数据范围的两倍,然后找最小的大于数据范围的质数
然后在相应的地方进行插入数据。
#include<iostream>
#include<cstring>
using namespace std;const int N=200003,null=0x3f3f3f3f;
int h[N];int find(int x)
{int k=(x % N + N) % N;while(h[k]!=null && h[k]!=x){k++;//到头就从头再来if(k==N) k=0;}return k;//保证k要么是空位置的地址,要么是这个数已经被存放过了
}int main()
{int n;scanf("%d",&n);memset(h,0x3f,sizeof h);while(n--){char op[2];int x;scanf("%s%d",op,&x);if(*op == 'I'){h[find(x)] = x;}else{if(h[find(x)] == null) puts("No");else puts("Yes");}}return 0;
}
三、字符串哈希
一般常使用哈希来解决字符串的问题,常用的方法就是将一个字符串差分成字符前缀,然后存储每个字符前缀的哈希值,然后这个哈希值常使用一种进制的表示方式来确定,然后在进行取余。(要点:一般使用131进制,取余的除数是,而且使用unsigned long long 来存储也就可以通过溢出直接进行自动取余)。
1.具体如何使用进制的方式来存储字符前缀的可以看这个y总的这个图
需要注意的是这里的哈希值的处理方式我们需要认为是不存在冲突的,这一点和之前的数值哈希有所不同,而且还要注意的是在映射的时候是不可以映射成为0的。
举个例子解释一下
如何某个字符前缀会映射成为0,那比如说A是0,那AB也就是0了,这样是不符合要求的。
2.接下来说一说算某个中间的区间的字符串哈希值
如图所示,最重要的公式就是
举个例子方便理解
我们在预处理h[i] 数组的时候,是把左边看成高位,右边看成低位(这与我们的习惯是相同的)
下面给出例子,计算[4,5]之间"de" 的哈希值 高位 a b c d e 低位
a b c
这是数组的下标 1 2 3 L R
这里是P进制下位权 (p^4) p^3 p^2 p^1 1
我们在前缀和那节课已经学过了,怎么计算区间的部分和. h[R] - h[L - 1].
仔细一看,不对劲,位置对不上. 因此我们将字符串 "左移",为他们补上位权,这样子就能做到一一对应
高位 a b c d e 低位
a b c '\0' '\0'
这是数组的下标 1 2 3 L R
这里是P进制下位权 (p^4) p^3 p^2 p^1 1
为了方便理解,我用"\0"表示无意义字符. 这个时候就能计算了对吧?
那位移是多少呢?
就是 R - L + 1,在本例中, 5 - 3 + 1 = 2,左移两位. 补齐低位.
例题:https://www.acwing.com/activity/content/problem/content/891/
#include<iostream>
using namespace std;const int N=1e5+10,jinzhi=131;unsigned long long h[N],p[N];//h是存放每个字符子串的哈希值,p是存放字符串的权重的
char str[N];int get(int l,int r)
{return h[r]-h[l-1]*p[r-l+1];
}int main()
{int n,m;scanf("%d%d",&n,&m);scanf("%s",str+1);//初始化p[0]=1;for(int i=1;i<=n;i++){h[i]=h[i-1]*jinzhi+str[i];p[i]=p[i-1]*jinzhi;}while(m--){int l1,l2,r1,r2;scanf("%d%d%d%d",&l1,&r1,&l2,&r2);if(get(l1,r1)==get(l2,r2)){puts("Yes");}else puts("No");}return 0;
}
相关文章:
哈希表——C++
目录 一、首先使用拉链法: 二、开放寻址法 三、字符串哈希 1.具体如何使用进制的方式来存储字符前缀的可以看这个y总的这个图 2.接下来说一说算某个中间的区间的字符串哈希值 哈希表是一种数组之间互相映射的数据结构,比如举个简单的例子一个十个的数…...

LabVIEW叶片厚度远程监控
LabVIEW叶片厚度远程监控 随着网络技术的高速发展,远程监控广泛应用在各个领域。本文介绍了一种基于LabVIEW的植物叶片厚度远程监控系统,旨在实现对植物生长状况的精准监测和分析。 该系统利用LabVIEW软件开发工具,通过TCP网络协议实现数据…...

el-table动态合并
废话就不多说了,直接上代码!!! 合并行 // 方法一 <template><div class"container"><el-table :data"dataSource" :border"true":header-cell-style"{ font-weight: normal,…...

【DevOps】产品需求文档(PRD)与常见原型软件
文章目录 1、PRD介绍1.1、概述1.2、前提条件1.3、主要目的1.4、关键内容1.5、表述方式1.6、需求评审人员1.7、一般内容结构 2、需求流程3、常见原型软件3.1、Word3.2、Axure3.2.1、详细介绍3.2.2、应用分类3.2.3、优缺点 3.3、摹客RP3.4、蓝湖3.5、GUI Design Studio 1、PRD介绍…...
【QT+QGIS跨平台编译】之十八:【Expat+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
文章目录 一、Expat介绍二、文件下载三、文件分析四、pro文件五、编译实践一、Expat介绍 Expat库最初由James Clark创建,已经成为许多编程语言中常用的XML解析工具。它以其简单、快速和可靠的特点而受到广泛的认可和使用。 Expat库的优点包括: 快速:Expat的解析速度非常快…...
20240203
1.项目经理正在为新项目制订进度计划,项目的成功取决于使用需要政府颁发特殊环境许可证的设备,在网络图的设计过程中,项目经理应该做什么以确保正确的活动排序? A.使用滚动式规划考虑项目不确定性 B.分析外部依赖关系,…...

【Spark实践6】特征转换FeatureTransformers实践Scala版--补充算子
本节介绍了用于处理特征的算法,大致可以分为以下几组: 提取(Extraction):从“原始”数据中提取特征。转换(Transformation):缩放、转换或修改特征。选择(Selection&…...

【知识点】设计模式
创建型 单例模式 Singleton:确保一个类只有一个实例,并提供该实例的全局访问点 使用一个私有构造方法、一个私有静态变量以及一个公有静态方法来实现。私有构造方法确保了不能通过构造方法来创建对象实例,只能通过公有静态方法返回唯一的私…...

WPS WORD 宏导出高亮文本
WPS手机版可以直接导出高亮文本,但只能导出手机编辑的部分,如果同时在电脑上编辑过,电脑上高亮的无法导出,因为作者不一样。 但WPS电脑版没有这个功能,只能通过宏编程实现。 这里利用了审阅模式,在文字高亮…...

python 基础知识点(蓝桥杯python科目个人复习计划32)
今日复习内容:基础算法中的位运算 1.简介 位运算就是对二进制进行操作的运算方式,分为与运算,或运算,异或运算,取反,左移和右移。 (1)与运算 xyx&y000010100111 (2)或运算 …...

(算法二)滑动窗口
滑动窗口:既一块区域进行滑动,且不回退 往往解决的是一段连续空间中满足条件的最长或者最短子数组(串) 是由暴力解法(优化)——>不回退的滑动窗口解法 长度最小的子数组 无重复字符的最长子数组 此类题…...
【Go语言成长之路】Hello Go
文章目录 Hello Go一、建立工程目录二、开启代码追踪三、编写代码四、测试代码 Hello Go 一、建立工程目录 pzspzs-ubuntu22:~$ mkdir go_study/hello -p pzspzs-ubuntu22:~$ cd go_study/hello 在hello目录下,我们会编写属于自己的第一个Go demo例子࿰…...

大数据应用开发3-Scala笔记1
一、编程框架 Scala语言是在JVM上运行的,兼容Java语法 区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义。 类名 - 对于所有的类名的第一个字母要大写。 如果需要使用几个单词来构成一个类的名称,每个…...

android 网络拦截器统一处理请求参数和返回值加解密实现
前言 项目中遇到参数加密和返回结果加密的业务 这里写一下实现 一来加深记忆 二来为以后参考铺垫 需求 项目在开发中涉及到 登陆 发验证码 认证 等前期准备接口 这些接口需要单独处理 比如不加密 或者有其他的业务需求 剩下的是登陆成功以后的业务需求接口 针对入参和返回值…...

Jmeter直连mysql数据库教程
mysql数据库能够通过Navicat等远程连接工具连接 下载驱动并加入jmeter 1.mysql驱动下载地址:MySQL :: Download MySQL Connector/J (Archived Versions) 找到对应的驱动下载:如下图: 把驱动jar包加入jmeter 配置jmeter连接mysql数据库…...

2024美赛数学建模B题思路分析 - 搜索潜水器
1 赛题 问题B:搜索潜水器 总部位于希腊的小型海上巡航潜艇(MCMS)公司,制造能够将人类运送到海洋最深处的潜水器。潜水器被移动到该位置,并不受主船的束缚。MCMS现在希望用他们的潜水器带游客在爱奥尼亚海底探险&…...
Tomcat在Java web的应用
Tomcat在Java web的应用 本来这篇博客顺应之前的内容,应该是需要写Tomcat的简介、基本使用、配置和部署项目、Web的项目结构、创建MavenWeb、idea本地集成以及Tomcat的Maven插件的笔记内容,但是总觉得没必要,因为这些内容网上肯定很多了&…...

Python爬虫某云免费音乐——多线程批量下载
重点一:每首音乐的下载地址 重点二:如何判断是免费音乐 重点三:如何用线程下载并保存 重点四:如何规避运行错误导致子线程死掉 重点五:如何管理子线程合理运行 需要全部代码的私信或者VX:Kmwcx1109 运行效果&…...

Python实现TCP和UDP通信
目录 一:TCP 二:UDP 一:TCP 在Python中实现TCP通信可以通过使用内置的socket模块来完成。以下是一个简单的示例,展示了如何使用Python的socket模块创建一个TCP客户端和服务器。 TCP服务器 import socket def start_server(): s…...

用HTML5 + JavaScript实现下雪效果
用HTML5 JavaScript实现下雪效果 下面是用HTML5 JavaScript实现下雪效果示例,展示了如何使用 HTML5 的 <canvas> 元素以及 JavaScript 来创建下雪效果。效果如下: 源码如下: <!DOCTYPE html> <html lang"en">…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...