算法 - 字符串匹配 - 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

相关文章

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -