【发布时间】:2015-10-27 14:32:38
【问题描述】:
最近,在处理 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 的提示后,该算法的运行速度比以前快了 waaaaaaaay,而且它遵循了我的数学计算。修改后的二分查找:
set<int>::iterator it = s.lower_bound(x);
我的问题是这两者有什么区别?为什么一个工作得比另一个快得多? lower_bound 不应该是复杂度为 O(log2(n)) 的二进制搜索函数吗?在我的代码中,它最终比这慢得多。
【问题讨论】:
-
如果这是某种竞赛问题,请注意,您将始终希望利用 set 中的 lower_bound 而不是通用的(几乎总是会更慢)
标签: c++ algorithm c++11 std binary-search