【问题标题】:find() vs binary_search() in STLSTL 中的 find() 与 binary_search()
【发布时间】:2021-07-02 06:50:11
【问题描述】:

find()binary_search() 中的哪个函数在向量中搜索元素的效率更高?

【问题讨论】:

    标签: c++ stl binary-search


    【解决方案1】:

    当你不确定数据是否排序时,你必须使用find(),如果数据要排序,你应该使用binary_search()

    更多信息,您可以参考find()binary_search()

    【讨论】:

      【解决方案2】:

      简单的答案是:std::find 用于未排序的数据,std::binary_search 用于排序的数据。但我认为还有更多:

      这两种方法都采用范围[start, end)n 元素和一个值x 作为输入。但请注意std::binary_search 仅返回一个bool 的重要区别,它告诉您该范围是否包含该元素。 std::find() 返回一个迭代器。所以两者都有不同但重叠的用例。


      std::find() 非常简单。 O(n) 迭代器递增和O(n) 比较。输入数据是否排序也无关紧要。


      对于std::binary_search(),您需要考虑多个因素:

      • 它仅适用于已排序的数据。您需要考虑排序成本。

      • 比较次数始终为O(log n)

      • 如果迭代器不满足LegacyRandomAccessIterator,则迭代器增量的数量为O(n),当它们满足此要求时,它将是对数。


      结论(有点自以为是):

      • 当您对未排序的数据进行操作或需要您搜索的项目的位置时必须使用std::find()
      • 当您的数据已经排序或无论如何都需要排序并且您只想检查某个元素是否存在时,请使用std::binary_search()
      • 如果您想搜索 std::setstd::map 等容器或它们的无序对应物,还可以考虑使用它们的内置方法,如 std::set::find

      【讨论】:

        【解决方案3】:

        如果您的输入已排序,那么您可以使用 binary_search,因为它需要 O(lg n) 时间。如果您的输入未排序,您可以使用 find,这将花费 O(n) 时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-16
          相关资源
          最近更新 更多