strstr()在gcc和VS中的实现是否具有线性复杂性?

时间:2014-04-02 07:58:59

标签: c visual-studio gcc strstr

我知道有快速字符串搜索算法,如Boyer–MooreKnuth–Morris–Pratt,它们具有O(n + m)复杂度,而普通解决方案则为O(n * m)。< / p>

对于最流行的工具链(gcc和Visual Studio),strstr()的实现是使用这些快速的O(n)算法,还是使用简单的解决方案?

1 个答案:

答案 0 :(得分:4)

GCC的运行时库使用Two-Way Algorithm,在最坏的情况下执行2n-m文本字符比较。它在搜索阶段是O(n)复杂度,但它需要额外的预处理阶段,即O(m)复杂度。您可以在http://www-igm.univ-mlv.fr/~lecroq/string/node26.html上找到有关算法的详细信息。

AFAIK MSVC运行时以最简单的方式执行strstr,复杂度为O(n * m)。但是暴力不需要额外的内存空间,因此它永远不会引发错误的alloc异常。 KMP需要O(m)额外空间,而双向需要一个恒定的额外空间。

GCC正在做什么听起来就像使用FFT来计算乘法。在纸上看起来非常快,但在练习中确实很慢。 MSVC将在strstr中使用SIMD指令,因为它们可用,因此在大多数情况下速度更快。如果我要编写自己的库,我会选择使用SIMD的强力方法。