浅析KMP——单模式串匹配算法

什么是KMP?

    模式串匹配,就是给定一个需要处理的文本串和一个需要在文本串中搜索的模式串(长度小于文本串),查询在该文本串中,给出的模式串的出现有无、次数、位置等。平时的朴素模式匹配算法十分低效,需要挨个遍历,十分糟糕。于是就有了KMP。KMP是由三位dalao研究而出。(我不想打名字)

    哎 三位大佬分别是D.E.KnuthJ.H.MorrisV.R.Pratt。(其中Knuth和Rratt共同研究,Morris独立研究qwq分明被孤立了)。这种算法可以大大避免重复遍历的情况,我们亲切的称之为克努特-莫里斯-普拉特算法(特别NB)。简称KMP

KMP算法的原理

理解起来有一点点困难,所以我们从研究原理来解释为什么KMP会比朴素算法好。假设文本串(为了简单,我们称之为主串)S="abcdefgab",匹配串T="abcdex"。如果用前面的朴素算法的话,前5个字母,两个串完全相等,但到了第6个字母,"f"与"x"不等。如图所示。

 

 

  

       

       

    以此类推。这就是朴素匹配算法。我们将主串的位置i表示,模式串的位置j表示。(我讲的好生硬,还是用图表示)

    画个图真麻烦,所以当主串首字符的位置i=2、3、4、5、6时,首字符与T串的首字符均不等。但是仔细发现,对于模式串T(主串为S,模式串为T)来说,"abcdex"首字母"a"与后面的串"bcdex"中任意一个字符都不相同。也就是说,既然"a"不与自己后面的子串中任意一个字符相同,而且S串和T串前五个字符分别相同,也就可以推出子串T的首字符"a"不可能与S串的第2到第5位的字符相同。也就是说在朴素匹配算法下,i=2~5的判断都是多余的。(注意这里是理解KMP算法的关键)

  我们把这两个串抽出来举例。

  

    这样是不是比较好理解了呢?

  同样,在我们知道T串中首字符"a"与T串中后面的字符均不相等的前提下,当进行完S串i=1,T串j=1的朴素匹配后,T串的"a"与S串后面的"b""c""d""e"都可以确定时不同的。那么也就是说我们只需保留下面两种匹配就好了。

  

 

   

posted @ 2019-07-10 18:31  Aqiu0110  阅读(167)  评论(0编辑  收藏  举报