• 学习记录---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算法的学习记录,结束.
    给自己的学习记录打卡.


  • 相关阅读:
    JUC锁框架_AbstractQueuedSynchronizer详细分析
    npm的镜像替换成淘宝
    MHA+keepalived集群环境搭建
    Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
    链表中倒数第k个结点
    调整数组顺序使奇数位于偶数前面
    数值的整数次方
    二进制中1的个数
    矩形覆盖
    OS之进程管理---多线程模型和线程库(POSIX PTread)
  • 原文地址:https://www.cnblogs.com/yikecaidechengzhangshi/p/8425572.html
Copyright © 2020-2023  润新知