字符串Hash学习笔记

  • 哈希算法

    哈希算法是通过一个哈希函数 H H H,将一种数据(包括字符串、较大的数等)转化为能够用变量表示或是直接就可作为数组下标的数。

  • 哈希值

    通过哈希函数转化的得到的数值。可以通过哈希值实现快速查找和匹配。

简介

寻找长度为 n n n 的主串 S S S 中的匹配串 T T T(长度为 m m m)出现的位置或次数的问题属于字符串匹配问题。

朴素的想法是枚举所有起始位置,再直接检查是否匹配。

可以不使用 O ( m ) O(m) O(m) 的直接比较字符串的方法,而是比较长度为 m m m 的主串 S S S 的子串的哈希值是否相等,这就是哈希算法的原理——字符串 Hash。

流程

所以我们需要用到一个叫做滚动哈希的优化技巧。

我们选取两个合适的互质常数 b b b h h h b < h b<h b<h),假设字符串 C = c 1 c 2 ⋯ c m C=c_1c_2 \cdots c_m C=c1c2cm,那么我们定义哈希函数: H ( C ) = ( c 1 b m − 1 + c 2 b m − 2 + ⋯ + c m b 0 ) m o d h H(C)=(c_1b^{m-1}+c_2b^{m-2}+ \cdots +c_mb^0) \bmod h H(C)=(c1bm1+c2bm2++cmb0)modh

正常的数字是十进制的,这里 b b b 是基数,相当于把字符串看作是 b b b 进制数。

这一过程是递推计算的。下面讲解省略求模运算,因为可以用自然溢出大法!!!
H ( C , k + 1 ) = H ( C , k ) × b + c k + 1 H(C,k+1)=H(C,k) \times b+c_{k+1} H(C,k+1)=H(C,k)×b+ck+1
举个栗子:

