具有依赖索引的三重嵌套大O.

时间:2017-09-11 21:22:03

标签: algorithm time-complexity big-o

我正在努力找到这个问题的大O,而我在第三个嵌套循环时遇到了困难。这是代码

for (int i = 1 to n)
  for (int j = i to n)
    for (int k = j*j to n)
      //some constant operation

i forloop显然是O(n)。

j forloop是(n + n-1 + n-2 + ... + 2 + 1)=(n-1)n / 2 = O(n ^ 2)。

但我不确定如何考虑 k forloop。我知道一个完整的 j (1到n)循环,总和就像(n + n-4 + n-6 + ...)= sum_ {k = 1} ^ n (n - k ^ 2),但我不确定从那里去哪里。

关于如何进行的任何建议都会很棒!

1 个答案:

答案 0 :(得分:3)

j大于sqrt(n)时,不会输入内部循环。当i大于sqrt(n)时也是如此,因为ji开始。

因此,我们可以将完成的工作分为两种情况:

  • i和/或j超过sqrt(n)的迭代中:k循环未输入,并且不难证明外部两个循环完成的时间复杂度是Theta(n ^ 2)。
  • ij都小于sqrt(n)的迭代中:前两个循环每次运行sqrt(n)次,最后一个循环运行到n因此,总迭代次数的上限为O(sqrt(n) * sqrt(n) * n) = O(n^2)

在这两种情况下,上限是O(n ^ 2),第一种情况表明它也是下界。因此,总时间复杂度为Theta(n ^ 2)。