【问题标题】:what does O(N) mean [duplicate]O(N) 是什么意思
【发布时间】:2010-12-26 22:17:54
【问题描述】:

可能重复:
What is Big O notation? Do you use it?

大家好,

相当基本的可伸缩性符号问题。

我最近收到了一篇关于我的 python 排序列表实现的帖子的评论 “但请注意,您的 '有序集' 实现是 O(N) 的插入”

很高兴知道,但我不确定这意味着什么。

我见过诸如 n(o) o(N)、N(o-1) 或 N(o*o) 之类的符号

上面的符号是指什么?

【问题讨论】:

  • N 是指已经在列表中的项目数。使用 O(N) 执行插入意味着在最坏的情况下,必须遍历整个列表,直到找到可以插入新元素的位置,以便插入后的列表排序为好吧。
  • 我认为这不应该被关闭。如果您不知道 O(N) 表示大 O 表示法,您将不会搜索它。我认为这应该重新打开并添加指向“什么是大 O 表示法”项目的链接。
  • 我当然没有找到其他人,但现在其他人都列在顶部,怀疑有人会想念他们,应该保持关闭。

标签: performance scalability big-o set


【解决方案1】:

评论指的是Big-O Notation。

简单地说:

  1. O(1) 表示在恒定时间内 - 与项目数量无关。
  2. O(N) 表示与 项目数。
  3. O(log N) 表示时间与 日志(N)

基本上,任何“O”表示法都意味着操作最多需要 k*f(N)
其中:

k 是一个常数乘数

f() 是一个依赖于 N 的函数

【讨论】:

  • 它是如何填补空白的? big-oh 的定义是错误的(即使是非正式的),其他人都提到了类似于第 1、2 和 3 点的问题。很高兴你找到了你喜欢的答案,但这让我感到困惑。
  • 一个有点迂腐但重要的修正 - 从技术上讲,这意味着该操作将花费 kf(N) 而不是完全等于 kf(N) 的最大时间。
  • @mikera 谢谢,我会更新我的答案。
【解决方案2】:

O(n) 是Big O Notation,指给定算法的复杂度。 n 是指输入的大小,在您的情况下,它是列表中的项目数。

O(n) 意味着您的算法将采用 n 次操作的顺序来插入一个项目。例如循环遍历列表一次(或恒定次数,例如两次或仅循环一半)。

O(1) 意味着它需要一个恒定的时间,它不依赖于列表中有多少项目。

O(n^2) 表示每次插入都需要 n*n 次操作。即 1 个项目的 1 个操作,2 个项目的 4 个操作,3 个项目的 9 个操作。如您所见,O(n^2) 算法在处理大量项目时效率低下。

对于列表,O(n) 的插入并不坏,但不是最快的。另请注意,O(n/2) 被认为与 O(n) 相同,因为它们都以与 n 相同的速率增长。

【讨论】:

  • "n 次插入项目的操作。例如,遍历列表一次。"如果你循环两次,它仍然是 O(n) 并且你执行 2*n 操作。你所说的 O(n/2) 也适用于 O(2*n)。
  • 好点。我已经更新了我的答案。
  • 要么需要 n 次操作,n 时间或恒定时间...选择一个。
  • O(n/2) = O(n) 因为 n/2 在 n 趋于无穷大时接近 n
  • @GeoffLangenderfer 抱歉,如果我误解了这一点,但我认为这不是原因。如果我没记错的话,我们之所以这么说,是因为我们并不准确计算需要多长时间,而是计算执行时间与我们的数据集之间的关系。所以我们说的是 Δt∝n,或 Δt∝n²,或 Δt∝1/n。在这些情况下,缩放因子,无论是 2n 还是 n/2,都会被忽略,因为无论事情如何发展,我们都会查看关系。所以对于 O(n),我们得到 n=Δt,因此如果我们将数据集加倍,我们得到 2n≈2Δt,如果我们说 O(n/2),我们将得到 n/2=Δt,因此如果我们将数据集加倍,我们得到 n ≈2Δt。所以我们看到,如果 n 加倍,则不管 Δt 加倍。
【解决方案3】:

称为大 O 表示法:http://en.wikipedia.org/wiki/Big_O_notation