字符串 C = ACDA C=\texttt{ACDA} C=ACDA,令 1 1 1 表示 A \texttt{A} A 2 2 2 表示 B \texttt{B} B,以此类推。
H ( C , 1 ) = 1 H ( C , 2 ) = 1 × b + 3 H ( C , 3 ) = 1 × b 2 + 3 × b + 4 H ( C , 4 ) = 1 × b 3 + 3 × b 2 + 4 × b + 1 \begin{aligned} &H(C,1)=1\\ &H(C,2)=1 \times b+3\\ &H(C,3)=1 \times b^2+3 \times b+4\\ &H(C,4)=1 \times b^3+3 \times b^2+4 \times b+1 \end{aligned} H(C,1)=1H(C,2)=1×b+3H(C,3)=1×b2+3×b+4H(C,4)=1×b3+3×b2+4×b+1
判断字符串 C = c 1 c 2 ⋯ c m C=c_1c_2 \cdots c_m C=c1c2cm 从位置 k + 1 k+1 k+1 开始的长度为 n n n 的子串 C ′ = c k + 1 c k + 2 ⋯ c k + n C'=c_{k+1}c_{k+2} \cdots c_{k+n} C=ck+1ck+2ck+n 的哈希值与另一匹配串 S = s 1 s 2 ⋯ s n S=s_1s_2 \cdots s_n S=s1s2sn 的哈希值是否相等。
H ( C ′ ) = H ( C , k + n ) − H ( C , k ) × b n H(C')=H(C,k+n)-H(C,k) \times b^n H(C)=H(C,k+n)H(C,k)×bn

于是只需要预求得 b n b^n bn,就能在 O ( 1 ) O(1) O(1) 时间内得到任意字符串的子串哈希值,从而完成字符串匹配。于是乎,字符串匹配问题的算法时间复杂度就为 O ( n + m ) O(n+m) O(n+m)

举个栗子:

字符串 C = ACDA C=\texttt{ACDA} C=ACDA S = CD S=\texttt{CD} S=CD k = 1 k=1 k=1 n = 2 n=2 n=2
H ( C ′ ) = H ( C , 1 + 2 ) − H ( C , 1 ) × b 2 = ( 1 × b 2 + 3 × b + 4 ) − ( 1 × b 2 ) = 3 × b + 4 H ( S ) = 3 × b + 4 \begin{aligned} H(C')&=H(C,1+2)-H(C,1) \times b^2\\ &=(1 \times b^2+3 \times b+4)-(1 \times b^2)\\ &=3 \times b+4\\ H(S)&=3 \times b+4 \end{aligned} H(C)H(S)=H(C,1+2)H(C,1)×b2=(1×b2+3×b+4)(1×b2)=3×b+4=3×b+4

正确性

出现不同字符串哈希值相等的概率越低越好。

所以有以下两种方法:

  • 自然溢出法

    利用 unsigned long long 无符号整数计算哈希值,相当于对哈希值 m o d 2 64 \bmod 2^{64} mod264

  • 双模法

    顾名思义,就是搞一个二元数组存储哈希值, m o d \bmod mod 两个数,两个数都相同哈希值才相同。

实现

Portal.

代码如下:

#include <bits/stdc++.h>
using namespace std;typedef unsigned long long ull;
const int mmax=1505,maxn=10005;
ull base=131,prime=23317,mod=212370440130137957;
int N,a[maxn],ans=1;
char s[mmax];
ull hash[maxn],power[maxn];ull hashh(char s[])
{int len=strlen(s);ull ans=0;for(int i=0;i<len;i++)ans=(ans*base+(ull)s[i])%mod+prime;return ans;
}int main()
{cin>>N;for(int i=1;i<=N;i++)scanf("%s",s),a[i]=hashh(s);sort(a+1,a+N+1);for(int i=1;i<N;i++)if(a[i]!=a[i+1]) ans++;cout<<ans;return 0;
}

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

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

相关文章

【TES600】青翼科技基于XC7K325T与TMS320C6678的通用信号处理平台

板卡概述 TES600是一款基于FPGA&#xff0b;DSP协同处理架构的通用高性能实时信号处理平台&#xff0c;该平台采用1片TI的KeyStone系列多核浮点/定点DSP TMS320C6678作为主处理单元&#xff0c;采用1片Xilinx的Kintex-7系列FPGA XC7K325T作为协处理单元&#xff0c;具有1个FMC…

斜率优化dp

f i min ⁡ ( a j − j i ) f_i\min(a_j - j \times i) fi​min(aj​−ji) 考虑变成点对 ( j , a j ) (j,a_j) (j,aj​)&#xff0c;则 f i Y j − X j i f_iY_j-X_ji fi​Yj​−Xj​i 令 i k , f i b ik, f_ib ik,fi​b&#xff0c;得 b Y j − X j k bY_j-X_jk b…

甄知科技张礼军:数智化转型助企业破茧成蝶!

数智化浪潮滚滚向前&#xff0c;正席卷各行各业&#xff0c;带领企业从数字化时代跨入数智化时代。可什么是数智化&#xff1f;如何实现数智化转型&#xff1f;已经成为横亘在无数企业面前的大难题&#xff01; 事实上&#xff0c;数智化是数字化、AI和业务三个要素的交集&…

4.9 多协议标记交换MPLS

思维导图&#xff1a; 前言&#xff1a; **4.9 多协议标记交换MPLS笔记** 1. **定义与背景**&#xff1a; - MPLS (多协议标记交换) 是一种由 IETF 开发的新协议。 - “多协议”意味着 MPLS 的上层可以使用多种协议。 - 该协议综合了多家公司的技术&#xff0c;如 C…

【MySQL系列】- Select查询SQL执行过程详解

【MySQL系列】- Select查询SQL执行过程详解 文章目录 【MySQL系列】- Select查询SQL执行过程详解一、SQL查询语句的执行过程二、SQL执行过程详解2.1. 连接器2.2. 查询缓存2.3. 分析器2.4. 优化器2.5. 执行器 三、undo log 和 redo log作⽤3.1. redo log &#xff08;重做日志&a…

Java Web 33道面试题汇总

更多面试合集在:https://javaxiaobear.cn 1、http 的长连接和短连接? HTTP 协议有 HTTP/1.0 版本和 HTTP/1.1 版本。HTTP1.1 默认保持长连接(HTTP persistent connection,也翻译为持久连接),数据传输完成了保持 TCP 连接不断开(不发 RST 包、不四次握手),等待在同域名…

基于Linux的驱动开发:内核模块传参、内核到处符号表、字符设备驱动

内核模块传参 内核模块&#xff1a; int a , b; 安装内核模块时&#xff1a;insmod demo.ko a 100 b 10; 1.内核模块传参的意义 在安装内核模块时给内核模块中的变量进行数值传递&#xff0c;这样可以让我们的内核模块向上兼容更为复杂的应用程序&#xff0c;向下适配多种硬件…

2022年亚太杯APMCM数学建模大赛C题全球变暖与否全过程文档及程序

2022年亚太杯APMCM数学建模大赛 C题 全球变暖与否 原题再现&#xff1a; 加拿大的49.6C创造了地球北纬50以上地区的气温新纪录&#xff0c;一周内数百人死于高温&#xff1b;美国加利福尼亚州死亡谷是54.4C&#xff0c;这是有史以来地球上记录的最高温度&#xff1b;科威特53…

JVM内存模型概述

这里主要分为五大块&#xff0c;分别是&#xff1a;本地方法栈、方法区、java堆、程序计数器和java栈。其中重点是方法区、java堆和java栈。 下面就把各个区域的性质总结一下&#xff1a;&#xff08;说明&#xff0c;下面的只是结论&#xff0c;没有详细的对各个内存块进行详细…

运维监控Zabbix部署

目录 运维监控Zabbix部署 1. 简介 2. 安装 ​编辑 2.1 安装前准备 - Mysql 2.2 安装Zabbix Server 和 Zabbix Agent 2.2.1 安装Zabbix yum库 2.2.2 安装Zabbix Server、前端、Agent 2.2.3 初始化Mysql数据库 2.2.4 为Zabbix Server配置数据库 2.2.5 配置Zab…

react中在js文件里定义的变量,如何在less文件里去使用该变量

在 React 中&#xff0c;如果在 JS 文件中定义了变量&#xff0c;可以使用 CSS Modules 的方式将变量导出到 LESS 文件中。 以下是示例代码&#xff1a; // index.js import React from react; import styles from ./styles.module.less;const color red;function App() {re…

嵌入式系统>嵌入式硬件知识

AI芯片的特点包括 &#xff1a;新型计算范式AI芯片的关键特征&#xff1a; 1、新型的计算范式 AI 计算既不脱离传统计算&#xff0c;也具有新的计算特质&#xff0c;如处理的内容往往是非结构化数据&#xff08;视频、图片等&#xff09;。处理的过程通常需要很大的计算量&am…

算法题java

一、四向链表&#xff0c;输入n生成一个多维4向链表 Datastatic class ListNode<T>{private T val;ListNode<T> up,down,left,right;public ListNode(T val){this.val val;}}public static void main(String[] args){ListNode<Integer> node getResult(8);…

AI驱动的未来:探索人工智能的无限潜力 | 开源专题 No.39

这一系列开源项目代表着多个领域的最新技术成果&#xff0c;包括深度学习、自然语言处理、计算机视觉和分布式训练。它们共同的特点是致力于教育、资源分享、开源精神、多领域应用以及性能和效率的追求&#xff0c;为广大开发者、研究者和学生提供了宝贵的工具和知识&#xff0…

AI全栈大模型工程师(九)Function Calling 的机制

文章目录 Function Calling 的机制Function Calling 示例 1:加法计算器Function Calling 实例 2:四则混合运算计算器后记Function Calling 的机制 Function Calling 示例 1:加法计算器 需求:用户输入任意可以用加法解决的问题,都能得到计算结果。 # 加载环境变量import o…

elasticsearch的docker安装与使用

安装 docker network create elasticdocker pull docker.elastic.co/elasticsearch/elasticsearch:8.10.4# 增加虚拟内存&#xff0c; 此处适用于linux vim /etc/sysctl.conf # 添加 vm.max_map_count262144 # 重新启动 sysctl vm.max_map_countdocker run --name es01 --net …

【MATLAB第80期】基于MATLAB的结构核岭回归SKRR多输入单输出回归预测及分类预测模型

【MATLAB第80期】基于MATLAB的结构核岭回归SKRR多输入单输出回归预测及分类预测模型 SKRR这是Gustau Camps-Valls等人在“用深度结构核回归检索物理参数”中提出的结构核岭回归&#xff08;SKRR&#xff09;方法。 参考文献&#xff1a; Camps-Valls,Retrieval of Physical Pa…

AM@两种余项型泰勒公式的对比和总结@常用函数的麦克劳林公式

文章目录 abstract两种余项型泰勒公式的对比和总结Maclaurin公式常用函数的Maclaurin公式推导例求极限按幂展开 abstract 泰勒公式的两种余项型(Penao&Lagrange)泰勒公式的对比和总结常用的Maclaurin公式列举(Peano余项型为主) 两种余项型泰勒公式的对比和总结 Taylor公式…

MySQL中InnoDB插入缓冲区(Insert Buffer)

一、插入缓冲区的基本原理 插入缓冲区&#xff08;Insert Buffer&#xff0c;也称作 Change Buffer&#xff09;&#xff0c;是InnoDB存储引擎的一种内部机制&#xff0c;它允许系统将对非聚集索引页的写操作&#xff08;例如插入、删除和更新&#xff09;暂时缓存在内存中&am…

FL Studio21最新中文破解进阶高级完整版安装下载教程

目前水果软件最版本是FL Studio21&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破想象力的限制。喜欢音乐制作的小伙伴千万不要错过这个功能强大&#xff0c;安装便捷的音乐软件哦&#xff01;如…