散列表/哈希表 字符串的哈希

使用哈希映射优化字符串操作的方法及示例代码 哈希映射是一种数据结构,它可以将键值对存储在一个数组中,并通过哈希函数将键映射到数组的特定位置,从而实现快速的查找和插入操作。哈希映射是一种数据结构,它可以将键值对存储在一个数组中,并通过哈希函数将键映射到数组的特定位置,从而实现快速的查找和插入操作。下面我们将介绍如何使用哈希映射来优化字符串操作,并提供相应的示例代码。通过使用哈希映射,我们可以快速而简洁地实现字符串中字符计数的操作。通过使用哈希映射,我们可以快速而简洁地实现字符串中字符计数的操作。通过使用哈希映射,我们可以方便地实现字符串的替换操作。 阅读详情

 

散列表/哈希表

这个是一个对数组的操作方式 和离散化相似 或者可以称离散化为特殊的哈希表,主要的目的就是通过对数据的一定操作使得原本散列的数据排列在一个具有特殊规律的表上 从而方便查找 减少时间复杂度

哈希表的实现方式主要有两种我们通过一个简单例题来讲解

模拟散列表(传送门)

维护一个集合,支持如下几种操作:

  1. I x,插入一个数 xx;
  2. Q x,询问数 xx 是否在集合中出现过;

现在要进行 NN 次操作,对于每个询问操作输出对应的结果。

输入格式

第一行包含整数 NN,表示操作数量。

接下来 NN 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。

输出格式

对于每个询问指令 Q x,输出一个询问结果,如果 xx 在集合中出现过,则输出 Yes,否则输出 No。

每个结果占一行。

数据范围

1≤N≤1051≤N≤105
−109≤x≤109−109≤x≤109

输入样例:

5
I 1
I 2
I 3
Q 2
Q 5

输出样例:

Yes
No

题目来源:acwing算法入门课

1.拉链法

拉链法顾名思义肯定要用到链的 想法是这样的 我们一般将输入的数字取模一个数 得到一个 K 然后将这个数放在h[k]中 但是无法避免的就是出现重复 例如 25% m=3 13% m=3

这样子就出现重复了 没有办法 这种重复只能减小但是无法避免 所以 我们在每一个h[k]

下都拉一个链表 讲得到的数字不断插入h[k]下的链表就好了 查找的时候也是去查找所对应的链表即可(ps;m的取值一般为一个质数而且离2的倍数越远越好 一般是数据接收范围的最大的质数 如0<N<1e5那么就是取大于1e5的第一个质数)

code:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,P=100003;
int h[N],e[N],ne[N],idex,n;
void add(int x){
	int k=(x%P+P)%P;
	e[idex]=k;
	ne[idex]=h[k];
	h[k]=idex++;
}//模拟链表
bool check(int x){
	int k=(x%P+P)%P;
	for(int i=h[k];i!=-1;i=ne[i])if(e[i]==x)return 1;
	return 0;
}//查询操作
int main(){
	memset(h,-1,sizeof(h));
	char order[2];
	int x;
	scanf("%d",&n);
	while(n--){
		scanf("%s%d",order,&x);
		if(*order=='I')add(x);
		else {
			if(check(x))printf("Yes\n");
			else printf("No\n");
		}
	}
}

2.开辟寻址法(蹲坑法)

思路就是先和上面一样的方法求出 K如果h[k]已经存在数字了 那么我们就向下寻找直到寻找到一个为空的地方插入进去即可 如果找到最后一个数字也没有位置那么让k=0在去寻找

(一定能找到一个位置的) 查找的方法相似 求出k从h[k]开始找 如果不是就不断++直到找到或者找到一个空的位置为止开辟寻址法一般要开两倍or三倍的空间 也就是大于2*N的第一个质数 

ps:k与拉链法意义相同

#include<bits/stdc++.h>
using namespace std;
const int N=200003;
int h[N],n,null=0x3f3f3f3f;
int find(int x){
	int k=(x%N+N)%N;
	while(h[k]!=null&&h[k]!=x){
		k++;
		if(k==N)k=0;//如果在k后面没找到就去前面找
	}
	return k;
}//寻找是否存在x不存在返回离x最近的空位 
int main(){
	memset(h,0x3f,sizeof(h));
	int x;
	char order;
	cin>>n;
	while(n--){
		cin>>order>>x;
		int k=find(x);
		if(order=='I')h[k]=x;
		else{
			if(h[k]==x)cout<<"Yes"<<endl;
			else cout<<"No"<<endl;
		}
	}
}

