为什么 std::upper_bound() 具有线性复杂度?

Abd*_*sar 2 c++ performance binary-search time-complexity upperbound

我正在阅读 USACO Silver 上有关排序集的指南,我遇到了这个警告sstd::set整数):

警告
假设我们替换s.upper_bound(7)upper_bound(begin(s),end(s),7),这是我们在先决条件模块中用于向量的语法。这仍然会输出预期的结果,但它的时间复杂度与集合的大小是线性的s,而不是对数的,所以一定要避免它!

他们的意思是什么 ?

   upper_bound(s.begin(), s.end(), 7 ); // O(n) ?
   s.upper_bound(7);                    // O(log N) ?
Run Code Online (Sandbox Code Playgroud)

Ted*_*gmo 9

这是因为 astd::set不支持随机访问迭代器。为了得到 ,a算法a + 200就必须增加a200 倍。

因此,std::set具有查找upper_boundlower_bound高效的成员函数。

  • @AbdullahKassar 在最好的情况下是的。O(N) 总是最坏的情况。但是具有非随机内存访问的容器使其成本更高,因此可以访问容器内部工作的实现对于这些来说是更可取的(这实际上在 cppreference 上有注释,我相信标准中有这样的注释)。想象一下试图在链表中找到上限? (3认同)
  • @KellyBundy 通过访问容器的随机第 i 个元素 N 次的成本,这不会是恒定的。map\multimap\set 的封装实现可以利用排序性质并能够达到结构的随机访问表示。如果我们不想查看整个容器,那就大问题了。 (2认同)