【发布时间】:2021-07-02 06:50:11
【问题描述】:
find() 或 binary_search() 中的哪个函数在向量中搜索元素的效率更高?
【问题讨论】:
标签: c++ stl binary-search
find() 或 binary_search() 中的哪个函数在向量中搜索元素的效率更高?
【问题讨论】:
标签: c++ stl binary-search
当你不确定数据是否排序时,你必须使用find(),如果数据要排序,你应该使用binary_search()。
更多信息,您可以参考find()和binary_search()
【讨论】:
简单的答案是: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::set、std::map 等容器或它们的无序对应物,还可以考虑使用它们的内置方法,如 std::set::find
【讨论】:
如果您的输入已排序,那么您可以使用 binary_search,因为它需要 O(lg n) 时间。如果您的输入未排序,您可以使用 find,这将花费 O(n) 时间。
【讨论】: