【问题标题】:What is big-O notation? How do you come up with figures like O(n)? [duplicate]什么是大 O 符号?你如何得出像 O(n) 这样的数字? [复制]
【发布时间】:2011-03-10 15:23:51
【问题描述】:

可能重复:
Plain english explanation of Big O

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

我收集到它与时间有关,O(1) 是最好的,而像 O(n^n) 这样的东西非常糟糕,但有人可以指出我对它的基本解释究竟代表什么,这些数字从何而来?

【问题讨论】:

标签: big-o


【解决方案1】:

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

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

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

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

嵌套循环是 O(n^2)。一个嵌套的嵌套循环是 O(n^3),并且向前。

二叉树搜索之类的东西是log(n),比较难显示,但是在树的每一层,可能解的数量减半,所以层数是log(n)(前提是树是平衡的)。

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

【讨论】:

  • 你也可以用这个符号来描述空间行为。
  • -1 不一定是最坏情况,在我去年的算法课上,我们展示了 Big O 表示最坏情况、最好情况以及如果我们能算出平均情况。跨度>
  • 通常大 O 表示法是一般情况。我们说插值搜索是 O(log log n),但如果值相距足够远,最坏的情况是 O(n)。 en.wikipedia.org/wiki/Interpolation_search
  • Big O 有时用于显示更常见的情况,因为最坏的情况并不那么有趣。如果你看到 O(n^2) 没有任何警告,你应该假设最坏的情况。 secure.wikimedia.org/wikipedia/en/wiki/…
【解决方案2】:

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

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

O(n^n) 不好,因为随着n 的增加,执行排序(或您正在做的任何事情)所需的计算量将成倍增加。

O(1) 是最好的,因为它意味着执行一个函数需要 1 次计算,想想哈希表,在哈希表中查找一个值的时间复杂度为 O(1)

【讨论】:

  • 其实这样不太对。它是关于表达最坏情况成本增长的速度。所以 O(N) 意味着如果正在处理的数据项的数量增加一倍,则处理数据的最坏情况时间将增加一倍。哦,O(1)并不意味着“1次计算”,它意味着计算成本是恒定的,无论数据点的数量如何。没有冲突的哈希表就是一个很好的例子。
【解决方案3】:

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

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

这是基本思想,详细解释请查阅维基百科页面,标题为“Big O Notation”。

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 2020-06-25
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多