当速度是他/她项目的关键标准时,如何搜索std :: set?
复杂度:
对数大小。
复杂度:
平均值,第一个和最后一个距离的对数:执行大约log2(N)+2个元素比较(其中N是此距离)。 在非随机访问迭代器上,迭代器进展产生了平均N的额外线性复杂度。
只是他/她实施的二元搜索(如this一个)?或者STL的那个还不错?
有没有办法在理论上回答这个问题?或者我们要测试自己?如果有人,如果他会与我们分享这些信息会很好(如果不是,我们不会懒惰:))。
答案 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
仅访问目标节点的祖先。