【发布时间】: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