详解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实现排序算法
Feb 14 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
Python实现判断并移除列表指定位置元素的方法
Apr 13 Python
Python基于pandas实现json格式转换成dataframe的方法
Jun 22 Python
基于python3实现socket文件传输和校验
Jul 28 Python
Django实现发送邮件功能
Jul 18 Python
Python3分析处理声音数据的例子
Aug 27 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
Python基于locals返回作用域字典
Oct 17 Python
Django 用户认证Auth组件的使用
Nov 30 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 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
thinkphp常见路径用法分析
2014/12/02 PHP
深入浅析php json 格式控制
2015/12/24 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
JS常用函数使用指南
2014/11/23 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
jQuery弹出层插件popShow(改进版)用法示例
2017/01/23 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
js 函数性能比较方法
2020/08/24 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
python脚本实现查找webshell的方法
2014/07/31 Python
使用python3.5仿微软记事本notepad
2016/06/15 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
Django 拆分model和view的实现方法
2019/08/16 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
详解Python IO编程
2020/07/24 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
高一新生军训方案
2014/05/12 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
PHP命令行与定时任务
2021/04/01 PHP