搜索std::集的最佳方式

Optimal way to search a std::set

本文关键字:最佳 方式 std 搜索      更新时间:2023-10-16

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

set:查找?

复杂性:

大小为对数。

std::binary_search?

复杂性:

平均而言,第一个和最后一个之间的距离为对数:执行大约log2(N)+2个元素比较(其中N是此距离)。在非随机访问迭代器上,迭代器的进步平均会给自己带来N的额外线性复杂度。

只是他/她实现的二进制搜索(比如这个)?或者STL的已经足够好了?

有没有办法从理论上回答这个问题?或者我们必须测试自己?如果有人有,如果他能与我们分享这些信息就太好了(如果没有,我们并不懒惰:)。

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

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

因此,要搜索set,请使用set::find

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