详解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的yield和generator
Mar 10 Python
5款非常棒的Python工具
Jan 05 Python
python3实现公众号每日定时发送日报和图片
Feb 24 Python
Python爬虫获取图片并下载保存至本地的实例
Jun 01 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
利用Python实现微信找房机器人实例教程
Mar 10 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
python生成随机红包的实例写法
Sep 02 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
Jun 10 Python
Elasticsearch py客户端库安装及使用方法解析
Sep 14 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
Zerg建筑一览
2020/03/14 星际争霸
php ci框架验证码实例分析
2013/06/26 PHP
php简单日历函数
2015/10/28 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
Seajs源码详解分析
2019/04/02 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
python实现飞机大战微信小游戏
2020/03/21 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
中国最大的名表商城:万表网
2016/08/29 全球购物
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
销售简历自我评价
2014/01/24 职场文书
银行批评与自我批评
2014/02/10 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
个人剖析材料范文
2014/09/30 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
党支部鉴定意见
2015/06/02 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python