详解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中的CURL PycURL使用例子
Jun 01 Python
Python中取整的几种方法小结
Jan 06 Python
Python3.X 线程中信号量的使用方法示例
Jul 24 Python
numpy排序与集合运算用法示例
Dec 15 Python
Django项目实战之用户头像上传与访问的示例
Apr 21 Python
详解python如何在django中为用户模型添加自定义权限
Oct 15 Python
python GUI实现小球满屏乱跑效果
May 09 Python
PyQt5+python3+pycharm开发环境配置教程
Mar 24 Python
Django 实现对已存在的model进行更改
Mar 28 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
详解Python GUI编程之PyQt5入门到实战
Dec 10 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
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
PHP 输出简单动态WAP页面
2009/06/09 PHP
有关php运算符的知识大全
2011/11/03 PHP
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
jquery1.9 下检测浏览器类型和版本的方法
2013/12/26 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
pycharm访问mysql数据库的方法步骤
2019/06/18 Python
python实现简单猜单词游戏
2020/12/24 Python
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
简短的公司员工自我评价分享
2013/11/13 职场文书
财务会计专业求职信范文
2013/12/31 职场文书
2014教师研修学习体会
2014/07/08 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers