具有依赖性的嵌套循环的公式

时间:2012-09-24 15:43:45

标签: algorithm complexity-theory

  

可能重复:
  Big O: Nested For Loop With Dependence

鉴于以下嵌套循环,我必须弄清楚它的Big O复杂性:

for(i=0 to n)
    for(j=n-1;j>=i;j--)

我知道这个的复杂性将是O(n^2),但我不确定如何找出内循环的公式。

为了清楚起见,我写了一张桌子:

n=10
i | j | outer iters | inner iters
0 | 9 |     1       |     10
1 | 9 |     2       |      9 
...
9 | 9 |    10       |      1

因此,外循环运行n次,而内循环运行sum(n to n-9)

我被告知答案是n(n-2)/2,而我根本无法弄清楚如何从我拥有的东西中得到这个结论。

非常感谢协助。

3 个答案:

答案 0 :(得分:4)

观察外循环每次迭代执行内循环的次数。

When i=0, the inner loop has n iterations.
When i=1, the inner loop has n-1 iterations.
When i=2, the inner loop has n-2 iterations.
......
When i=k, the inner loop has n-k iterations.
.....
When i=n-2, the inner loop has 2 iterations.
When i=n-1, the inner loop has 1 iterations.

因此内循环的迭代总数为1 + 2 + ... +(n-2)+(n-1)+ n,等于n(n + 1)/ 2。 / p>

答案 1 :(得分:1)

将整数1和n相加是众所周知的高斯特里克:

gauss's trick
(请注意它是+ 1,而不是- 2

建立直觉

这是一种直观的方式来了解为什么这个公式是正确的:

explanation

尝试使用1 + 2 + 3 + 4 + 5 + 6

自行查看

证明我们的直觉

但是,如果没有偶数条款怎么办?它还能用吗?它适用于任何数量的术语吗?要回答这个问题,我们最能证明这一点 假设

hypothesis
用一种叫做数学归纳的概念 为此,我们首先需要建立一个基本案例,在本例中为n = 1,这是非常正确的。

现在,对于归纳步骤。我们假设,我们已经证明了我们对某些n的假设,基于这些知识,我们希望证明它也适用于n + 1。如果这成功,我们已经“神奇地”证明了所有自然数字。 为什么?我们已经证明它适用于n = 1n => n + 1步骤意味着现在已经证明n = 2,这意味着n = 3也证明了它1}}等等。这是一种多米诺骨牌效应,第一次倾斜将让所有其他人失败(证明)。

inductive step

在假设中用n替换n + 1给出了我们归纳步骤的结果。因此,我们已经证明所有n的公式都是正确的。

答案 2 :(得分:0)

第一次迭代

- 内循环n-1次 第二次迭代 - 内循环n-2次 等等

用于n-1次迭代 - 内部循环1次

总迭代次数=(n-1)+(n-2)+ .. 2 + 1 = n(n-1)/ 2

是n ^ 2-n / 2,属于O(n ^ 2) 因为我们可以把它写成 如果f(n)= n ^ 2-n / 2 和g(n)= n ^ 2

我们可以把它写成 0℃; = F(N)< = C,G(n)的 对于c> 0 n0> 0 这里n大于n0