算法 - 字符串匹配 - Rabin-Karp算法

2023-12-22 19:48

本文主要是介绍算法 - 字符串匹配 - Rabin-Karp算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Rabin-Karp算法

介绍

Rabin-Karp字符串匹配算法与朴素字符串匹配算法类似,都要比较每一个字符串,不同的是Rabin-Karp算法对字符串做预处理,将字符转换为进制数并取模。预处理时间O(m), 匹配时间是O((n - m + 1) m),m是匹配字符串长度,n是目标字符串长度。

RaBin-Karp算法:

  1. 假设待匹配字符串的长度为M,目标字符串的长度为N(N>=M);
  2. 首先计算待匹配字符串的hash值,计算目标字符串前M个字符的hash值;
  3. 比较前面计算的两个hash值,比较次数N-M+1:

1.若hash值不相等,则继续计算目标字符串的下一个长度为M的字符子串的hash值

2.若hash值相同,则需要使用朴素算法再次判断是否为相同的字串;

伪代码:

RABIN_KARP_MATCHER(T, P, d, q)    //  输入 文本T,模式P,使用进制d,素数qn = T.lengthm = P.lengthh = d^(m - 1) mod qp = 0t = 0for i = 1 to m                // preprocessingp = (d * p + P[i]) mod qt = (d * t + T[i]) mod qfor s = 0 to n - m            //matchingif p == tif P[1..m] == T[s+1..s+m]print "Pattern occurs with shift " sif s < n - mt = (d * (t - T[s + 1] * h) + T[s + m + 1]) mod q

 源码(参考https://blog.csdn.net/chenhanzhun/article/details/39895077):

// Rabin Karp Algorithm #include<iostream>
#include<string>using namespace std;void Rabin_Karp_search(const string &T, const string &P, int d, int q)
{int m = P.length();int n = T.length();int i, j;int p = 0;  // hash value for patternint t = 0; // hash value for txtint h = 1;// The value of h would be "pow(d, M-1)%q"for (i = 0; i < m-1; i++)h = (h*d)%q;// Calculate the hash value of pattern and first window of textfor (i = 0; i < m; i++){p = (d*p + P[i])%q;t = (d*t + T[i])%q;}// Slide the pattern over text one by one for (i = 0; i <= n - m; i++){// Chaeck the hash values of current window of text and pattern// If the hash values match then only check for characters on by oneif ( p == t ){/* Check for characters one by one */for (j = 0; j < m; j++)if (T[i+j] != P[j])break;if (j == m)  // if p == t and pat[0...M-1] = txt[i, i+1, ...i+M-1]cout<<"Pattern found at index :"<< i<<endl;}// Calulate hash value for next window of text: Remove leading digit, // add trailing digit           if ( i < n-m ){t = (d*(t - T[i]*h) + T[i+m])%q;// We might get negative value of t, converting it to positiveif(t < 0) t = (t + q); }}
}int main()
{string T = "Rabin–Karp string search algorithm: Rabin-Karp";string P = "Rabin";int q = 101;  // A prime numberint d = 16;Rabin_Karp_search(T, P,d,q);system("pause");return 0;
}

参考资料:

《算法导论》第三版

这篇关于算法 - 字符串匹配 - Rabin-Karp算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/525242

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意