KMP算法的相关证明

本文探讨了KMP算法的原理,通过详细分析其匹配过程,揭示了算法背后的关键思想。适合希望深入理解字符串匹配算法的读者。
摘要由CSDN通过智能技术生成

原文发表于饮水思源BBS。


声名在先:我站在巨人的肩膀上,才认识了 KMP 算法。


KMP 算法的思想:
对于一个模式字符串(pattern string),名为 t,要在文本 s 中搜索它的第一个匹配位置。先一个一个字母比较,即 t[0] 和 s[0] 比较,t[1] 和 s[1] 比较,以此类推。当比较结果相等时则进行下一次比较,当比较结果不相等时就要使用特殊方法了:为了提高效率,不让 s[i] 后退。此时,设比较到 t[j] 时不相等,而 t[0] .. t[j - 1] 都已经经过了比较,并且都是相等的。现在就要把 j 向前移动到这样的一个位置 k,这个位置之前的字符,t[0] .. t[k - 1] 与 t[j - k] .. t[j - 1] 是相等的,并且 k 要尽量大,然后再继续比较 t[k] 与 s[i] 是否相等。如果不存在这样一个有效的位置 k,那么让 j = 0 并且 i 增加 1。

这里要注意两个条件:一,k 要尽量大;二,继续从 t[k] 与 s[i] 比较。这是为什么呢?k 如果不是尽量大,比如现在有且仅有 k1 与 k2,k1 满足 0 <= k1 < t,且 t[0] .. t[k1 - 1] 等于 t[j - k1] .. t[j - 1],k2 也同样满足这样的条件,并且 k2 > k1。如果要满足尽量大的条件,应该用 k2。但是如果不用满足这样的条件,我们用 k1 的话,会出现什么情况?设 t 的长度为 m,若 s[i] .. s[i + m - k2 - 1] 等于 t[k2] .. t[m - 1],则从 t[k2] 开始与 s[i] 匹配整个搜索将成功。现在不从 k2 开始而从 k1 开始,就跳过了这样的位置,就算匹配成功也不是在 s 中第一个匹配了。因此 k 要尽量大。如果取的数不满足 t[0] .. t[k - 1] 等于 t[j - k] .. t[j - 1] 怎么办?那么前面 s[i - k] .. s[i - 1] 就与 t[0] .. t[k - 1] 不相等了。这就不符合搜索的意义了。

然后,认清了这个条件,就可以把这条件简单地说了:当 t[j] 与 s[i] 不相等时,让 j = k,此 k 是 t[0] .. t[j - 1] 所有真前缀(不等于整个字符串的前 r 个字符组成的字符串)与真后缀(类似真前缀的定义)相等的对(pair)中字符串最长的一对的字符串长度。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
KMP算法正确性证明可以通过数学归纳法来进行。下面是证明的步骤: 1. 基本情况:当模式串为空时,任何字符串都可以匹配成功,所以KMP算法是正确的。 2. 假设在长度为n的文本串T中,已经找到了一个位置i,使得T[i-n+1...i]与模式串P[1...n]匹配。我们要证明,如果T[i+1]与P[n+1]不匹配,那么存在一个位置j,使得T[j-n+1...j]与P[1...n]匹配,并且j > i。 3. 根据KMP算法的思想,当T[i+1]与P[n+1]不匹配时,我们需要找到一个位置k,使得T[i-k+1...i]与P[1...k]匹配,并且k < n。这是因为,如果T[i-k+1...i]与P[1...k]匹配,那么T[i-k+1...i]与P[1...n]的前k个字符也是匹配的。 4. 假设在位置i-k+1到i之间存在一个位置m,使得T[m-k+1...m]与P[1...k]匹配,并且m > i。根据KMP算法的定义,我们可以得到π[k] = m-k+1。 5. 现在我们要证明,如果T[i+1]与P[n+1]不匹配,那么存在一个位置j,使得T[j-n+1...j]与P[1...n]匹配,并且j > i。根据KMP算法的定义,我们有π[n] = j-n+1。 6. 根据假设,我们知道T[i-k+1...i]与P[1...k]匹配,所以T[i-k+1...i]与P[1...n]的前k个字符也是匹配的。根据π[k] = m-k+1,我们可以得到T[m-k+1...m]与P[1...n]的前k个字符也是匹配的。 7. 因为T[m-k+1...m]与P[1...n]的前k个字符是匹配的,所以T[m-k+1...m]与P[1...n]也是匹配的。根据π[n] = j-n+1,我们可以得到T[j-n+1...j]与P[1...n]也是匹配的。 8. 综上所述,如果T[i+1]与P[n+1]不匹配,那么存在一个位置j,使得T[j-n+1...j]与P[1...n]匹配,并且j > i。 根据上述证明,我们可以得出结论:如果在文本串T中找到了一个位置i,使得T[i-n+1...i]与模式串P[1...n]匹配,那么KMP算法可以正确地找到所有的匹配位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值