kmp算法

南七星之家  金牌会员 | 2024-9-6 01:28:34 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 537|帖子 537|积分 1613

1、kmp算法介绍

        KMP算法,全称为Knuth-Morris-Pratt算法,是一种字符串匹配算法。它的根本头脑是,当出现字符串不匹配时,可以知道一部分文本内容是一定匹配的,可以利用这些信息避免重新匹配已经匹配过的文本。这种算法的时间复杂度为O(n+m),此中n是文本串的长度,m是模式串的长度,比暴力匹配算法具有更高的效率。KMP算法的核心是利用模式串自己的特点,预处理出一个next数组,用于在匹配过程中快速移动模式串。

        KMP算法的实现过程可以分为两个步调:预处理和匹配。预处理阶段,必要对模式串举行分析,得到next数组。匹配阶段,将模式串移动到精确的位置举行匹配。

2、计算next数组

对要匹配的pattern字符串:ABABCABAB求next数组。
结果为【0,0,1,2,0,1,2,3,4】.
A:【0】
AB:【0,0】
ABA:【0,0,1】
ABAB:【0,0,1,2】
ABABC:【0,0,1,2,0】
ABABCA:【0,0,1,2,0,1】
ABABCAB:【0,0,1,2,0,1,2】
ABABCABA:【0,0,1,2,0,1,2,3】
ABABCABAB:【0,0,1,2,0,1,2,3,4】
3、求匹配的字符串

对字符串举行匹配,当pattern字符串和text中出现不匹配的位置时,将text中的下标往右边移动next[j]。
代码如下:
  1. def compute_prefix_function(pattern):
  2.     """计算部分匹配表 (prefix table)"""
  3.     prefix_table = [0] * len(pattern)
  4.     j = 0  # 代表前缀的索引
  5.     for i in range(1, len(pattern)):
  6.         # 如果字符不匹配,寻找新的 j
  7.         while j > 0 and pattern[i] != pattern[j]:
  8.             j = prefix_table[j - 1]
  9.         
  10.         # 如果字符匹配,j 加 1
  11.         if pattern[i] == pattern[j]:
  12.             j += 1
  13.         
  14.         # 更新 prefix table
  15.         prefix_table[i] = j
  16.    
  17.     return prefix_table
  18. def kmp_search(text, pattern):
  19.     """KMP 字符串匹配算法"""
  20.     prefix_table = compute_prefix_function(pattern)
  21.     print(prefix_table)
  22.     j = 0  # 模式串的起始位置
  23.     for i in range(len(text)):
  24.         # 如果字符不匹配,使用 prefix table 回溯 j
  25.         while j > 0 and text[i] != pattern[j]:
  26.             j = prefix_table[j - 1]
  27.         
  28.         # 如果字符匹配,j 加 1
  29.         if text[i] == pattern[j]:
  30.             j += 1
  31.         
  32.         # 如果模式串匹配完毕,返回匹配起始位置
  33.         if j == len(pattern):
  34.             return i - j + 1  # 返回匹配起始索引
  35.         
  36.         # 如果没有匹配到,继续下一轮循环
  37.     return -1  # 未找到匹配
  38. # 示例使用
  39. if __name__ == "__main__":
  40.     text = "ABABDABACDABABCABAB"
  41.     pattern = "ABABCABAB"
  42.     result = kmp_search(text, pattern)
  43.    
  44.     if result != -1:
  45.         print(f"Pattern found at index {result}")
  46.     else:
  47.         print("Pattern not found in the text")
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表