C++ string::find 复杂度

标签 c++ string algorithm substring time-complexity

为什么 c++ 实现的 string::find() 不使用 KMP algorithm (并且不在 O(N + M) 中运行)并在 O(N * M) 中运行?这在 C++0x 中是否得到纠正? 如果当前查找的复杂度不是O(N * M),那是什么?

那么 gcc 中实现了什么算法呢?是KMP吗?如果不是,为什么? 我已经测试过了,运行时间显示它运行在 O(N * M)

最佳答案

Why the c++'s implemented string::substr() doesn't use the KMP algorithm (and doesn't run in O(N + M)) and runs in O(N * M)?

我假设您的意思是 find(),而不是 substr(),它不需要搜索并且应该在线性时间内运行(并且只是因为它必须将结果复制到一个新字符串中)。

C++ 标准没有指定实现细节,仅在某些情况下指定复杂性要求。 std::string 操作的唯一复杂性要求是 size()max_size()operator[]swap()c_str()data()都是常数时间。其他任何事情的复杂性取决于实现您正在使用的库的人所做的选择。

选择简单搜索而不是 KMP 之类的最可能的原因是避免需要额外的存储空间。除非要找到的字符串很长,并且要搜索的字符串包含很多部分匹配,否则分配和释放所花费的时间可能会远远超过额外复杂性的成本。

Is that corrected in c++0x?

不,C++11 没有对 std::string 增加任何复杂性要求,当然也没有增加任何强制性的实现细节。

If the complexity of current substr is not O(N * M), what is that?

这是最坏情况的复杂性,当要搜索的字符串包含很多长的部分匹配时。如果字符具有合理均匀的分布,则平均复杂度将更接近 O(N)。因此,通过选择具有更好的最坏情况复杂性的算法,您可能会使更典型的情况变得更慢。

关于C++ string::find 复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8869605/

相关文章:

c++ - 我的方法不反转字符数组

c++ - Qt - 在不使用 WA_TranslucentBackground 的情况下在 Windows 中绘制一个完全透明的窗口

c++ - 如何在 C++ 中将字符串作为模板类返回?

Java 正则表达式将字符串和字符与 ' "匹配 '

algorithm - 遍历树叶节点,无需全树遍历

c++ - std::transform 自定义树为新树

c++ - 为什么在使用 std::remove() 从 vector 中删除多个值时会发生跳过?

c - 在 C 中处理多个输入的输出

python - "Three-bonacchi"序列

arrays - 动态规划 : Number of moves to reduce the array to 1 number