KMP算法的相关证明

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文发表于饮水思源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)中字符串最长的一对的字符串长度。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值