如果我的模式是" Brudasca",那么KMP前缀表将全部归零。在这种情况下,KMP和普通解决方案之间是否有任何性能差异? 这不是O(n * m)的最坏情况吗?
答案 0 :(得分:2)
这是KMP算法的最佳案例。让我们看一下KMP的失败/前缀功能(KMP-search有类似的逻辑):
int curLen = 0;
for (int i = 1; i < len; ++i) {
while (curLen > 0 && s[curLen] != s[i])
curLen = prefixFunc[curLen - 1];
if (s[curLen] == s[i])
++curLen;
prefixFunc[i] = curLen;
}
每次迭代的主要复杂性是在while循环中。在此循环中,算法尝试查找具有最大长度的正确前缀。当我们的前缀表中充满了零时,那么这个while循环最多只能有一次迭代。这意味着没有合适的子前缀,我们应该从头开始。 О整体复杂性将是线性的。
一般来说,无论输入数据如何,KMP算法的复杂性都是线性的。