• KMP算法:关于各个步骤的疑惑和思考


    KMP看书是很难懂的......相信我,推荐一个易懂视频

    https://www.bilibili.com/video/BV1jb411V78H?from=search&seid=9395428282072905815

    1.为什么只用研究模式串?因为发生不匹配时,模式串当前下标之前的内容和被查找串的内容是相同的。

    2.为什么移动方法不是下面的移动法1,而是移动法2?移动法1的思路是:既然原初不匹配情况下,当前位置之前有相同的前缀(黄色和红色),那么可以直接在开头跳过对红色部分的检索,因为黄色部分已经匹配了,红黄相同就可以直接跳过。

    因为移动法1是在被查找串中查找模式串的一部分而已,而不是在被查找串里搜索模式串

    3.上述的移动法2,不会跳过可能匹配的部分么?

    之前我们说过,只用研究模式串,在原初不匹配情况下,当前位置之前的内容和被查找串对应部分是相同的。

    那么就假设红色部分之前可能有匹配的部分吧,但是一个字符一个字符地移动串,会发现如果匹配的话,必须要和黄色部分相同才行,而和黄色部分相同的,也只有红色部分了。

     

     4.为什么红色部分的末尾是挨着当前位置的(出现不匹配情况的下标)?

    假设不是挨着的,如下图,从前往后找,找到一个和红色部分匹配的红色部分。

    秉承红色的已经匹配了,那么黄色的就不用比较了的思想(黄色和红色相同),把黄色部分移到红色部分。

    直接接着比较的话,就会有遗漏,而被遗漏的部分不一定和模式串相同

    5.为什么要找最长的公共前缀?

     因为如果找的不是最长前缀,那么可能跳过匹配的情况,比如下图直接找 黄色和红色做为公共前缀并且移动的话,就跳过了绿色的B,违背了

     上述的 第3点 :移动过程中不能有和模式串开头相同的部分。

  • 相关阅读:
    python PyQt5
    传入一张图,生成它的油画版!(python实现)(转 )
    Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)(转)
    Python3.7实现自动刷博客访问量(只需要输入用户id)(转)
    Python3 多线程的两种实现方式
    图片生成字符
    SqlServer性能优化 通过压缩与计算列提高性能(十一)
    json与bson的区别
    浅析Redis 和MongoDB
    Solr DocValues详解
  • 原文地址:https://www.cnblogs.com/lqlqlq/p/13084279.html
Copyright © 2020-2023  润新知