什么是大O符号?你怎么想出像O(n)这样的数字?

时间:2010-07-01 13:09:27

标签: big-o

  

可能重复:
  Plain english explanation of Big O

我想这可能是课堂上教的东西,但作为一名自学成才的程序员,我很少见到它。

我收集它与时间有关,O(1)是最好的,而像O(n ^ n)这样的东西非常糟糕,但有人可以指点我对它的基本解释实际上代表了这些数字来自哪里?

3 个答案:

答案 0 :(得分:4)

Big O指的是最差的运行时顺序。它用于显示算法根据数据集的大小(n->项目数)进行扩展的程度。

由于我们只关注顺序,因此忽略常数乘数,并且也删除任何增长速度低于主导项的项。一些例子:

单个操作或一组操作是O(1),因为它需要一些恒定的时间(不会根据数据集大小而变化)。

循环是O(n)。数据集中的每个元素都循环遍历。

嵌套循环是O(n ^ 2)。嵌套的嵌套循环是O(n ^ 3),然后是向前。

二叉树搜索之类的东西是log(n),这更难显示,但在树的每个级别,可能的解决方案数量减半,因此级别数为log(n)(前提是树是平衡的。)

找到最接近给定值的一组数字之和的东西是O(n!),因为需要计算每个子集的总和。这非常糟糕。

答案 1 :(得分:4)

这是表达时间复杂性的一种方式。

O(n)表示列表中的n元素,需要n次计算才能对列表进行排序。这一点都不错。 n的每次增加都会线性增加时间复杂度。

O(n^n)很糟糕,因为执行排序所需的计算量(或者你正在做的任何事情)会随着n的增加而呈指数级增长。

O(1)是最好的,因为它意味着执行函数的计算,考虑哈希表,在哈希表中查找值具有O(1)时间复杂度。

答案 2 :(得分:1)

应用于算法的Big O表示法指的是算法的运行时间如何取决于输入数据量。例如,排序算法对大型数据集的排序需要更长的时间而不是小型数据集。如果对于排序算法示例,您将运行时间(垂直轴)与要排序的值的数量(水平轴)进行绘图,对于从零到大数的值的数量,结果的线或曲线的性质将取决于使用的排序算法。 Big O表示法是描述直线或曲线的简写方法。

在大O表示法中,括号中的表达式是绘制的函数。如果表达式中包含变量(比如n),则此变量引用输入数据集的大小。你说O(1)是最好的。这是正确的,因为图f(n)= 1不随n变化。无论输入数据集的大小如何,O(1)算法都需要相同的时间来完成。相比之下,O(n ^ n)算法的运行时间随着输入数据集大小的平方而增加。

这是基本的想法,有关详细说明,请参阅标题为“Big O Notation”的维基百科页面。