【问题标题】:What would be the big O notation for the function?该函数的大 O 表示法是什么?
【发布时间】:2013-12-11 20:11:57
【问题描述】:

我知道大 O 表示法是衡量函数效率的指标,但我真的不知道如何计算它。

def method(n)
   sum = 0
   for i in range(85)
       sum += i * n
   return sum

答案会是 O(f(85)) 吗?

【问题讨论】:

  • 这里的运行时间似乎是恒定的(即n的不变量)...

标签: python-3.x big-o performance


【解决方案1】:

这个函数的复杂度是O(1)

在 RAM 模型中,基本数学函数发生在恒定时间内。此函数中的主导项是

for i in range(85):

因为 85 是一个常数,所以复杂度用 O(1) 表示

【讨论】:

  • 你能解释一下为什么吗?
【解决方案2】:

你有 4 个“动作”的函数,要计算它的大 O,我们需要为每个动作计算大 O 并选择最大值:

  1. sum = 0 - 恒定时间,测量 O(1)
  2. for i in range(85) - 恒定时间,85 次迭代,O(1 * #3 的复杂度)
  3. sum += i*n - 我们可以说是常数时间,但乘法实际上取决于 i 和 n 的位长,所以我们可以说 O(1) 或 O(max(lenI, lenN))
  4. 返回总和 - 恒定时间,测量 O(1)

所以,可能的最大大 O 是 #2,即 1 * O(#3),只要 lenI 和 lenN 为常数(通常为 32 或 64 位),max(lenI, lenN) -> 32 /64,所以你的函数的总复杂度是 O(1 * 1) = O(1)

如果我们有很大的数学,即N的位长可以非常长,那么我们可以说O(位长N)

注意:位长 N 实际上是 log2(N)

【讨论】:

  • ... O(log2 n) 等于 O(log n)。
  • @pepr 在数学世界中最好提到 log base,因为 log 通常意味着 log10,但在计算机科学世界中 log 通常意味着 log2。所以我更喜欢在这里标明base(当然你可以通过const将log2转换成log10,然后直接写不带​​base的log)
  • 我知道你知道。 :) 并且任何常量都不会改变 O()。
【解决方案3】:

理论上,复杂度是 O(log n)。随着n 的增长,读取数字和执行乘法需要更长的时间。

然而,在实践中,n 的值是有限制的(有一个最大值),因此它可以被读取并且可以在 O(1) 时间内对其执行操作。由于我们重复一个 O(1) 操作固定的次数,复杂度仍然是 O(1)。

请注意,O(1) 表示恒定时间 - O(85) 并没有真正的不同。如果在一个序列中执行多个恒定时间操作,结果仍然是 O(1),除非序列的长度取决于输入的大小。执行 1000 次 O(1) 操作仍然是 O(1),但执行 n 次是 O(n)

如果你真的想稳妥行事,就说O(∞),这绝对是一个正确的答案。但 CS 教师在实践中往往并不真正欣赏它。

【讨论】:

    【解决方案4】:

    在谈论复杂性时,总是应该说哪些操作应该被认为是常数时间的(最初的协议)。这里可以考虑整数乘法或不变。无论如何,示例的时间复杂度优于 O(n)。但这是老师对付学生的伎俩——有点。 :)

    【讨论】: