<!----><!---->
<!---->
字符串匹配问题(
1
)——
Rabin-Karp
算法
<!---->1.
<!---->问题描述
给定目标字符串
T[0..n-1]
(基于
0
的数组,数组长度为
n
),和模式串
P[0..m-1]
,问
P
可否匹配
T
中的任意子串,如果可以,返回匹配位置。
<!---->2.
<!---->问题分析
<!---->
<!---->直观分析
brute-force
的蛮力法,适用于较小规模的字符串匹配。
<!---->
<!---->优化
主要介绍
3
种优化办法,分别具体为:
Rabin-Karp
算法,有限自动机和
KMP
算法。将分为
3
篇博文分别讨论。本小节主要介绍
Rabin-Karp
算法。
<!---->
<!---->得出算法
Rabin-Karp
算法(以下简称为
RK
算法),是基于这样的思路:即把串看作是字符集长度进制的数,由数的比较得出字符串的比较结果。例如,给定字符集为∑
={0,1,2,3,4,5,6,7,8,9}
,∑长度为
d=10
,那么任何以∑为字符集的串都可看作
d
(此处为
10
)进制的数。
记模式串
P[0..n-1]
对应的数值为
P
,
T[0..n-1]
所有长度为
m
的子串对应的数值为
ts
,设
P
和
T
都是基于字符集长度为
|
∑
|=d
的字符串。
那么,
ts
即为
T[s..s+m]
对应的数值,这里
0<=s<=n-m-1
。
P =
P[m]+d*(P[m-1]+d*(P[m-2]+..)))
同样
t0
也可类似求得。
最重要的是如何从
ts
求出
ts+1
。
ts+1
=T[s+m]+d*(ts
+dm-1
*T[s])
注:此处是该算法的关键,即在常数时间内能够计算出下一个
m
长度的字串对应的数值。初看比较抽象,举个例子就比较明白了,设
x=12345
,现在是已知长度为
3
的数值
234
,现在要求
345
对应的数值,可以这样来得到:
345 = 5 + 10*(234-102
*2)
<!---->3.
<!---->算法描述
求出所有
m
长度子串所对应的数值,对数值进行比较,继而得出子串是否匹配。当模式串长度很大时,这时对应的数值会很大,比较起来比较麻烦,可使用对一个大奇数取模后进行比较。
<!---->4.
<!---->具体实现
这里实现的只是m值较小时的情形,大整数需要特定的类的支持(如可自定义大整数类),选取10进制的数是为了方便起见,当然字母也是OK的。
#include "iostream"
#include "string"
#include "cmath"
using namespace std;
// get the value of the character in the set
int getV(char p, string set)
{
for(int i=0; i<set.length(); i++)
{
if (p==set[i])
return i;
}
return -1;
}
// d is the size of the character set
int RK(string T, string P,string set)
{
int d = int(set.length());
int n = T.length();
int m = P.length();
int h = pow(double(d), m-1);
int p=0;
int t = 0;
for(int i=0; i<m; i++)
{
p = d*p + getV(P[i],set);
t = d*t + getV(T[i], set);
}
for (int s=0; s<=n-m; s++)
{
cout<<"p,t is "<<p<<","<<t<<endl;
if (p==t)
return s;
if (s<n-m)
t = getV(T[s+m],set)+d*(t-h*getV(T[s],set));
}
return -1;
}
int main()
{
// set is the character set
string set= "0123456789";
// pattern P
string P = "2365";
// T is the string to match
string T = "258569236589780";
int i = RK(T, P, set);
cout<<"the postition is:"<<i<<endl;
return 0;
}
<!----><!---->
<!---->5.
<!---->参考资料
[1]
Thomas
H. Cormen Introduction to Algorithms
分享到:
相关推荐
**字符串匹配Rabin-Karp算法**是一种在文本中查找子串出现位置的高效算法,它由Rabin和Karp在1987年提出。在传统的字符串匹配算法中,如朴素算法,每次比较一个字符,如果发现不匹配则需要从头开始检查下一个位置,...
单模式匹配算法是计算机科学中用于在文本串中查找子串的一种高效方法,Rabin-Karp算法便是其中一种。该算法由Michael O. Rabin和Donald E. Karp于1987年提出,它的主要特点是利用了哈希函数来快速比较文本串中的子串...
Rabin-Karp 字符串搜索算法是基于哈希的字符串匹配算法,用于在一个文本中查找一个模式字符串的出现。下面是该算法的概念、特点、优缺点、适用场景和 Java 代码实现。 概念:Rabin-Karp 字符串搜索算法是一种基于...
"Rolling Hash(Rabin-Karp Algorithm)" Rolling Hash(Rabin-Karp ...Rabin-Karp算法的时间复杂度可以降低到O(n),使其成为一种高效的字符串搜索算法。该算法广泛应用于文本搜索、数据压缩和模式识别等领域。
Rabin-Karp 算法是一种字符串搜索算法,由 Michael O. Rabin 和 Richard M. Karp 于 1987 年提出。该算法主要应用于在主字符串(大字符串)中查找子串(小字符串)是否存在,其特点是利用了数学的模运算来快速比较两...
本项目“StringMatch”专注于探究三种不同的字符串匹配算法:朴素算法、Rabin-Karp算法和KMP(Knuth-Morris-Pratt)算法。这三种算法在不同的场景下有着各自的优点和效率,理解它们的工作原理和性能差异对于优化搜索...
Rabin-Karp算法,一种字符串搜索算法,因其高效性和灵活性,在抄袭检测中得到了广泛应用。本文将深入探讨Rabin-Karp算法的原理,并介绍其在Java编程语言中的具体实现。 Rabin-Karp算法由Michael O. Rabin和Dick ...
Rabin-Karp算法,是由M.O.Rabin和R.A.Karp设计实现的一种基于移动散列值的字符串匹配算法。 通常基于散列值的字符串匹配方法:(1)首先计算模式字符串的散列函数;(2)然后利用相同的散列函数计算文本中所有可能...
"RK.rar_fuzzy string" 提供的源码着重于字符串模式匹配与模糊匹配算法的实现,这里的“RK”可能指的是Rabin-Karp算法,一种常用的字符串搜索算法。接下来我们将深入探讨这个主题。 首先,字符串模式匹配是指在一个...
运用Karp算法实现字符串匹配的c++程序
Rabin-Karp算法是一种字符串匹配算法,由Michael O. Rabin和Dick Karp于1987年提出。它的核心思想是通过哈希函数将较长的模式串和文本串转换为整数,然后比较这两个整数是否相等,以快速判断子串是否存在。这种方法...
通过改进Karp-Rabin 算法,实现了多模式字符串匹配技术,实验表明多模式Karp-Rabin算法具有良好的性能。随后在多模式Karp-Rabin 算法的基础上进一步改进,使其在高并发情况下能够支持模式串动态增删功能。实验表明该...
`Google-Palagrism-Checkmaster`项目巧妙地结合了JSoup的Web爬虫能力和Rabin-Karp算法的字符串匹配功能,创建了一个有效的抄袭检测工具。这种工具对于学术界、教育领域以及网络内容创作者来说具有很高的实用价值,...
Rabin-Karp算法是一种基于哈希的字符串匹配方法。它通过计算主串和模式串的哈希值,然后比较这些哈希值来快速检查两个字符串是否可能相等。在报告中没有详细描述Rabin-Karp算法,但其基本思想是使用滚动哈希来减少...
1. **RK算法**(Rabin-Karp Algorithm): - RK算法基于哈希函数,通过计算模式串和文本串的哈希值进行比较,以快速检测可能的匹配。 - 它的主要优点在于可以利用哈希碰撞的概率来减少不必要的比较,提高匹配速度...
Rabin-Karp算法是一种字符串搜索算法,由Michael O. Rabin和Dana Scott在1987年提出,主要用于在一个长字符串(主串)中查找一个短字符串(模式串)出现的位置。它结合了数学和计算机科学的概念,利用了模运算来减少...
例如,我们要在一段文字中找出所有特定单词的出现位置,这就是一个典型的串匹配问题。常见的串匹配算法有朴素匹配、KMP(Knuth-Morris-Pratt)算法、Boyer-Moore算法和Rabin-Karp算法等。 1. **朴素匹配算法**: ...
Rabin Karp搜索算法 Java语言实现。 它可用于检测另一个字符串中某个字符串的出现。 可用于检测detect窃。 注意我建议不要使用此算法,迭代地调用可以在V8中产生更好的性能。 用法 npm install var rks = require('...
为了提高匹配效率,后续出现了许多改进算法,如KMP算法、Boyer-Moore算法和Rabin-Karp算法等。这些算法在一定程度上利用了已匹配的信息,减少了不必要的字符比较,从而提高了搜索速度。 例如,KMP算法会构建一个...
**热-KMP算法:字符串匹配的...总的来说,KMP算法是解决字符串匹配问题的一种经典方法,其高效性和简洁性使其在实际应用中具有很高的价值。理解和掌握KMP算法,对于从事计算机科学和相关领域的学习者来说是非常重要的。