搜索std :: set的最佳方法

时间:2014-09-15 00:22:28

标签: c++ algorithm c++11 stl set

当速度是他/她项目的关键标准时,如何搜索std :: set?

set:find

复杂度:

对数大小。

std::binary_search

复杂度:

平均值,第一个和最后一个距离的对数:执行大约log2(N)+2个元素比较(其中N是此距离)。 在非随机访问迭代器上,迭代器进展产生了平均N的额外线性复杂度。

只是他/她实施的二元搜索(如this一个)?或者STL的那个还不错?

有没有办法在理论上回答这个问题?或者我们要测试自己?如果有人,如果他会与我们分享这些信息会很好(如果不是,我们不会懒惰:))。

2 个答案:

答案 0 :(得分:4)

std::set提供的迭代器类型是bidirectional_iterator,这个类别不需要随机访问元素,但只能在两个方向上进行元素移动。所有random_access_iterator都是bidirectional_iterator s,但反之亦然。

std::binary_search上使用std::set因此可以根据您引用的备注生成O(n)运行时,而std::set::find已保证O(logn)

所以要搜索set,请使用set::find

答案 1 :(得分:1)

std::set不太可能有随机访问迭代器。即使它确实如此,std::binary_search将至少访问与.find一样多的节点,因为.find仅访问目标节点的祖先。