所以说插入是O(n) 意味着您必须遍历整个列表(或其中的一半——大 O 表示法忽略常数因素)才能执行插入。

这看起来是个不错的介绍:http://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/

【讨论】:

  • 很酷,谢谢,这是一个好的开始
  • O 是上限。这意味着插入的复杂性最多以 n 的速度增长。
  • +1 链接到 rob-bell.net
【解决方案4】:

具体而言,O(n) 意味着如果列表中有 2 倍的项目,则它需要 不超过 两倍的时间,如果有 50 倍许多它需要 不超过 50 倍的时间。有关更多详细信息,请参阅 dreeves 指出的维基百科文章

编辑(上面的粗体字):有人指出,Big-O 确实代表了上限,因此如果列表中的元素数量是原来的两倍,插入的时间最多会是原来的两倍,如果元素的数量是原来的 50 倍,那么它所花费的时间最多是 50 倍。

如果它是另外的 Ω(n)(n 的大欧米伽),那么对于两倍大的列表,它至少需要两倍的时间。如果您的实现既是 O(n) 又是 Ω(n),这意味着对于两倍大的列表,它将至少 most 两倍长, 那么可以说是 Θ(n) (Big Theta of n),也就是说如果元素数量是原来的两倍,那么它所花费的时间正好是原来的两倍。

根据维基百科(以及个人经验,我自己对此感到内疚)Big-O 通常用于 Big-Theta 的含义。调用你的函数 O(n^n^n^n) 在技术上是正确的,因为所有 Big-O 都说你的函数不会比这慢,但是除了证明一个点之外,没有人会真正这么说,因为它是尽管在技术上是准确的,但不是很有用和误导性的信息。

【讨论】:

  • 事实并非如此。您描述的是下限,而不是上限。
  • 谢谢,更正了它(我认为......在特定情况下,常数值似乎抵消了'n'的顺序,因为当 n=1 时常数应该在那里如果 n=1 的时间是 50ms,那么这意味着常数值是 50,所以对于 n=10,它应该需要 50*10ms,这仍然是 10 倍的时间并且常数抵消并且可以安全地丢弃.
  • 我认为这可能是这个问题的最佳答案,现在。
【解决方案5】:

它指的是你的程序有多复杂,即实际解决一个问题需要多少操作。 O(n) 意味着每个操作与列表中的项目执行相同数量的步骤,对于插入来说,这非常慢。同样,如果您有 O(n^2) 意味着任何操作都需要“n”平方数的步骤才能完成,依此类推......“O”代表数量级,括号中的表达式是总是与过程中被操纵的项目的数量有关。

【讨论】:

  • +1 表示“O”代表什么
  • 太棒了!一个非常简短的解释。没必要混淆。清晰的术语,清晰的措辞,不变的词汇,不像人们给出的其他解释应该链接维基百科的文章并先自己阅读。
【解决方案6】:

简答:这意味着处理时间与输入的大小成线性关系。例如,如果输入的大小(列表长度)增加三倍,则处理时间(大致)增加三倍。如果它增加一千倍,处理时间也会增加相同的数量级。

详细答案:请参阅 Ian P 和 dreeves 提供的链接

【讨论】:

    【解决方案7】:

    这可能会有所帮助:

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

    O(n):在未排序的项目中查找项目 列表或畸形树(最坏情况); 两个 n 位数字相加

    祝你好运!

    【讨论】:

      【解决方案8】:

      Wikipedia explains 它比我做得好得多,但这意味着如果您的列表大小为 N,则插入项目最多需要 N 次循环/迭代。 (实际上,您必须遍历整个列表)

      如果您想更好地理解,有一本免费的书 from Berkeley 可以更深入地了解符号。

      【讨论】:

      • “插入一个项目最多需要 N 次循环/迭代”hmm.. 问题大小 N = O(N * N) = O(N^2) 的 N 次循环,除非我误解了什么你是想说。
      • 不完全是“在 max N”。它可以是 2*N 或 3*N。那仍然是 O(N)。
      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 2023-02-08
      • 2012-01-03
      • 1970-01-01
      • 2011-01-14
      • 2023-03-16
      • 1970-01-01
      • 2020-02-23
      相关资源
      最近更新 更多