字符串哈希

非常强大的算法 我们把字符串的每一个字符映射到一个数字然后从左到右看为一个类似带权数字的样子 如abab  a*p^3+b*p^2+a*p+b这种形式 一般我们将p取为131 or 13331而这样算出的数据会非常大 为了防止溢出我们再将其%2^64 很巧的是unsigned long long 就是2^64超出之后会自动取模 因此我们不需要再有取模操作 这样一个字符串就被完美的变成了一段数子 如果我们想要l~r之间的字符映射的数字只需要 用h[r]-h[l]*p[r-l+1] (其中p[n]为p的n次方)

Ps:我们默认不会有重复

例题(可传送)

给定一个长度为 nn 的字符串,再给定 mm 个询问,每个询问包含四个整数 l1,r1,l2,r2l1,r1,l2,r2,请你判断 [l1,r1][l1,r1] 和 [l2,r2][l2,r2] 这两个区间所包含的字符串子串是否完全相同。

字符串中只包含大小写英文字母和数字。

输入格式

第一行包含整数 nn 和 mm,表示字符串长度和询问次数。

第二行包含一个长度为 nn 的字符串,字符串中只包含大小写英文字母和数字。

接下来 mm 行,每行包含四个整数 l1,r1,l2,r2l1,r1,l2,r2,表示一次询问所涉及的两个区间。

注意,字符串的位置从 11 开始编号。

输出格式

对于每个询问输出一个结果,如果两个字符串子串完全相同则输出 Yes,否则输出 No。

每个结果占一行。

数据范围

1≤n,m≤1051≤n,m≤105

输入样例:

8 3
aabbaabb
1 3 5 7
1 3 6 8
1 2 1 2

输出样例:

Yes
No
Yes

code:

