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

时间:2011-02-08 15:34:20

标签: c++ performance stl big-o

请有人解释一下:

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

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

我可以在哪里阅读有关其他STL容器性能的性能

非常感谢

6 个答案:

答案 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.

http://en.wikipedia.org/wiki/Big_O_notation

答案 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) {
  }
}