当存在 [1] 这样的现象,[2] 这样的做法,是否合理以及正确,或者有 [1] 这样的现象,为什么就可以有 [2] 这样的做法 ?
算法思想
[1] 当主串的第i个字符与子串的第j个字符失配时,若子串的前(k-1)个字符和子串的后(k-1)个字符匹配,‘p1……pk-1’=‘pj-k+1……pj-1’,则只需主串 S 的第 i 个字符与子串 P 的第 k 个字符开始向后比较即可,i 不必回溯。
[2] k的值只与子串的组成有关,而与主串无关,即 k 值与 j 失配位置之前的子串的结构相关,每一个 j 位置对应一个k值,用next[j]存储,表示当模式串中第 j 个字符与主串中第 i 个字符失配时( Si ≠ Pj) ,下一次模式串 P 中第next[j]个字符与主串 S 的第i个字符比较。
简而言之
若子串中,‘p1……pk-1’=‘pj-k+1……pj-1’,则在 j 处的失配,i 不回溯,直接和子串的 k 位置比较即可,k位置用 next[j] 存储。
问题提出
其实,算法思想中[1]是现象,也就是子串中需要存在这样的前后缀相等时,[2]是做法,表示在失配的位置 j ,模式串应该向右滑动 k 距离。那么当存在这样的现象,这样的做法,是否合理以及正确?或者有 [1] 这样的现象,为什么就可以有 [2] 这样的做法 ?很多地方的讲解都是利用这样的做法去解释现象,或者因为有这样的现象,就可以有这样的做法,没有揭露根本的本质原因,发现自然规律,然后利用自然规律去做一件巧妙的事情得到了很好的结果,但还是要解释清楚这样的这样的规律是如何带来这样巧妙的结果的。
数学证明
[1] 朴素的串匹配算法
[2] KMP算法证明
来源:CSDN
作者:学习CV的菜鸟
链接:https://blog.csdn.net/qq_40263477/article/details/104561573