KMP算法的最佳和最差时间复杂度是多少

问题描述

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

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

解决方法

KMP永远不会在不增加i的情况下增加j。因此,即使在i的每个增量之间可以存在j的Theta(m)减量,在算法过程中j的减量总数也不能超过j的增量总数,该总数等于增量的数目我的全部都是Theta(n),即KMP的最坏情况和最佳情况渐近运行时间(假设我们找到了所有匹配项;如果没有找到,则显然最佳情况是Theta(m))。

,

大卫的答案是正确的。您需要先匹配j。然后,j值将增加并大于零。之后,您可以减小j值。 当您增加j时,您也在增加i。因此,如果将j索引递减n次,则意味着您已经至少将j索引递增了n次,这又意味着您已经将i index递增了n次。至此,您已经遍历了文本。

因此,时间复杂度将为n个负步长+ n个正步长= 2n个步长。那就是O(n)。

您可以查看此链接http://www.w3spot.com/2020/07/kmp-algorithm-explained-in-plain-english.html,其中包含几个示例,其中一个具有重复模式,一个具有非重复模式,逐步说明了该链接。而且很容易理解。

,

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

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

enter image description here

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

enter image description here

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

enter image description here

n/m 是多少不匹配。

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