zoukankan      html  css  js  c++  java
  • 学习记录---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算法的学习记录,结束.
    给自己的学习记录打卡.


  • 相关阅读:
    CodeForces 219D Choosing Capital for Treeland (树形DP)
    POJ 3162 Walking Race (树的直径,单调队列)
    POJ 2152 Fire (树形DP,经典)
    POJ 1741 Tree (树的分治,树的重心)
    POJ 1655 Balancing Act (树的重心,常规)
    HDU 2196 Computer (树形DP)
    HDU 1520 Anniversary party (树形DP,入门)
    寒门子弟
    JQuery选择器(转)
    (四)Web应用开发---系统架构图
  • 原文地址:https://www.cnblogs.com/yikecaidechengzhangshi/p/8425572.html
Copyright © 2011-2022 走看看