【问题标题】:What is the best & worst time complexity Of KMP algorithmKMP算法的最佳和最差时间复杂度是多少
【发布时间】:2020-09-13 04:28:23
【问题描述】:

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

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

【问题讨论】:

  • 我认为您需要包含您正在谈论的算法的伪代码。 wikipedia 上的 KMP 算法的伪代码没有两个嵌套循环,因此很难理解您的问题的具体内容,并且您可能描述了错误的算法(可能是天真的搜索而不是 KMP?)
  • KMP 的最佳情况是 O(k),其中 k 是搜索词的长度,当要搜索的字符串长度为 0 时发生。它是 O(k),因为搜索表仍将被构建。导致正匹配的 KMP 的最佳情况仍然是 O(k),并且当要在内部搜索的字符串以搜索词开头时发生(它可以是任何长度)。
  • 对不起。我的意思是我们有两个索引,一个用于文本,一个用于模式。我知道我们没有两个循环。我已经更新了我的问题。也理解了你提到的基本情况。谢谢@PaulHankin

标签: algorithm pattern-matching knuth-morris-pratt


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    大卫的回答是对的。您需要先匹配 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,该链接通过几个示例逐步解释,一个具有重复模式,一个具有非重复模式。而且简单易懂。

    【讨论】:

    • 我明白你们想要指出的内容。但只有当我检查链接时它才得到澄清。具体的例子确实有帮助。谢谢。
    【解决方案3】:

    假设我们在字符串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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多