【问题标题】:Time Complexity of find operation [duplicate]查找操作的时间复杂度
【发布时间】:2012-11-27 19:20:05
【问题描述】:

可能重复:
C++ string::find complexity

STL中字符串库自带的查找操作的时间复杂度是多少?

【问题讨论】:

  • N3485 §21.4.7.2 如果你想查的话。
  • @chris:告诉你的只是标准没有指定任何复杂性要求。
  • 我没有得到你的参考。我的意思是它指的是一些文档吗?我用谷歌搜索了它,但它只让我回到这个问题。
  • @MikeSeymour,这就是重点。当标准没有给出复杂度值时,你不能为函数取值。

标签: c++ stl


【解决方案1】:

标准第 21.4.7.2 节并未就复杂性提供任何保证。

您可以合理地假设std::basic_string::find 在搜索字符串的长度上花费线性时间,因为即使是简单的算法(检查每个子字符串是否相等)也具有这种复杂性,而且std::string 构造函数不太可能将构建一个花哨的索引结构,以实现比这更快的任何东西。

根据实现的不同,所搜索模式的复杂性可能会在线性和常数之间合理变化。

【讨论】:

    【解决方案2】:

    正如 cmets 中指出的那样,标准没有指定。

    但是,由于std::string 是一个通用容器,它不能对它所包含的字符串的性质做出任何假设,因此您可以合理地假设复杂性将是O(n),以防您搜索单个@ 987654324@.

    【讨论】:

    • 但是如果我想匹配一个子字符串,它仍然是线性的吗?
    • 它将是线性的,但不是O(n),而是O(n*m),其中m 是要匹配的子字符串的长度
    • 所以我可以只使用 str.find 而不是说实现 KMP 算法来搜索子字符串?
    • 您的实施可能已经使用 KMP。先检查一下。如果它没有并且性能很关键,那么一定要自己动手
    • 请注意,Boost 具有可供您使用的 Boyer-Moore、Boyer-Moore-Horspool 和 Knuth-Morris-Pratt 搜索算法。见boost.org/doc/libs/1_52_0/libs/algorithm/doc/html/algorithm/…
    【解决方案3】:

    最多执行与 [first,last) 范围内的元素数量一样多的比较。

    http://cplusplus.com/reference/algorithm/find/

    【讨论】:

    • 再一次,这是关于std::string::find
    猜你喜欢
    • 1970-01-01
    • 2015-03-03
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    相关资源
    最近更新 更多