在计算机科学中,RK算法(即Rabin-Karp算法)是一种高效的字符串匹配算法,广泛应用于文本搜索、生物信息学、数据挖掘等领域。本教程将带你从零开始,用Python语言实现RK算法,即使你是编程小白,也能轻松理解并掌握这一经典算法。
RK算法由Michael O. Rabin和Richard M. Karp于1987年提出,其核心思想是利用哈希函数对模式串(pattern)和文本串(text)中的子串进行快速比较。如果两个字符串的哈希值相同,则再逐字符验证是否真正匹配,从而减少不必要的字符比较次数。

我们将按照以下步骤编写代码:
def rabin_karp_search(text, pattern): """ 使用RK算法在text中查找pattern的所有出现位置 返回匹配起始索引的列表 """ if not pattern or not text: return [] n = len(text) # 文本长度 m = len(pattern) # 模式长度 # 哈希参数 d = 256 # 字符集大小(ASCII) q = 101 # 一个质数,用于取模防止哈希值过大 # 计算 d^(m-1) % q,用于滚动哈希 h = pow(d, m - 1, q) # 初始化模式串和文本首窗口的哈希值 p_hash = 0 # pattern hash t_hash = 0 # text window hash # 计算初始哈希值 for i in range(m): p_hash = (d * p_hash + ord(pattern[i])) % q t_hash = (d * t_hash + ord(text[i])) % q matches = [] # 滑动窗口遍历文本 for i in range(n - m + 1): # 如果哈希值匹配,再逐字符验证 if p_hash == t_hash: if text[i:i + m] == pattern: matches.append(i) # 计算下一个窗口的哈希值(如果不是最后一个窗口) if i < n - m: t_hash = (d * (t_hash - ord(text[i]) * h) + ord(text[i + m])) % q # 确保哈希值非负 if t_hash < 0: t_hash += q return matches# 测试示例if __name__ == "__main__": text = "ABABDABACDABABCABCABCABC" pattern = "ABC" result = rabin_karp_search(text, pattern) print(f"模式 '{pattern}' 在文本中出现的位置: {result}")d = 256 表示我们假设使用ASCII字符集(共256个字符)。q = 101 是一个质数,用于取模运算以避免整数溢出,并减少哈希冲突。
关键在于滚动哈希:当我们从窗口 [i, i+m-1] 移动到 [i+1, i+m] 时,不需要重新计算整个子串的哈希值,而是通过数学公式快速更新:
新哈希值 = (d × (旧哈希值 - 第一个字符 × d^(m-1)) + 新字符) mod q
运行上述代码,输出为:
模式 'ABC' 在文本中出现的位置: [13, 16, 19]
通过本教程,你已经学会了如何用Python语言实现RK算法进行高效的字符串匹配。RK算法虽然在最坏情况下时间复杂度为 O(nm),但在实际应用中(尤其是随机文本)表现优异。掌握这一Rabin-Karp算法教程中的核心思想,将为你学习更高级的字符串算法(如KMP、Boyer-Moore)打下坚实基础。
希望这篇关于RK算法的入门指南对你有所帮助!动手试试修改代码,测试不同文本和模式,加深理解吧!
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126087.html