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


  • 相关阅读:
    在IDEA通过Maven构建Scala项目
    6.Pair RDD操作
    5.RDD的Action操作和持久化persist()
    29.Spark SQL发展史
    AirFlow初始化的时候遇到 Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql
    4.RDD操作之Transform
    3.RDD详解和创建RDD方式
    28.Spark中action的介绍
    2.Spark 2.x 集群部署和测试
    Repeater分页
  • 原文地址:https://www.cnblogs.com/yikecaidechengzhangshi/p/8425572.html
Copyright © 2011-2022 走看看