博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谈谈KMP算法
阅读量:6281 次
发布时间:2019-06-22

本文共 808 字,大约阅读时间需要 2 分钟。

hot3.png

KMP算法的资料网上已经一大把了,主要用来解决某个文本片段是否包含另一个子串问题。这里假设文本片段的长度n大于子串长度m,如:

文本串为ABCDABGHIJK

子串为   ABCDABE

在传统的暴力解法中当子串的E与主串的G不匹配时,将文本串从B开始、子串从头开始重新匹配,这样的时间复杂度为(n-m+1)*m,很显然效率是比较低的。

KMP算法的思想是当子串的E不匹配时,文本串保持在G位置,子串从C位置开始匹,关键就是要知道:

1、为什么是C这个位置?

2、如何求C这个位置?

先说第一个问题:直观的看是因为C前面的AB与G前面的AB正好能够匹中。但实际上就像采用暴力法解决时,本质上是在查找子串ABCDABE与剩余文本串BCDABGHIJK的第一个能找到子串最长前缀AB的位置,由于KMP算法不想让未匹中字符G的位置进行回溯即已经固定,所以就等价于查找子串ABCDABE与剩余文本串BCDAB的最长公共前缀问题。由于最长公共前缀是AB所以子串从C位置开始匹。

再说第二个问题:查找子串ABCDABE与剩余文本串BCDAB的最长公共前缀问题等价于计算子串ABCDA与剩余文本串BCDAB的最长公共前缀问题(因为最长公共前缀的长度一定是<=剩余文本串BCDAB的长度),因此也就等价于计算字符串ABCDAB的最长公共前后缀长度也就是计算集合(ABCDA、ABCD、ABC、AB、A)与集合(BCDAB、CDAB、DAB、AB、B)的交集中字符长度最长的字符即AB。

求解的方法比较简单将ABCDA与BCDAB比较、ABCD与CDAB比较、ABC与DAB比较、AB与AB比较、A与B比较即可。

实际上子串的每个字符都要求出当不匹配时指针应该停留的位置,这个在匹配前需要进行预处理,预处理的方法就是求解第二个问题的方法。

转载于:https://my.oschina.net/u/1268334/blog/2989615

你可能感兴趣的文章
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>