请有人解释一下:
如果文件说STL std :: vector find element performace = O(ln(n)), 这是什么意思。
O(ln(n))
- 什么是“ O ”,我可以在哪里阅读?
我可以在哪里阅读有关其他STL容器性能的性能
非常感谢
答案 0 :(得分:6)
Big O notation是一种衡量算法如何根据其工作的数据大小进行扩展的方法。
如果向量通常为O(n)
,则查找元素,当向量排序并使用binary search family of algorithms之一时,它仅为O(lg(n))
。
每种算法的复杂性都在标准中以及任何参考文献中指定(例如上面指向std::lower_bound
的链接)。
BTW,ln
在基础log
上是e
,但所有对数都是相同的复杂度,所以即使二进制搜索只执行lg
(log 2 )操作说技术上是正确的O(ln(n))
。
答案 1 :(得分:5)
这被称为 Big O 表示法,它表示给定算法的渐近复杂性以及与某些参数的关系。
例如,在二分搜索的情况下,我们根据我们搜索的集合的大小来表示执行的比较数之间的关系。
通常可以从中推断出运行时间,但并非总是如此,特别是如果没有针对实现或硬件约束选择正确的“操作”。
前几天有一篇很好的帖子谈到使用磁带作为存储进行排序。由于搜索的复杂性表达了比较的数量并使用磁带作为存储,因此运行时主要受到磁带移动的影响...事实证明,尽管被描述为较慢,但是对于快速排序,bubblesort会表现得更好。
答案 2 :(得分:4)
Big-O表示法是关于程序性能的时间复杂性。
所以O(ln(n))意味着当向量变大时访问std :: vector中的元素与ln(size_of_vector)成比例,但这只是使用二进制搜索的排序向量。二进制搜索比线性搜索执行速度快,因为您可以快速消除可能的元素两次,因此ln实际上是一个日志库2.
答案 3 :(得分:4)
O是big O notation。它描述了算法的运行时复杂性。基本上,它是计算答案所需的操作数量。
答案 4 :(得分:2)
所有其他答案都已清除 O ,以查找给定算法的典型复杂性,查看一个不错的参考,例如this。在每个算法的底部,记录了算法的复杂性。
答案 5 :(得分:1)
O是“Order”的缩写。它是衡量操作运行时间的指标。
例如,此代码为O(n ^ 2),因为它将执行n * n次。
int n = 100;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
}
}