串的模式匹配 : KMP算法

巧了我就是萌 提交于 2020-02-28 21:09:03

当存在 [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算法证明

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!