📜  用于模式搜索的 Rabin-Karp 算法的Python程序(1)

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

用于模式搜索的 Rabin-Karp 算法的Python程序

在计算机科学中,Rabin-Karp算法被用于在文本中搜索指定的字符串/模式。该算法使用哈希函数来查找模式,而不是将模式与文本的每个子字符串逐个比较,从而提高了搜索的速度。

算法思路

Rabin-Karp算法的基本思路是,先将模式字符串和文本字符串转化为相应的数字表示,然后按照某个哈希公式计算哈希值。比较哈希值是否一致,如果一致,就进行精确匹配;如果不一致,则将哈希值向右移动一位,继续计算。这样可以减少比较的次数,从而提高算法的效率。

具体步骤如下:

  1. 对模式字符串和文本字符串进行预处理,将它们转化为数字形式。
  2. 按照某个哈希公式计算模式字符串的哈希值。
  3. 对于文本字符串,计算第一个窗口大小的哈希值。
  4. 比较文本字符串当前的哈希值和模式字符串的哈希值是否一致,如一致,则进行精确匹配;如不一致,则将哈希值向右移动一位,继续计算。
  5. 如果没有找到匹配的字符串,则继续计算下一个窗口的哈希值,重复步骤4和5,直到找到匹配字符串或搜索结束。
Python代码实现
def rabin_karp(pattern, text):
    """
    Rabin-Karp算法,用于在text中搜索指定的pattern字符串
    :param pattern: 待搜索的模式字符串
    :param text: 待搜索的文本字符串
    :return: 如果text中存在pattern字符串,返回其起始位置;否则返回-1
    """
    # 确定进位方式
    base = 256
    # 确定模数,一般选择一个大质数
    mod = 101
    # 初始化哈希值
    pattern_hash = 0
    text_hash = 0
    # 计算模式字符串的哈希值
    for i in range(len(pattern)):
        pattern_hash = (pattern_hash * base + ord(pattern[i])) % mod
        text_hash = (text_hash * base + ord(text[i])) % mod
    # 滑动窗口搜索文本字符串,逐个比较其哈希值
    for i in range(len(text) - len(pattern) + 1):
        if pattern_hash == text_hash and pattern == text[i:i + len(pattern)]:
            return i
        if i < len(text) - len(pattern):
            text_hash = ((text_hash - ord(text[i]) * (base ** (len(pattern) - 1))) * base + ord(text[i + len(pattern)])) % mod
    return -1
使用示例
text = "The quick brown fox jumps over the lazy dog"
pattern = "brown"
result = rabin_karp(pattern, text)
if result == -1:
    print("在文本字符串中未找到待搜索的模式字符串!")
else:
    print("在文本字符串中找到待搜索的模式字符串,起始位置为:", result)

以上代码输出结果为:

在文本字符串中找到待搜索的模式字符串,起始位置为: 10
总结

Rabin-Karp算法是一种快速的字符串查找算法,它基于哈希函数实现快速比较字符串的特点,减少了比较的次数,从而提高了查找的效率。但是由于哈希函数可能会出现哈希冲突,因此需要选择一个适合的哈希函数和模数,以确保算法的正确性和高效性。