📅  最后修改于: 2023-12-03 15:11:17.581000             🧑  作者: Mango
在计算机科学中,Rabin-Karp算法被用于在文本中搜索指定的字符串/模式。该算法使用哈希函数来查找模式,而不是将模式与文本的每个子字符串逐个比较,从而提高了搜索的速度。
Rabin-Karp算法的基本思路是,先将模式字符串和文本字符串转化为相应的数字表示,然后按照某个哈希公式计算哈希值。比较哈希值是否一致,如果一致,就进行精确匹配;如果不一致,则将哈希值向右移动一位,继续计算。这样可以减少比较的次数,从而提高算法的效率。
具体步骤如下:
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算法是一种快速的字符串查找算法,它基于哈希函数实现快速比较字符串的特点,减少了比较的次数,从而提高了查找的效率。但是由于哈希函数可能会出现哈希冲突,因此需要选择一个适合的哈希函数和模数,以确保算法的正确性和高效性。