如果前缀表全为零,KMP的性能如何?

时间:2017-07-24 09:10:20

标签: algorithm performance knuth-morris-pratt

如果我的模式是" Brudasca",那么KMP前缀表将全部归零。在这种情况下,KMP和普通解决方案之间是否有任何性能差异? 这不是O(n * m)的最坏情况吗?

1 个答案:

答案 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算法的复杂性都是线性的。