最近,在解决 C++ 编程问题时,我发现了一些有趣的东西。我的算法使用了一个非常大的集合,并且会在它上面大量使用 std::lower_bound。然而,尽管我在纸上做了数学推导来证明我的代码足够快,但提交后却变得过于缓慢。代码大致如下:
using namespace std;
set<int> s;
int x;
//code code code
set<int>::iterator it = lower_bound(s.begin(),s.end(),x);
然而,在得到一个朋友使用set::lower_bound的提示后,所讨论的算法比之前快得多,并且符合我的数学推理。在更改后进行的二分查找:
set<int>::iterator it = s.lower_bound(x);
我的问题是这两者之间有什么区别?为什么一个比另一个要快得多?lower_bound不是应该是具有O(log2(n))的复杂度的二分查找函数吗?但在我的代码中,它的速度比这慢得多。