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

标签 c visual-studio gcc strstr

我知道有快速的字符串搜索算法,比如 Boyer–MooreKnuth–Morris–Pratt ,复杂度为 O(n+m),而简单的解决方案为 O(n*m)。

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

最佳答案

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

AFAIK MSVC 运行时以最简单的方式执行 strstr,复杂度为 O(n*m)。但是蛮力不需要额外的内存空间,所以它永远不会引发错误的分配异常。 KMP 需要 O(m) 额外空间,Two-Way 需要常数额外空间。

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

关于c - strstr() 在 gcc 和 VS 中的实现是否具有线性复杂度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22804988/

相关文章:

c++ - MS Visual Studio 问题?

c - 如何逐位打印一个数字?

当连接到服务器的新端口套接字时,客户端总是被拒绝连接

c - printf 覆盖看似不相关的数据?

.net - WinUI3 应用程序抛出异常 - 我错过了什么?

c# - 如何使用 C# 在 Windows 窗体中显示 MSSQL 中的实时查询统计启用的执行查询百分比?

c - 为什么我的C程序生成的机器代码与书中给出的不同?

c++ - gcc ld : method to determine link order of static libraries

gcc - 如何使用 pip 安装特定版本的包

c++ - 这两段代码有何不同?