字符串匹配算法(1)KMP

2017/02/24
本篇针对KMP字符串匹配算法。
概述:
我们匹配字符串的时候,想到的自然是在起始点开始一个一个匹配,这样如果一直进行的话也就是相应的蛮力匹配法。但是,如果可以利用已经匹配过的这些字符串,就可以减少回退,使得可以继续使用。
总体思想:
持续利用已经学习到的信息,将其作为进一步匹配的基础。(一定要注意这个“持续”关键词)
(不知道用什么软件可以做出来漂亮的图表,这样就可以直接演示下这部分算法了)
已经学习到的信息,我不能浪费。


下面来上这部分的代码。

int kmpsearch(char *p,char *a){
    int i , j , M = strlen(p),N=strlen(a);
    initnext(p);
    for( i = 0 ,j = 0 ; j < M && i < N; i++,j++)
      while((j>= 0 ) && a[i] != p[j])) j = next[j];
    if ( j == M) return i - M ; else return i;
}

暂时不考虑next[]数组,就当这是一个参考的定位系统。
(看这部分的时候,如果看不懂,就先将前一篇的文章看一遍,主要就是他这段的处理很高端,没有去操作i而是只关注j
要理解代码的话,要注意两部分循环的作用,每次不同的情况会导致不同位置的循环进行运作,这样就导致了两个字符串的位置变化不统一。


http://blog.csdn.net/chengonghao/article/details/51980519
(这个网站上有公式,但是也有一些小错误,思想还算可以,我自己画了张图,自己写的公式,不算清晰)

字符串匹配算法(1)KMP_第1张图片
自己推导

一开始的时候,我是不太理解为什么,用一个跟匹配算法相似的代码可以求出来 next数组,现在通过理解了这个公式,有了更深的了解。其实,那个生成数组的函数就是让各个段跟自己的开头进行比较,这样就可以得到有多大长度的字符串跟自身相重复。
理解时注意,数组里面的数,指的是如果 j th的数字不匹配,就得到需要匹配的下一个模式字符串的位置。然后继续上述步骤。


这个数组,如果是从另外的角度来讲。
我就是看,后面的字符是不会还有跟我开头一致的内容,然后定位它。本质上这是一个位置定位的问题。
不管是滑动匹配字符串,还是被匹配的字符串,就是定位好一个开始的位置,然后开始继续比较。


你可能感兴趣的:(字符串匹配算法(1)KMP)