码迷,mamicode.com
首页 > 编程语言 > 详细

KMP算法入门

时间:2017-08-20 21:21:09      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:部分   ber   http   直接   number   src   can   算法   layout   

 

学一把看毛片算法我觉得自己才能变得更加出色

明明昨天的题我都知道怎么模拟了,但是还是不会改KMP,是我学丑了

KMP是Knuth-Morris-Pratt三人设计的线性时间字符串匹配算法

nxt数组的介绍,卧槽,直接找到太爽啦

技术分享

 技术分享

 

就是我匹配的时候是可以回退的,因为字符的肯能性有限

比如aaaaaaaaab和aaaab进行匹配,aaaab是模式串,aaaaaaaaab是匹配串,我就不用回退那么多次数,因为及时往下推就好了

我匹配了一部分我就能回退到一定的位置

下面是一段演示

我用的求前缀函数

void pre(char *p)
{
    int i,m,j;
    m=strlen(p);
    nex[0]=nex[1]=0;
    for(int i=1; i<m; i++)
    {
        j=nex[i];
        while(j&&p[i]!=p[j])j=nex[j];
        nex[i+1]=p[i]==p[j]?j+1:0;
    }
}

aaaab

0 0 1 2 3

aba

0 0 0

伪代码

KMP-MATCHER(T, P)
 1 n length[T]
 2 m length[P]
 3 π ← COMPUTE-PREFIX-FUNCTION(P)
 4 q ← 0                          ?Number of characters matched.
 5 for i ← 1 to n                 ?Scan the text from left to right.
 6      do while q > 0 and P[q + 1] T[i]
 7             do q π[q]    ?Next character does not match.
 8         if P[q + 1] = T[i]
 9            then q q + 1      ?Next character matches.
10         if q = m                    ?Is all of P matched?
11            then print "Pattern occurs with shift" i - m
12                 q π[q]    ?Look for the next match.
COMPUTE-PREFIX-FUNCTION(P)
 1 m length[P]
 2 π[1] ← 0
 3 k ← 0
 4 for q ← 2 to m
 5      do while k > 0 and P[k + 1] P[q]
 6             do k π[k]
 7         if P[k + 1] = P[q]
 8            then k k + 1
 9         π[q] k
10 return π

KMP算法入门

标签:部分   ber   http   直接   number   src   can   算法   layout   

原文地址:http://www.cnblogs.com/BobHuang/p/7401125.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!