算法——字符串匹配Rabin-Karp算法
前言
Rabin-Karp字符串匹配算法和前面介绍的《朴素字符串匹配算法》类似,也是相应每一个字符进行比較。不同的是Rabin-Karp採用了把字符进行预处理,也就是对每一个字符进行相应进制数并取模运算,类似于通过某种函数计算其函数值,比較的是每一个字符的函数值。
预处理时间O(m)。匹配时间是O((n-m+1)m)。
Rabin-Karp算法的思想:
- 如果待匹配字符串的长度为M,目标字符串的长度为N(N>M);
- 首先计算待匹配字符串的hash值,计算目标字符串前M个字符的hash值;
- 比較前面计算的两个hash值,比較次数N-M+1:
- 若hash值不相等,则继续计算目标字符串的下一个长度为M的字符子串的hash值
- 若hash值同样。则须要使用朴素算法再次推断是否为同样的字串;
Rabin-Karp算法实现
伪代码:
Rabin_Karp_search(T, P, d, q)
n = T.length;
m = P.length;
h = d^(m-1)mod q;
p = 0;
t = 0;
for i =1 to m
p = (d*p+P[i]) mod q;
t = (d*t+T[i])mod q;
for i = 0 to n-m
if p==t
if P[1..m]==T[i+1..i+m]
print"Pattern occurs with shift"i
if i<n-m
t = d(t-T[i+1]h) + T[i+m+1]mod q
源代码:
// 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 pattern
int t = 0; // hash value for txt
int 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 text
for (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 one
if ( 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 positive
if(t < 0)
t = (t + q);
}
}
} int main()
{
string T = "Rabin–Karp string search algorithm: Rabin-Karp";
string P = "Rabin";
int q = 101; // A prime number
int d = 16;
Rabin_Karp_search(T, P,d,q);
system("pause");
return 0;
}
參考资料:
《算法导论》
http://www.geeksforgeeks.org/searching-for-patterns-set-3-rabin-karp-algorithm/
版权声明:本文博主原创文章。博客,未经同意不得转载。
算法——字符串匹配Rabin-Karp算法的更多相关文章
- 算法——字符串匹配之BM算法
前言 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法(简称BM算法),后缀匹配就是模式串从右到左開始比較,但模式串的移动依旧是从左到右的.在实践中.BM算法效率高于前面介绍的<KM ...
- 实现字符串匹配的KMP算法
KMP算法是Knuth-Morris-Pratt算法的简称,它主要用于解决在一个长字符串S中匹配一个较短字符串s. 首先我们从整体来把我这个算法的思想. 字符串匹配的朴素算法: 我们容易想到朴素算法, ...
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- 字符串匹配的 Boyer-Moore 算法
上一篇文章,我介绍了 字符串匹配的KMP算法 但是,它并不是效率最高的算法,实际采用并不多.各种文本编辑器的” 查找” 功能(Ctrl+F),大多采用 Boyer-Moore 算法. 下面,我根据 M ...
- 字符串匹配的 KMP算法
一般字符串匹配过程 KMP算法是字符串匹配算法的一种改进版,一般的字符串匹配算法是:从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串 ...
- 字符串匹配的kmp算法 及 python实现
一:背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...
- HDU 1711 Number Sequence (字符串匹配,KMP算法)
HDU 1711 Number Sequence (字符串匹配,KMP算法) Description Given two sequences of numbers : a1, a2, ...... , ...
- 字符串匹配(KMP 算法 含代码)
主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知 ...
- 字符串匹配的KMP算法
~~~摘录 来源:阮一峰~~~ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许 ...
随机推荐
- [Android阅读代码]android-async-http源码学习一
android-async-http 下载地址 一个比较常用的Http请求库,基于org.apache.http对http操作进行封装. 特点: 1.每一个HTTP请求发生在UI线程之外,Client ...
- servlet其工作原理和例子证明
servlet简单介绍 当我们在地址栏里面输入www.baidu.com,终于呈如今我们面前的是百度搜索的页面.在这些訪问过程中,都会有一个webserver来处理这些请求以及訪问处理后的结果. 而s ...
- Spring中继承配置的注入方法
(1)两个java类.一个父类一个字类 package com.lc.inherit; /* * 这里是父类 */ public class Student { protected String na ...
- VSTO之旅系列(四):创建Word解决方案
原文:VSTO之旅系列(四):创建Word解决方案 本专题概要 引言 Word对象模型 创建Word外接程序 小结 一.引言 在上一个专题中主要为大家介绍如何自定义我们的Excel 界面的,然而在这个 ...
- cocos2d-js-v3.0-rc0 下 pomelo-cocos2d-jsb native web 配置
一.基本步骤 注意:pomelo-cocos2d-jsb 没实用 https://github.com/NetEase/pomelo-cocos2d-jsb,原因这个不是最新版,另外,componen ...
- OpenCV 通过 MFC 的 Picture Control 控件操作图像
假设希望对显示在MFC Picture Control 控件里的图像进行操作,比方画线画点之类的,能够利用 OpenCV 结合 MFC 本身的鼠标响应函数来实现. 怎样将图像显示到 Picture C ...
- 强势围观,CSDN代码引用bug
看我写的一篇blog http://blog.csdn.net/laijieyao/article/details/41014355,在代码上引用了微软雅黑的字体,结果代码显示出来把我给惊呆了 竟然 ...
- c#代码规范和质量检查工具这点事
c#代码规范和质量检查工具这点事 代码风格检查:StyleCop 代码缺陷检查:FxCop 代码质量: 代码度量值/Code Metrics StyleCop 介绍 The StyleCop tool ...
- SWT的ListVierer的使用
package com.test; import java.util.ArrayList; import java.util.List; import model.People; import org ...
- POJ 2942 Knights of the Round Table - from lanshui_Yang
Description Being a knight is a very attractive career: searching for the Holy Grail, saving damsels ...