#include<bits/stdc++.h>
using namespace std;
const int N=100010,P=131;
typedef unsigned long long ull;
ull p[N],h[N];
int n,m;
char str[N];
ull Get(int l,int r){
	return h[r]-h[l-1]*p[r-l+1];
}//计算子串的哈希值
int main(){
	cin>>n>>m;
	cin>>str+1;
	p[0]=1;
	for(int i=1;i<=n;i++){
		h[i]=h[i-1]*P+str[i];
		p[i]=p[i-1]*P;
	}//计算字符串的哈希值
	while(m--){
		int l1,l2,r1,r2;
		cin>>l1>>r1>>l2>>r2;
		if(Get(l1,r1)==Get(l2,r2))cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
}

 

 

数据分析(二):学生成绩预测分析报告 表1 特征变量描述变量描述school学生的学校sex学生的性别age学生的年龄address学生的家庭住址类型famsize家庭规模Pstatus父母同居状况Medu母亲的教育Fedu父亲的教育Mjob母亲的工作Fjob父亲的工作reason选择学校的理由guardian学生监护人traveltime从家到学校的时间studytime每周学习时间failures过去的类失败次数schoolsup额外的教育支持famsup家庭教育支持。 阅读详情

相关推荐

Xilinx PCIe IP核示例工程仿真流程与关键任务解析

本文详细解析了Xilinx PCIe IP核示例工程的仿真流程与关键任务。通过搭建仿真环境、解读初始化日志,并深入剖析TSK_TX_MEMORY_WRITE_32等核心任务的TLP报文生成与交互过程,帮助开发者掌握PCIe IP核的仿真调试方法,为实际硬件设计提供可靠的验证基础。

weixin_28314575的博客 507

【哈希表】(三) 实际应用 - 哈希映射

LeetCode - 探索卡片 - 哈希表 - 三 - 实际应用 - 哈希映射

闻韶 1287

【通俗易懂】Windows系统安装TensorRT

NVIDIA TensorRT是一个由NVIDIA公司开发的用于深度学习推理的高性能SDK。它专门设计用于在NVIDIA GPU上进行高效的神经网络推理,能够大幅度提升深度学习模型的推理速度和效率。TensorRT的主要特点包括:模型优化:TensorRT通过层融合、精度校准、动态形状等技术优化模型,减少推理时的计算量和内存占用。多精度推理:支持多种精度推理,包括FP32、FP16、INT8等,以平衡性能和精度。

王尼莫的博客 1587

哈希表与字符串

预备知识: 1、最简单的哈希-----字符哈希 #include&amp;amp;amp;lt;stdio.h&amp;amp;amp;gt; #include&amp;amp;amp;lt;string&amp;amp;amp;gt; #include&amp;amp;amp;lt;stdlib.h&amp;amp;amp;gt; using namespace std; int main(){ int char_map[128] =

forget_fish的博客 3005

FPGA SPI驱动ADC避坑指南:以ADC128S022为例,详解时序设计与代码调试

本文以ADC128S022为例,详细解析FPGA通过SPI驱动ADC的时序设计与代码调试中的常见问题。从时钟分频计算、SPI模式选择到状态机实现,提供避坑指南和实战技巧,帮助工程师解决数据采集系统中的时序匹配难题。特别针对FPGA与ADC通信中的微妙差异,给出精确的Verilog代码示例和ModelSim仿真验证方法。

weixin_42522374的博客 458

Hash——字符串Hash

Hash——字符串Hash

qq_42376883的博客 1978

卷王问卷考试系统——测试报告

本问卷考试系统是一款在线平台,支持用户发布和完成调查问卷,并进行考试管理,核心功能在于简化问卷创建发布、数据收集及考试组织流程。此次测试将围绕其关键模块展开,涵盖用户注册登录、项目列表、我的练习以及我的题库等核心部分。问卷考试系统(一)硬件环境普通办公电脑(CPU:Intel i5 、内存:16GB 、硬盘:512GB )(二)软件环境操作系统:Windows 11 ;浏览器:Chrome(版本 120+)、Firefox(版本 115+)、Edge(版本 120+)验证界面信息在完整性、一致性、准确性和用

m0_73433755的博客 554

哈希字符串映射

哈希字符串映射大数据下标

na208702973的博客 934

YOLOv11改进,YOLOv11添加ASFF检测头,并添加小目标检测层(四头检测),适合目标检测、分割等任务,全网首发

YOLOv11改进,YOLOv11添加ASFF检测头,并添加小目标检测层(四头检测),适合目标检测、分割等任务,全网首发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4735

【目标检测-YOLO】YOLOv5-v5.0-yolov5s网络架构详解(第一篇)

源码:GitHub - ultralytics/yolov5 at v5.0 由于YOLO v5 代码库在持续更新,如上图,有多个版本,每个版本的网络结构不尽相同。以下内容以 v5.0 为准,网络结构选用 yolov5s。 为了方便画图和理解网络结构,选用可视化工具:Netron 网页版进行可视化, 然后使用PPT作图。 在Releases · ultralytics/yolov5 · GitHub找到 v5.0中的Assets 中的yolov5s.pt并下载该权重。 下图为直接......

博观约取,厚积薄发 2万+

【数据结构笔记39】哈希表/散列表、(数据关键字/字符串关键字)散列构造函数

散列表,大名鼎鼎的哈希表。

记录学习痕迹的公众号:Piper蛋窝 1520

44、单级静态电流消耗最小化方法及功率优化比较器设计

本文探讨了单级静态电流消耗最小化方法及功率优化的多米诺逻辑比较器设计。通过分析类“AB”输入CMOS差分对电路,提出利用补偿电流源实现高低电流模式切换,提升运算放大器性能;结合VTCMOS与时钟门控技术,在90nm CMOS中设计低功耗比较器,并采用多米诺逻辑提高速度与能效。通过对比传统与改进型多米诺逻辑的静态功耗、动态功耗、延迟和PDP,验证了所提方案在高性能与低功耗方面的优势,适用于便携式设备等对能效要求严苛的应用场景。

pp12345的博客 121

与哈希表有关算法题

欢迎来到我的频道。

Fcy648的博客 326

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ext/hash_map:进一步提高字符串为键的哈希表的性能

http://hi.baidu.com/ah__fu/item/c8a1d4e17e79e5f52b09a458 当我们在ext/hash_map使用string或const char*为键的时候,通常需要使用一个HASH函数将字符串转换为一个32位的整型值,然后再与一个大质数取模,最终将节点分布到不同的桶里面去。      可是,当我们作为键的字符串很长时,每次进行插入、查找和删除操作的时候

LD的专栏 1543

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C/C++哈希表与字符串进阶面试题

本文总结了四道高频字符串算法题的解题方法: 字母异位词分组:使用哈希表以排序后的字符串为key进行分组,时间复杂度O(nklogk) 无重复字符的最长子串:滑动窗口+哈希表记录字符位置,时间复杂度O(n) 第一个只出现一次的字符:两次遍历+计数数组,时间复杂度O(n) 字符串转整数:逐步处理符号位和数字转换,注意溢出判断,时间复杂度O(n) 这些题目考察了哈希表、滑动窗口、数组计数等技巧,是面试中常见的字符串处理问题,需要特别注意边界条件和优化思路。

c23856的博客 99

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

散列表/字符串哈希

哈希表-模拟散列表。

dengxue110的博客 28

哈希表

哈希表又称散列表,一种以「key-value」形式存储数据的数据结构。所谓以「key-value」形式存储数据,是指任意的键值 key 都唯一对应到内存中的某个位置。只需要输入查找的键值,就可以快速地找到其对应的 value。可以把哈希表理解为一种高级的数组,这种数组的下标可以是很大的整数,浮点数,字符串甚至结构体。

禊月初三的博客 1005

【算法基础9】c/c++中如何构建哈希表?字符串哈希其实很简单

简要介绍构建哈希表的两种方法:拉链法、开放寻址法,以及字符串前缀和哈希的基本原理与操作。

qq_52622503的博客 1811

【leetcode/哈希表】字符串中第一个唯一字符(哈希表与遍历)

问题描述: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 案例: s = "leetcode" 返回 0. s = "loveleetcode", 返回 2. 注意事项:您可以假定该字符串只包含小写字母。 基本思路: 建立一个字符到该字符出现个数统计的映射, 然后找出第一个个数统计为1的元素。 有一点要尤为注意: 我们都知道哈...

qq_43338695的博客 281

LeetCode 187. Repeated DNA Sequences【哈希表/滑动窗口/字符串哈希/滚动哈希/位操作】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。 为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conqu.

memcpy0的博客 664

【哈希表/字符串-简单】LeetCode 205 同构字符串 Java

从左至右遍历两个字符串的字符,不断更新两张哈希表,如果出现冲突(即当前下标index对应的字符s[index]已经存在映射且不为t[index]或当前下标index对应的字符t[index]已经存在映射且不为s[index])时,说明两个字符串无法构成同构,返回false。需要判断s和t每个位置上的字符是否都一一对应,即s的任意一个字符被t中唯一的字符对应,同时t的任意一个字符被s中唯一的字符对应。这也被称为【双射】的关系。如果遍历结束没有出现冲突,则表明两个字符串是同构的。

guliguliguliguli的博客 275

哈希表以及哈希表的底层结构 --- 万字解说【c++11】

-(常用)取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B优点:简单、均匀缺点:需要事先知道关键字的分布情况使用场景:适合查找比较小且连续的情况。

m0_73969113的博客 949

Redis哈希表的实现要点

Redis哈希表的实现要点 哈希算法的选择 针对不同的key使用不同的hash算法,如对整型、字符串以及大小写敏感的字符串分别使用不同的hash算法; 整型的Hash算法使用的是Thomas Wang's 32 Bit / 64 Bit Mix Function ,这是一种基于位移运算的散列方法。基于移位的散列是使用Key值进行移位操作。通常是结合左移和右移。每个移位过程的结果进行累加,最后...

weixin_34234823的博客 181

【LeetCode】哈希表

今日联系:掌握哈希表的高频使用方法,理解hashmap的优势1.查找更快2.天然去重:哈希表key唯一3.统计:经常被用于统计记住hash表的优势以及一些语法:.containsKey记住核心思路语法知识:map.computeIfAbsent(key,k->new ArrayList<>());等价于:if (!核心:哈希表 + 找起点 + 递增计数语法基础,理解本题思路流程,做出了就很流畅了。

2501_92547326的博客 531

<C++> 哈希表的完善及unordered_封装

当然,这个函数对于 const 迭代器对象 没有影响,毕竟这玩意不能被修改。在迭代器类中提供一个十分巧妙的函数,它对于 普通迭代器对象 来说,当传入的是 普通迭代器时,相当于。为了满足 不同 的需求,需要对 哈希表 的模板进行调整,让其既能适应。的错误,但如果我们不借此根治问题,后续没有出现赋值语句时,一样会报错。迭代器 的问题,两者差别很大,编译器无法自行转换。,这是不行的,为了让其能成功访问,我们可以把。迭代器,但哈希表中的迭代器相关函数返回的是。,只能向前走,不能回头,因此我们的。

weixin_61522065的博客 480
上一篇: kmp形象理解
下一篇: 图论最短路(模板/模板题)
姐姐带你拿捏大厂算法
博客等级 码龄5年 17粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值