📅  最后修改于: 2023-12-03 15:04:46.607000             🧑  作者: Mango
Rabin Karp算法是一种字符串匹配算法,用于在一个文本串(字符串) S 中查找一个模式串(字符串) P 的出现位置。与朴素的字符串匹配算法相比,Rabin Karp算法具有更快的匹配速度。算法的核心思想是通过hash值的比较来判断当前子串是否与模式串相等。
Rabin Karp算法的实现步骤如下:
下面是使用Python实现Rabin Karp算法的代码。其中,函数rabin_karp返回模式串在文本串中出现的位置,如果没有匹配成功,则返回-1。
def rabin_karp(text, pattern):
if pattern == "" or text == "":
return -1
n, m = len(text), len(pattern)
if m > n:
return -1
p, t, d, q = 31, 0, 256, 997
h, p_pow = pow(p, m-1) % q, 1
for i in range(m):
p_pow = (p_pow * p) % q
t = (d*t + ord(text[i])) % q
p_hash = (d * p_hash + ord(pattern[i])) % q
for i in range(n-m+1):
if p_hash == t and pattern == text[i:i+m]:
return i
if i < n-m:
t = (d*(t-ord(text[i])*p_pow) + ord(text[i+m])) % q
return -1
下面是针对不同测试样例的运行结果:
text = "ABAAABCDBBABCDDEBCABC"
pattern = "ABC"
print(rabin_karp(text, pattern)) # expected output: 3
text = "Hello World"
pattern = "World"
print(rabin_karp(text, pattern)) # expected output: 6
text = "Hello World"
pattern = "Python"
print(rabin_karp(text, pattern)) # expected output: -1
Rabin Karp算法的时间复杂度是O(n+m),其中n是文本串的长度,m是模式串的长度。Rabin Karp算法的实际运行时间还取决于选取的hash函数和哈希表的实现方式等因素。在最坏的情况下,Rabin Karp算法的时间复杂度会退化为O(nm),但这种情况的概率很小。