KMP算法完整教程

  • 全称: Knuth_Morris_Pratt Algorithm(KMP算法)

  • 类型: 高级检索算法

  • 功能: 字符串匹配查找

  • 提出者: D.E.Knuth(克努兹),J.H.Morris(莫瑞斯),V.R.Pratt(普莱特)

  • 所属领域: 数据结构学

  • 应用场景: 统计软件

  • 时间复杂度: O(m+n)

一。原始匹配字符串方法

    以前,我们要肉眼在一个长字符串中寻找一个关键字词,比如在word文档中找一个单词,我们的世界观决定的方法论就是穷举法:挨个搜寻单词的第一个字母,每找到一个就定位然后匹配下一个字母,当匹配错误时就会放弃之前的匹配,沿着刚才的进度继续搜索首字母.

   这种方法也叫作”暴力字符匹配”,和早期计算机检索算法共享着同样的思想,其中被检索的字符串数据库叫做”主串”,检索的字符串叫”模式串”.名字很怪异我也没办法.

    于是依照这种算法我们可以编写一个程序来实现它:
int Index(SString S,SString T,int pos)

{

  i=pos;j=1;

  while(i<=S[0]&&j<=T[0])

  {

    if(S[i]==T[j]){++i;++j;}

    else{i=i-j+2;j=1;}//主串指针回溯重新开始下一趟匹配.

  }

  if(j>T[0])return i-T[0];

  else return 0;

}

//返回模式串T在主串S第pos之后部分中的位置,若不存在则函数值为0.

这里要注意i和j的指针回溯问题,注意细节,具体如下图:



然后问题就来了,这种算法在特定的情况下暴露出一些问题,在时间效率上不是很完美,因为它毕竟是一种穷举法,也符合人们的第一感觉,但是并不是最优的解决方案。比如说当在模式串中比较到第5个字符时才发现不匹配,那么之前四个字符都完全匹配,下一步就不需要再把模式串一位一位的向后移,而很可能直接把模式串向后移动四位就可以了,省去了三次比较,比如模式串是“aceddfaa”,主串是“acedabcd”的情况。

二。初代KMP算法

   针对上面那个例子,我们可以展开思考,如果模式串匹配到第j个字符不匹配的话,接下来只需要在主串中这个位置从模式串中第f(j)的字符开始比较就行了,而不需要从第一个开始。而且f(j)只与模式串中第j个字符以前的所有字符有关。好了,这个f(j)我们用一个数组来存放,就是next【j】。求出next【j】就是KMP算法的核心。可以看出next【j】的值越小越好,优化的效率越高。

KMP的next数组求法是很不容易搞清楚的一部分,也是最重要的一部分。我这篇文章就以我自己的感悟来慢慢推导一下吧!保证你看完过后是知其然,也知其所以然。

如果你还不知道KMP是什么,请先阅读上面的链接,先搞懂KMP是要干什么。

下面我们就来说说KMP的next数组求法。

KMP的next数组简单来说,假设有两个字符串,一个是待匹配的字符串strText,一个是要查找的关键字strKey。现在我们要在strText中去查找是否包含strKey,用i来表示strText遍历到了哪个字符,用j来表示strKey匹配到了哪个字符。

如果是暴力的查找方法,当strText[i]和strKey[j]匹配失败的时候,i和j都要回退,然后从i-j的下一个字符开始重新匹配。

而KMP就是保证i永远不回退,只回退j来使得匹配效率有所提升。它用的方法就是利用strKey在失配的j为之前的成功匹配的子串的特征来寻找j应该回退的位置。而这个子串的特征就是前后缀的相同程度。

所以next数组其实就是查找strKey中每一位前面的子串的前后缀有多少位匹配,从而决定j失配时应该回退到哪个位置。

我知道上面那段废话很难懂,下面我们看一个彩图:



这个图画的就是strKey这个要查找的关键字字符串。假设我们有一个空的next数组,我们的工作就是要在这个next数组中填值。

KMP算法完整教程 (上)的更多相关文章

  1. 【★】KMP算法完整教程

    KMP算法完整教程 全称:                               Knuth_Morris_Pratt Algorithm(KMP算法) 类型:                 ...

  2. 【★】KMP算法完整教程

    KMP算法完整教程 全称:                               Knuth_Morris_Pratt Algorithm(KMP算法) 类型:                 ...

  3. !KMP算法完整教程

      KMP算法完整教程 全称:                               Knuth_Morris_Pratt Algorithm(KMP算法) 类型:                ...

  4. KMP算法完整教程 (下)

    下面我们用数学归纳法来解决这个填值的问题. 这里我们借鉴数学归纳法的三个步骤(或者说是动态规划?): 1.初始状态 2.假设第j位以及第j位之前的我们都填完了 3.推论第j+1位该怎么填 初始状态我们 ...

  5. kmp算法简明教程

    在字符串s中寻找模式串p的位置,这是一个字符串匹配问题. 举例说明: i = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 s = a b a a c a b a a a b a a ...

  6. KMP算法具体解释(转)

    作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...

  7. KMP算法(研究总结,字符串)

    KMP算法(研究总结,字符串) 前段时间学习KMP算法,感觉有些复杂,不过好歹是弄懂啦,简单地记录一下,方便以后自己回忆. 引入 首先我们来看一个例子,现在有两个字符串A和B,问你在A中是否有B,有几 ...

  8. 数据结构20:KMP算法(快速模式匹配算法)详解

    通过上一节的介绍,学习了串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时 ...

  9. KMP算法具体解释

    这几天学习kmp算法,解决字符串的匹配问题.開始的时候都是用到BF算法,(BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配 ...

随机推荐

  1. Xcode 打包 ipa 包

    原地址:http://zengwu3915.blog.163.com/blog/static/27834897201362831449893/ 上次介绍了木有证书的打包ipa.如果安装证书后,我们还有 ...

  2. QtGui.QSlider

    A QtGui.QSlider is a widget that has a simple handle. This handle can be pulled back and forth. This ...

  3. keepalived 使用注意事项

    1.启动用service keepalived start/stop 比直接 /sbin/keepalived start/stop要好,貌似解决了master停止了keepalived服务而back ...

  4. Vertica7 Native Connection Load Balance

    原文链接:Vertica7 Native Connection Load Balance 在Vertica7曾经的版本号中,Vertica是通过Linux的Virtual IP来实现连接的负载均衡的, ...

  5. JavaWeb request对象常用操作

      JavaWeb request对象常用操作 CreateTime--2018年6月1日16点47分 Author:Marydon 一.前提 import javax.servlet.http.Ht ...

  6. 【phpstorm】破解安装

    1.使用前修改C:\windows\system32\Driver\hosts文件,将“0.0.0.0 account.jetbrains.com”添加到hosts文件中. 2. 浏览器打开 http ...

  7. centos增加软连接

    #增加软连接 ln -s /usr/local/git/bin/* /usr/bin/

  8. 关于python 中的 sys.argv 的使用方法

    sys.argv是获取在cmd运行python文件的时候输入的命令行参数,呈现的数据结构是列表的格式 1.用pacharm时运行时的结果是: 输出结果: 2.当我在cmd中输入指令      debu ...

  9. Confluence - Online Team Collaboration Tool

    Confluence - 在线的团队协作沟通工具,包含 meeting 管理, wiki 等等功能 https://www.atlassian.com/software/confluence

  10. sqlzoo练习答案--SUM and COUNT

    World Country Profile: Aggregate functions This tutorial is about aggregate functions such as COUNT, ...