【问题标题】:Understanding Big(O) in loops了解循环中的 Big(O)
【发布时间】:2011-09-22 23:00:58
【问题描述】:

我正在尝试获取以下代码 sn-p 的正确 Big-O:

s = 0
for x in seq:
  for y in seq:
    s += x*y
  for z in seq:
    for w in seq:
      s += x-w

根据我从 (Python Algorithms) 得到这个例子的书,他们是这样解释的:

z 循环运行线性迭代次数,并且 它包含一个线性循环,因此总复杂度是二次的,或 Θ(n2)。 y 环显然是 Θ(n)。 这意味着 x 循环内的代码块是 Θ(n + n2)。这整个块对每个执行 x-loop 循环,运行 n 次。我们使用乘法规则得到 Θ(n(n + n2)) = Θ(n2 + n3) = Θ(n3),即立方。

我不明白的是:O(n(n+n2))怎么会变成O(n3支持>)。数学正确吗?

【问题讨论】:

    标签: algorithm complexity-theory big-o


    【解决方案1】:

    这里进行的数学运算如下。当你说 O(n(n + n2)) 时,这相当于通过简单地分配说 O(n2 + n3)整个产品中的 n。

    O(n2 + n3) = O(n3) 的原因来自 big-O 的正式定义符号,如下:

    一个函数 f(n) = O(g(n)) 如果存在常数 n0 和 c 使得对于任何 n ≥ n0,|f (n)| ≤ c|g(n)|。

    通俗地说,这表示随着 n 变得任意大,f(n) 从上方以 g(n) 的恒定倍数为界。

    为了正式证明 n2 + n3 是 O(n3),考虑任何 n ≥ 1。那么我们有

    n2 + n3 ≤ n3 + n3 = 2n3支持>

    所以我们有 n2 + n3 = O(n3),其中 n0 = 1 和 c = 2。因此,我们有

    O(n(n + n2)) = O(n2 + n3) = O(n 3).

    要真正正式地说明这一点,我们需要证明如果 f(n) = O(g(n)) 且 g(n) = O(h(n)),则 f(n) = O (h(n))。让我们来看一个证明。如果 f(n) = O(g(n)),则存在常数 n0 和 c,使得对于 n ≥ n0,|f(n)| ≤ c|g(n)|。类似地,由于 g(n) = O(h(n)),有常数 n'0, c' 使得对于 n ≥ n'0,g( n) ≤ c'|h(n)|。所以这意味着对于任何 n ≥ max(c, c'),我们有这个

    |f(n)| ≤ c|g(n)| ≤ c|c'h(n)| = c x c' |h(n)|

    所以 f(n) = O(h(n))。

    更准确地说,在此处描述的算法的情况下,作者说运行时是 Θ(n3),这比说运行时更强的结果是 O(n3)。 Θ 表示法表示严格的渐近界,这意味着运行时间以与 n3 相同的速率增长,而不仅仅是它从上面以 n3 的某个倍数为界。为了证明这一点,您还需要证明 n3 为 O(n2 + n3)。我将把这个作为练习留给读者。 :-)

    更一般地说,如果您有 any 阶 k 多项式,则该多项式使用类似的参数为 O(nk)。要看到这一点,让 P(n) = ∑i=0k(aini)。然后,对于任何 n ≥ 1,我们有这个

    i=0k(aini) ≤ ∑i=0 k(aink) = (∑i=0k(ai))nk

    所以 P(n) = O(nk).

    希望这会有所帮助!

    【讨论】:

    • 谢谢你,你的回答是真正的数学。为了理解这一点,我必须回过头来回顾我在 Comp sci 学校的日子。我最终会得到它!
    • 在你的最后一个等式中,你为什么假设 i 总是小于 k?我的意思是,如果 i=1000 和 k=100
    • @IgorG.- 变量 i 是求和中的计数器,因此根据定义,它的范围从 0 到 k。这个想法是 a_i n^i 代表多项式中的一项。例如,在 2x^3 + x^2 - 4x - 8 中,序列 a_i 为 2, 1, -4, -8。
    【解决方案2】:

    n(n+n2) == n2 + n3

    Big-O 表示法只关心 n 趋于无穷时的主导项,因此整个算法被认为是 Θ(n3)。

    【讨论】:

    • 我们应该清楚 - 这指的是 Big Theta 表示法
    • 好点,@IgorGanapolsky。注意 Θ(n^3) 而不是 O(n^3)。 Big Oh 只描述了上限,而 Big Theta 也描述了下限。
    【解决方案3】:
    O(n(n+n^2)) = O(n^2 + n^3)
    

    由于n^3 术语支配n^2 术语,n^2 术语可以忽略不计,因此它是O(n^3)

    【讨论】:

    • 谢谢。这就是我想要理解的:“支配”是什么意思?我对“函数的增长速度比......”这样的术语很模糊
    • 通俗地说,这意味着n^3 术语比n^2 术语增长得多。例如,如果n=1000n^3n^2 大 3 个数量级。要对 Big-O 进行更正式和严格的处理,您将不得不求助于精确的定义。
    • 另一种解释方式是,如果 f(n) 的输出(结果)更大,则 f(n) 的增长大于 g(n)。
    • n^3/1000 - 100*n^2 - 100*n + 3 的 Big-o 也会是 n^3 吗?
    【解决方案4】:

    y 循环可以打折因为 z 循环 (O(n) + O(n^2) -> O(n^2)) 忘记算术。 然后你就剩下三个嵌套循环,它们都在'seq'的整个长度上迭代,所以它是 O(n^3)

    【讨论】:

    • 我认为 z 循环是 O(n^2),因为它包含一个嵌套循环,该循环遍历同一个集合。那么 z 循环不是 O(n*n) 而不是 O(n) + O(N) 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多