详解KMP算法以及python如何实现


Posted in Python onSeptember 18, 2020

算法思路

Knuth-Morris-Pratt(KMP)算法是解决字符串匹配问题的经典算法,下面通过一个例子来演示一下:

给定字符串"BBC ABCDAB ABCDABCDABDE",检查里面是否包含另一个字符串"ABCDABD"。

1.从头开始依次匹配字符,如果不匹配就跳到下一个字符

详解KMP算法以及python如何实现

详解KMP算法以及python如何实现

2.直到发现匹配字符,然后经过一个内循环严查字符串是否匹配

 详解KMP算法以及python如何实现

3.发现最后一个D不匹配,下面就该思考应该把字符串向右移动多少个位置呢?传统做法可能是移动一格,KMP算法就创新在这里。KMP算法通过查询一个Partial Match Table(表内存有字符串信息),然后计算出需要移动的步数,这个表后面会介绍怎么来的。

详解KMP算法以及python如何实现

这里我们看到D前面是B,查表得到第二个B对应的是2,所以 移动数 = 已匹配字符数 - 查表所得数 也就是 6 - 2 = 4, 需要向右移动四格。

详解KMP算法以及python如何实现

下面也是重复这个步骤

详解KMP算法以及python如何实现

直到发现匹配或者字符长度超出(未发现匹配)。

Partial Match Table

那么这个查询的表是怎么来的呢?仍然以"ABCDABD"为例

详解KMP算法以及python如何实现

- "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 res

def 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 False

print partial_table1("ABCDABD")
print kmp_match("BBC ABCDAB ABCDABCDABDE", "ABCDABD")

以上就是详解KMP算法以及python如何实现的详细内容,更多关于python实现KMP算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
详解Python中的各种函数的使用
May 24 Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 Python
python实现遍历文件夹修改文件后缀
Aug 28 Python
Python get获取页面cookie代码实例
Sep 12 Python
python实现邮件自动发送
Aug 10 Python
Python搭建代理IP池实现获取IP的方法
Oct 27 Python
python使用rsa非对称加密过程解析
Dec 28 Python
tensorflow实现训练变量checkpoint的保存与读取
Feb 10 Python
python读取文件指定行内容实例讲解
Mar 02 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
Python日志模块logging用法
Jun 05 Python
python实现二分查找算法
Sep 18 #Python
Python自定义sorted排序实现方法详解
Sep 18 #Python
python爬虫爬取网页数据并解析数据
Sep 18 #Python
Python实现迪杰斯特拉算法过程解析
Sep 18 #Python
Python 操作 MySQL数据库
Sep 18 #Python
python实现人工蜂群算法
Sep 18 #Python
Python猫眼电影最近上映的电影票房信息
Sep 18 #Python
You might like
用Simple Excel导出xls实现方法
2012/12/06 PHP
CI框架无限级分类+递归的实现代码
2016/11/01 PHP
php获取访问者浏览页面的浏览器类型
2017/01/23 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
python构建自定义回调函数详解
2017/06/20 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
python 内置函数汇总详解
2019/09/16 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
Python实现鼠标自动在屏幕上随机移动功能
2020/03/14 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
认购协议书范本
2014/04/22 职场文书
结婚保证书范文
2014/04/29 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书
python 三边测量定位的实现代码
2021/04/22 Python