kmp算法的思考与白话解释,一看就懂

旧街凉风 提交于 2019-11-30 06:08:55

这是一个判断字符串A是否包含在B中的问题,

比如(A)     "abgab"      与(B)        "abcabf abgab "       

kmp的思路是先分析要匹配的字符串A的内在结构特点 ,做出一张表格记录他的内部特征,然后匹配的时候就可以根据这个字符串的特征查询已经匹配的信息,对B跳跃式的比较,具体比较方法后面在说,先看看他怎么分析特征的.

abgab的特征计算方法:

1,为每一个子串计算前缀与后缀相匹配的最大字符长度

前缀就是从第一个字符开始的一系列子串,但不包含A字符串的最后一个字符

后缀类似,但是不包含A字符串的第一个字符

那么可以得到一张静态的字符串的特征表

       

那么到这里A字符串的特征就分析完了

怎末用呢?

一个公式如下:

下一次要跳跃到的地址=上一次匹配的开始地址+(已经匹配的长度-A字符串在B字符串中最后一个匹配的字串的特征值)

比如:上面我举得栗子:

abcabf abgab          (B)

abgab                       (A)

这里写出步骤:

1:位置0,从第一字符开始: c与g比较失败,因为已经匹配的ab特征值为0,长度为2,要跳到的地址=0+(2-0)  , 此时A从0开始到B字符串上的c开始比较

2:位置为2,c与g不匹配,那么向后继续走到下一个字符 --a,

3:  位置3,f与g比较失败,因为已经匹配的ab特征值为0,长度为2,下一个地址=3+(2-0),A字符串下一个比较的地址为5

4:位置5,f与a不匹配,向后继续走

5:位置6,空格与a不匹配,向后继续走

6:位置7,逐一字符比较成功

 

 

kmp算法的进阶计算:nextval数组

1.先计算出A字符串的特征数值,一般称为next值

2,根据当前指的字符的特征数值进行跳转,如果跳转到的next值所指的字符与当前一致,就将当前所指的字符的nextval数值置0,否则nextval就等于当前字符的next数值

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!