时间:2021-05-22
算法思路
Knuth-Morris-Pratt(KMP)算法是解决字符串匹配问题的经典算法,下面通过一个例子来演示一下:
给定字符串"BBC ABCDAB ABCDABCDABDE",检查里面是否包含另一个字符串"ABCDABD"。
1.从头开始依次匹配字符,如果不匹配就跳到下一个字符
2.直到发现匹配字符,然后经过一个内循环严查字符串是否匹配
3.发现最后一个D不匹配,下面就该思考应该把字符串向右移动多少个位置呢?传统做法可能是移动一格,KMP算法就创新在这里。KMP算法通过查询一个Partial Match Table(表内存有字符串信息),然后计算出需要移动的步数,这个表后面会介绍怎么来的。
这里我们看到D前面是B,查表得到第二个B对应的是2,所以 移动数 = 已匹配字符数 - 查表所得数 也就是 6 - 2 = 4, 需要向右移动四格。
下面也是重复这个步骤
直到发现匹配或者字符长度超出(未发现匹配)。
Partial Match Table
那么这个查询的表是怎么来的呢?仍然以"ABCDABD"为例
- "A"的前缀和后缀都为空集,共有元素的长度为0;
- "AB"的前缀为[A],后缀为[B],共有元素的长度为0;
- "ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度0;
- "ABCD"的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0;
- "ABCDA"的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为"A",长度为1;
- "ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为"AB",长度为2;
- "ABCDABD"的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0。
python实现
def partial_table(p): '''''partial_table("ABCDABD") -> [0, 0, 0, 0, 1, 2, 0]''' prefix = set() res = [0] for i in range(1, len(p)): prefix.add(p[:i]) postfix = {p[j:i + 1] for j in range(1, i + 1)} #print(p[:i+1],prefix,postfix,prefix & postfix or {''}) res.append(len((prefix & postfix or {''}).pop())) return resdef kmp_match(s, p): m = len(s); n = len(p) cur = 0 # 起始指针cur table = partial_table(p) while cur <= m - n: #只去匹配前m-n个 for i in range(n): if s[i + cur] != p[i]: cur += max(i - table[i - 1], 1) # 有了部分匹配表,我们不只是单纯的1位1位往右移,可以一次移动多位 break else: return True # loop从 break 中退出时,else 部分不执行。 return Falseprint partial_table1("ABCDABD")print kmp_match("BBC ABCDAB ABCDABCDABDE", "ABCDABD")以上就是详解KMP算法以及python如何实现的详细内容,更多关于python实现KMP算法的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
KMP算法实例详解KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发
这篇文章主要介绍了如何通过Java代码实现KMP算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下KMP算法
在看子串匹配问题的时候,书上的关于KMP的算法的介绍总是理解不了。看了一遍代码总是很快的忘掉,后来决定好好分解一下KMP算法,算是给自己加深印象。在将KMP字串
本文实例讲述了Python字符串匹配算法KMP。分享给大家供大家参考。具体如下:#!/usr/bin/envpython#encoding:utf8defnex
KMP算法是一种神奇的字符串匹配算法,在对超长字符串进行模板匹配的时候比暴力匹配法的效率会高不少。接下来我们从思路入手理解KMP算法。在对字符串进行匹配的时候我