Peter算法小课堂—哈希与哈希表

news2024/11/27 13:43:08

额……字符串我们是第一次学,给大家铺一些基础的不能再基础的基础,

字符串比较大小

字符串大小的比较,不是以字符串的长度直接决定,而是从最左边第一个字符开始比较,大者为大,小者为小,若相等,则继续按字符串顺序比较后面的字符(比的是ASCII码)

字符串输入

cin

接受一个字符串,遇“空格”、“TAB”、“回车”都结束

cin.getline()

在一(二)维字符数组中,参数一即为字符数组名,参数二为元素个数。

cin.get()

cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格。

getline()

接受一个字符串可以接受空格,遇换行结束。包含在string头文件中

getchar()

接受一个字符。包含头文件string

gets()

用法与cin.getline()一样只不过gets不带第三个参数。

OK!开始正题,来一道题吧。说一下,字符串三大杀器:Hash,KMP,AC自动机

数字串匹配1

这一题比较简单,但是……也有坑哦

错误代码:

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
ull p[18]={1,1e1,1e2,1e3,1e4,1e5,
		   1e6,1e7,1e8,1e9,1e10,
		   1e11,1e12,1e13,1e14,1e15,1e16,1e17};
ull n,m,X,Y,cnt=0;
int main(){
	cin>>n>>X>>m>>Y;
	for(ull i=n-m;i>=0;i--)
		cnt+=(X/p[i]%p[m]==Y);
	cout<<cnt<<endl;
	return 0;
}

关键:一定要正着循环,因为ull为无符号整数,永远没有负数,i永远>=0。

正确代码:

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
ull p[18]={1,1e1,1e2,1e3,1e4,1e5,
		   1e6,1e7,1e8,1e9,1e10,
		   1e11,1e12,1e13,1e14,1e15,1e16,1e17};
ull n,m,X,Y,cnt=0;
int main(){
	cin>>n>>X>>m>>Y;
	for(ull i=0;i<=n-m;i--)
		cnt+=(X/p[i]%p[m]==Y);
	cout<<cnt<<endl;
	return 0;
}

那么为什么这样一定对呢?

请看下图👇

这样懂了吧,这是暴力算法,来看下一题

数字串匹配2

取子串这下子usigned long long已经不够了,可能要……long long long long long long long long!我们每次都要取一个字串,那么现在的问题就是:如何取子串且复杂度低低低低低。

给一幅图,立马懂,不懂我倒立洗头

h表示取出来的字串。上图是如何平移窗口,数学知识:位置原理。懂了吗?比较简单。

Hash

那么,哈希的目的是什么:将一个字符串变成一个整数。如果哈希值相等,那么两个字符串就相等。那为什么我们要选一个质数呢?因为防止哈希碰撞。什么是哈希碰撞呢?因为有可能有两个不同的字符串,他们的哈希值相同,我们要避免它。讲了半天,代码呢?

#include <bits/stdc++.h>
#define BASE 131
using namespace std;
typedef unsigned long long ull;
int main(){
	string s;
	cin>>s;
	for(ull i=0;i<s.size();i++)
		hash=hash*BASE+s[i];
	cout<<hash<<endl;
	return 0;
}

这就是传说中的“哈希值”!!!提醒一下大家:大家光看这些内容可能很枯燥,建议加上《信息学奥赛一本通—提高篇》食用更佳。

平移窗口

cin>>n>>X>>m>>Y;
ull p[M]={1};
for(ull i=1;i<=m;i++) p[i]=p[i-1]*BASE;
ull hx=0,hy=0;
for(ull i=0;i<m;i++)
	hx=hx*BASE+X[i],hy=hy*BASE+Y[i];
ull cnt=(hx==hy);
for(ull i=m;i<n;i++){
	hx=(hx-X[i-m]*p[m-1])*BASE;
	cnt+=(hx==hy);
}
cout<<cnt<<endl;

前缀哈希

主要是前缀和

ull p[M]={1},n,m,hx[N];
cin>>n>>X>>m>>Y;
for(ull i=1;i<=m;i++) p[i]=p[i-1]*BASE;
ull hY=0;
for(ull i=0;i<m;i++)
	hY=hY*BASE+Y[i];
