C++ STL性能O(ln(n))问题
请有人解释一下: 如果文件上说STL std::vector finding element speed performace=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(向量的大小)成正比,但这只适用于使用二进制搜索的排序向量。二进制搜索执行速度比线性搜索快,因为消除可能元素的速度是
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可以引用任何计算资源,例如内存