学习记录---KMP算法-部分匹配表理解

如需转载,请保留本文链接.

看了 阮一峰 大神的字符串匹配的KMP算法后,关于部分匹配的部分并不是很理解,特意去看了阮大神文章中的英文链接,这里写下自己的理解,用作学习记录.

阮大神文章链接:https://kb.cnblogs.com/page/176818/

Jake Boxer 英文博文链接:http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/

 

关于前缀和后缀的定义,这里忽略不提.

一.部分匹配表定义

引用Jake Boxer博文中原句为:The length of the longest proper prefix in the (sub)pattern that matches a proper suffix in the same (sub)pattern.

个人理解为:最长的前缀及其子集与最长的后缀及其子集的匹配结果.

通俗的说:将所有的前缀与其对应的后缀进行比对,将比对结果保存下来,这个表就叫做部分匹配表.

那么部分匹配表是如何计算出来的,下面进行解释

二.计算得到部分匹配表

1.设主串为:abababca 长度为8;

2.将前缀与后缀进行比对: 

①子串长度为1时,子串为:a,前后缀不存在,部分匹配表结果为:
|a|b|a|b|a|b|c|a|
|0|
②子串长度为2时,子串为:ab,前后缀完全相等匹配次数为:0,部分匹配表结果为:
前缀为:a;
后缀为:b;
|a|b|a|b|a|b|c|a|
|0|0|
③子串长度为3时,子串为:aba,前后缀完全相等匹配次数为:1,那么此时部分匹配表结果为:
前缀为:a;ab;
后缀为:a;ba;
前缀的a与后缀的a相同,此时完全匹配次数为1;
|a|b|a|b|a|b|c|a|
|0|0|1|
④子串长度为4时,子串为:abab,前后缀完全像顶匹配次数为:1
前缀为:a;ab;aba;
后缀为:b;ab;bab;
前缀的ab与后缀的ab相同,此时完全匹配次数为:2,理由是:完全匹配的字符串长度为:2
|a|b|a|b|a|b|c|a|
|0|0|1|2|
通过同样的原理,计算其他子串匹配结果,一下为子串长度为7时结果;
长度为7的子串:abababc
前缀:a;ab;aba;abab;ababa;ababab;
后缀:c;bc;abc;babc;ababc;bababc;
完全匹配次数为:0
|a|b|a|b|a|b|c|a|
|0|0|1|2|3|4|0|
最后进行一次完整长度串的匹配:
前缀:a;ab;aba;abab;ababa;ababab;abababc;
后缀:a;ca;bca;abca;babca;ababca;bababca;
完全匹配次数为:1

得到完整的部分匹配表为:
|a|b|a|b|a|b|c|a|
|0|0|1|2|3|4|0|1|

先给自己立一个Flag,督促自己写KMP算法的学习记录,结束.
给自己的学习记录打卡.


posted @ 2018-02-07 20:24  一颗菜的成长史  阅读(1401)  评论(0编辑  收藏  举报