C++ STL性能O(ln(n))问题

C++ STL性能O(ln(n))问题,c++,performance,stl,big-o,C++,Performance,Stl,Big O,请有人解释一下: 如果文件上说STL std::vector finding element speed performace=O(ln(n)), 这是什么意思 O(ln(n))-什么是“O”,我可以在哪里读到 在那里我可以了解到其他STL容器的性能 非常感谢Big-O表示法是关于程序性能的时间复杂性 所以O(ln(n))意味着当向量变大时,访问std::vector中的元素与ln(向量的大小)成正比,但这只适用于使用二进制搜索的排序向量。二进制搜索执行速度比线性搜索快,因为消除可能元素的速度是

请有人解释一下:

如果文件上说STL std::vector finding element speed performace=O(ln(n)), 这是什么意思

O(ln(n))
-什么是“O”,我可以在哪里读到

在那里我可以了解到其他STL容器的性能


非常感谢

Big-O表示法是关于程序性能的时间复杂性

所以O(ln(n))意味着当向量变大时,访问std::vector中的元素与ln(向量的大小)成正比,但这只适用于使用二进制搜索的排序向量。二进制搜索执行速度比线性搜索快,因为消除可能元素的速度是线性搜索的两倍,因此ln实际上是一个以2为基数的对数

是一种测量算法将如何随着其工作的数据大小的增长而扩展的方法

如果一个向量通常是
O(n)
,那么当对向量进行排序时,它只有
O(lg(n))
,并且使用其中一个

每个算法的复杂度在标准和任何参考文献中都有规定(如上面链接到
std::lower_bound

顺便说一句,
ln
是以
e
为基数的
log
,但是所有的对数都是相同的复杂性,所以即使二进制搜索只执行
lg
(log2)操作,从技术上讲,说它是
O(ln(n))
O是正确的。它描述了算法的运行时复杂性。本质上,它是计算答案所需的操作数。

O是“顺序”的缩写。它是对操作运行时间的度量

例如,此代码是O(n^2),因为它将执行n*n次

int n = 100;
for (int i = 0; i < n; ++i) {
  for (int j = 0; j < n; ++j) {
  }
}
int n=100;
对于(int i=0;i
所有其他答案都已清除O,要找到给定算法的典型复杂性,请查看适当的参考,例如。在每个算法的底部,记录了算法的复杂性。

这被称为大O符号,它是给定算法的渐近复杂性的表达式,并与一些参数有关

  • 渐近意味着我们对前几种情况不感兴趣,而是对输入参数增大时算法的行为感兴趣
  • 参数取决于要测量的算法
  • 我们感兴趣的业务
例如,在二进制搜索的情况下,我们表示根据搜索集的大小执行的比较次数之间的关系

运行时间通常可以由此推断出来,但并不总是正确的,尤其是在实现或硬件约束方面没有选择正确的“操作”时


几天前有一篇很好的帖子谈到了使用磁带作为存储进行排序。由于搜索的复杂性表示比较的数量,并且使用磁带作为存储,因此运行时主要受磁带移动的影响。。。事实证明,尽管bubblesort通常被描述为速度较慢,但它的性能优于quicksort。

:)添加的标记@aschepler为它起了一个名字,因此现在您可以找到许多问题来解释它;)看见(有人选一个,投一票,这样我就不用决定了…)关于你问题的第二部分:从技术上来说,这不是一个衡量标准,而是一个计算,而不是表现。复杂性,即它的扩展程度。严格地说,大O“仅”适用于上界/最坏情况。@delnan,对不知道
O(n)
意味着什么的人说复杂性,有点像告诉某人,要理解递归,他们必须先理解递归。当然,除了解释它之外(即使是我,在我微不足道的评论中,也提供了一个小解释)。对他们说“性能”就像告诉他们CPU的时钟频率决定数字处理的速度。@delnan:最坏情况和上限是两个不同的概念。你也可以对平均情况进行big-O计算,但它总是一个上限-任何
O(n)
的东西也是
O(n^2)
,同样
O(n)
的东西可能是
O(lg(n))
,但它不必是运行时的-big-O可以引用任何计算资源,例如内存