📜  rabin karp 算法 - Python (1)

📅  最后修改于: 2023-12-03 15:04:46.607000             🧑  作者: Mango

Rabin Karp算法 - Python

算法简介

Rabin Karp算法是一种字符串匹配算法,用于在一个文本串(字符串) S 中查找一个模式串(字符串) P 的出现位置。与朴素的字符串匹配算法相比,Rabin Karp算法具有更快的匹配速度。算法的核心思想是通过hash值的比较来判断当前子串是否与模式串相等。

实现步骤

Rabin Karp算法的实现步骤如下:

  1. 计算模式串的hash值,计算文本串中第一个字串的hash值;
  2. 比较模式串的hash值和第一个字串的hash值,若相等则进一步比较模式串和当前子串是否相等;
  3. 如果不相等,则利用Rabin Karp的hash函数,计算文本串中下一个子串的hash值,再与模式串hash值比较,直到找到相同的子串或者结束查找。
代码实现

下面是使用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),但这种情况的概率很小。