hX[0]=0;
for(ull i=0;i<m;i++)
	hX=hX[i-1]*BASE+X[i];
ull cnt=0;
for(ull i=0;i<=n-m;i++){
	ull hash=hX[i+m]-hX[i]*p[m];
	cnt+=(hash==hy);
}
cout<<cnt<<endl;

拓展:哈希冲突

哈希冲突指有两个不同的字符串,它们的hash指相等。下面的数学讨论请大家选择阅读。

计算哈希冲突的概率

问题可以抽象成这样:给K个随机值,非负而且小于N,他们中至少有个相等的概率是多少?

我们考虑它的反面问题:不相同的概率。对于一个值域为N的Hash值,假设你已经挑选出一个值。之后,剩下N-1个值是不同于第一个值的,因此,对于第二次随机生成不同第一个数的概率为\frac{N-1}{N}

同理,不相等的概率就是。好的是,这个值约等于,好奇的话可以用泰勒公式试一下。那么,原来的问题的概率就是。当然,我们可以把表达式简化一下。

表达式简化

这是一个极限的算式,这个式子当X很小时,误差越小,大家自己推导着试试。那么简化表达式就变成这样,我们就把哈希冲突的概率计算出来了,大家学废了吗?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解 Redis 实现数据去重

✨✨ 欢迎大家来到喔的嘛呀的博客✨✨ &#x1f388;&#x1f388;希望这篇博客对大家能有帮助&#x1f388;&#x1f388; 目录 言 一. Redis去重原理 1. Redis Set 数据结构 2. 基于 Set 实现数据去重 3. 代码示例 4. 总结 …

SG5032EEN晶体振荡器SPXO

5G将使通信流量呈指数级增长&#xff0c;5G通信网络需要高速和宽带&#xff0c;同时将噪声水平保持在最低水平&#xff0c;这可以通过通信设备的高频低抖动参考时钟来实现&#xff0c;使用上述晶体振荡器SPXO&#xff0c;客户可以输入一个具有极低相位抖动和功率的高频参考时钟…

进程间通信——管道

文章目录 进程间通信的介绍进程间通信的目的进程间通信的本质 匿名管道创建管道匿名管道的特征 命名管道小结 进程间通信的介绍 进程间通信简称IPC&#xff08;Interprocess communication&#xff09;&#xff0c;进程间通信就是在不同进程之间传播或交换信息。 进程间通信的…

算法刷题:和为s的两个数

和为s的两个数 .题目链接题目详情算法原理我的答案 . 题目链接 和为s的两个数 题目详情 算法原理 这里我们是利用单调性来使用双指针的对撞指针来解决问题 因为数组给的是有序递增的,因此我们设置两个指针left和right来解决问题,当nums[left]与nums[right]相加会有三种情况:…

apple iCloud photo close

关闭掉就不当心图片上传到服务器&#xff08;暗地里有没有执行上传就不知道了&#xff09;&#xff0c;然后接电脑存放还要从服务器上下载很麻烦&#xff0c;但是你要确保自己手机内存卡足够多 关闭iCloud会提示&#xff0c;从服务器下载图片

混合键合(Hybrid Bonding)工艺解读

随着半导体技术的持续演进&#xff0c;传统的二维芯片缩放规则受到物理极限的挑战&#xff0c;尤其是摩尔定律在微小化方面的推进速度放缓。为了继续保持计算性能和存储密度的增长趋势&#xff0c;业界开始转向三维集成电路设计与封装技术的研发。混合键合技术就是在这样的背景…

算法学习——LeetCode力扣贪心篇4

算法学习——LeetCode力扣贪心篇4 763. 划分字母区间 763. 划分字母区间 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xf…

第13集《佛说四十二章经》

和尚尼慈悲&#xff01;诸位法师、诸位居士&#xff0c;阿弥陀佛&#xff01; 请大家打开讲义第十八面&#xff0c;第三十六章、辗转获胜。 佛陀在《法华经》上&#xff0c;对我们的三界果报&#xff0c;清楚的开示说&#xff1a;三界无安&#xff0c;犹如火宅&#xff0c;众…

地理信息数据要素价值

