zoukankan      html  css  js  c++  java
  • KMP算法:关于各个步骤的疑惑和思考

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

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

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

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

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

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

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

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

     

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

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

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

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

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

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

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

  • 相关阅读:
    Unity3d通用工具类之生成文件的MD5
    Unity3d-Socket之龙一编年史network.dll分析(2)-> CNetLogger
    Unity3d-Socket之龙一编年史network.dll分析(1)
    Unity3d设计模式之单例模式
    c#中的??运算符
    java 字节流
    java File文件操作
    java 线程池和lamda表达式
    java 线程状态(通信/等待/唤醒)
    java 线程安全
  • 原文地址:https://www.cnblogs.com/lqlqlq/p/13084279.html
Copyright © 2011-2022 走看看