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

标签 algorithm performance knuth-morris-pratt

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

最佳答案

这是 KMP 算法的最佳情况。再看看KMP的failure/prefix函数(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 算法的复杂度都是线性的。

关于algorithm - 如果前缀表全为零,KMP 的性能如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45276527/

相关文章:

c++ - 按公共(public)顶部和底部对一对进行排序

java - 如何在android中使用AES减少解密时间

c# - File.AppendText 或 File.WriteAllText 首先存储在 StringBuilder 中,哪个资源消耗更少、速度更快?

algorithm - KMP建表算法

string - 在 O(n) 中找到输入字符串的最小周期?

c++ - 使用 C++ STL 库查找变量模式

java - 对求偶数斐波那契数之和的运行时间感到困惑

python - 计算两个列表之间的相似度

android - android 中自定义 ListView 的性能问题?

java - Java中允许有一处不匹配的KMP算法