文章目录 前言一、地理信息数据成为生产要素的重要内涵二、推动地理信息数据要素价值实现的重点及方式(一)公共地理信息数据(二)企业地理信息数据前言 面对数字经济发展新形势新需求,我们将统筹发展与安全,推动数据资源向数据资产转变,发挥时空数据作为新型生产要素价值…

Windows 系统盘(C盘)爆红如何清理、如何增加C盘空间

1、简介 Windows系统中&#xff0c;系统和保留占用太多的空间&#xff0c;一旦系统盘分配空间较少&#xff0c;使用一段时间后&#xff0c;备份文件、临时文件、系统更新记录等都会在占用系统盘较大空间&#xff0c;导致系统盘空间不够使用&#xff0c;会造成应用运行卡顿。如何…

uniapp 开发一个密码管理app

密码管理app 介绍 最近发现自己的账号密码真的是太多了&#xff0c;各种网站&#xff0c;系统&#xff0c;公司内网的&#xff0c;很多站点在登陆的时候都要重新设置密码或者通过短信或者邮箱重新设置密码&#xff0c;真的很麻烦 所以准备开发一个app用来记录这些站好和密码…

每日一题——LeetCode1436.旅行终点站

方法一 个人方法 两次遍历set 终点站不通往其他任何城市&#xff0c;那么终点站只会出现在[cityA,cityB]的第二位&#xff0c;利用set第一次遍历保存所有站点&#xff0c;第二次遍历去除所有在第一位出现的站点&#xff0c;剩下的站点就是不通往任何站点的终点站&#xff1a; …

Java中的String类的常用方法(对于字符串的常用操作)

目录 一、获取指定索引的字符 二、 获取指定字符或者字符串的索引位置 三、判断字符串是否以指定内容开头或结尾 四、替换指定的字符或者是字符串 五、获取字符串的子串 六、将字符串转换为字符数组 七、比较字符串的内容是否相等 八、连接字符串 九、比较两个字符串的大…

[CTF]-PWN:C++文件更换libc方法(WSL)

C文件与C文件更换libc有很多不一样的地方&#xff0c;我是在写buu的ciscn_2019_final_3才意识到这个问题&#xff0c;C文件只需要更换libc和ld就可以了&#xff0c;但是C文件不同&#xff0c;除了更换libc和ld&#xff0c;它还需要更换libstdc.so.6和libgcc_s.so.1 更换libc和…

指针习题回顾(C语言)

目录 数组指针和指针数组 编程题&#xff1a; 字符串逆序 字符串左旋 题目1概述&#xff1a; 代码实现&#xff1a; 题目2概述&#xff1a; 代码实现&#xff1a; 调整奇偶顺序 题目概述&#xff1a; 代码实现&#xff1a; 冒泡排序 二级指针 代码解读&#xff1a; …

力扣---通配符匹配

题目描述&#xff1a; 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。 * 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09;。 判定匹配成功的充要条件是&#xff…

lazarus:LCL 嵌入 fpwebview 组件,做一个简单浏览器

从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\lclembed 修改 lclembed.lpr 如下&#xff0c;将 fphttpapp. 注释掉&#xff0c;因为我用不上。 progr…

【STM32 CubeMX】I2C层次结构、I2C协议

文章目录 前言一、I2C的结构层次1.1 怎样在两个设备之间传输数据1.2 I2C如何传输数据1.3 硬件框图1.4 软件层次 二、IIC协议2.1 硬件连接2.2 I2C 总线的概念2.3 传输数据类比2.3 I2C信号2.4 I2C数据的含义 总结 前言 在STM32 CubeMX环境中&#xff0c;I2C&#xff08;Inter-In…

相机图像质量研究(24)常见问题总结:CMOS期间对成像的影响--摩尔纹

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

红队学习笔记Day5 --->总结

今天先不讲新知识&#xff0c;来小小的复习一下 1.8888&#xff1f;隧道端口你怎么回事 在做隧道和端口转发的时候&#xff0c;我们常见的是通过一台跳板机&#xff0c;让外网的机器去远程连接到内网的一些机器&#xff0c;这时候就常见一些这样的命令 以防忘了&#xff0c;先…