详解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中删除文件的程序代码
Mar 13 Python
从零学Python之入门(二)基本数据类型
May 25 Python
Python多线程结合队列下载百度音乐的方法
Jul 27 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
Flask实现跨域请求的处理方法
Sep 27 Python
python 自动重连wifi windows的方法
Dec 18 Python
python如何制作英文字典
Jun 25 Python
Python socket实现的文件下载器功能示例
Nov 15 Python
python Tensor和Array对比分析
Jan 08 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
Python 数据可视化之Seaborn详解
Nov 02 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
上传多个文件的PHP脚本
2006/11/26 PHP
php下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
2013/04/24 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
微信小程序音乐播放器开发
2019/11/20 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
跟老齐学Python之dict()的操作方法
2014/09/24 Python
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
2018/12/12 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
Python实现代码块儿折叠
2020/04/15 Python
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
存储过程和sql语句的优缺点
2014/07/02 面试题
餐饮主管岗位职责
2013/12/10 职场文书
初中英语教学反思
2014/01/25 职场文书
服务行业演讲稿
2014/09/02 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书