4

需要澄清 KMP 算法的最佳时间复杂度和最差时间复杂度。令我困惑的是 O(n) 的最差搜索时间复杂度。网上看了下才明白是有两个索引。一个索引 i 用于文本,另一个索引 j 用于模式。而且我们不会减少文本索引 i。但是当存在不匹配且 j 值大于 0 时,我们会减少模式索引 j。在这种情况下,i 保持不变。那么最坏的时间复杂度怎么可能是 O(n) 呢?它应该比 O(mn) 更多。对于 i 的特定值,我们可以对 j 进行多次迭代。

还有什么是最好的情况?它与最坏的情况不同吗?我正在寻找简单的解释,因为我已经阅读了不同的教程。

4

3 回答 3

4

KMP 不会在不增加 i 的情况下增加 j。因此,即使在 i 的每个增量之间可能有 j 的 Theta(m) 减量,在算法过程中 j 的减量总数不能超过 j 的增量总数,这等于增量的数量一世。所有都是 Theta(n),KMP 的最坏和最好情况的渐近运行时间(假设我们找到所有匹配项;如果没有,那么显然最好的情况是 Theta(m))。

于 2020-09-13T12:58:46.247 回答
3

大卫的回答是对的。您需要先匹配 j 。然后 j 值将增加并大于零。之后,您可以减少 j 值。当你增加 j 时,你也在增加 i。因此,如果您将 j 索引减少 n 次,这意味着您已经至少将 j 索引增加了 n 次 & 这反过来意味着您已经将 i 索引增加了 n 次。这样你就完成了对文本的遍历。

所以时间复杂度将是 n 个负步骤 + n 个正步骤 = 2n 个步骤。那是O(n)。

您可以查看此链接http://www.w3spot.com/2020/07/kmp-algorithm-explained-in-plain-english.html它通过几个示例逐步解释它,一个具有重复模式和一个与非重复模式。它很简单,可以理解。

于 2020-09-13T19:11:15.160 回答
0

假设我们在字符串 s 中搜索字符串 p,每个的长度是 m 和 n。

最好的例子,显然是 O(m)

在此处输入图像描述

但是如果 p 不在 s 中,最好的情况应该是,一旦不匹配,p 尽可能右移,搜索阶段的成本为 O(n + n/m)。

在此处输入图像描述

最坏的例子,一旦不匹配,p 向右移动非常保守,搜索阶段的成本为 O(n + (m-1) * (n/m))。

在此处输入图像描述

其中 n/m 是多少不匹配。

而且,加上预处理阶段,在最好和最坏的情况下,总时间成本仍然是 O(m+n)。

于 2021-03-05T05:18:50.017 回答