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

相关文章

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

SpringBoot3匹配Mybatis3的错误与解决方案

《SpringBoot3匹配Mybatis3的错误与解决方案》文章指出SpringBoot3与MyBatis3兼容性问题,因未更新MyBatis-Plus依赖至SpringBoot3专用坐标,导致类冲... 目录SpringBoot3匹配MyBATis3的错误与解决mybatis在SpringBoot3如果

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