我正在努力找到这个问题的大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),但我不确定从那里去哪里。
关于如何进行的任何建议都会很棒!
答案 0 :(得分:3)
当j
大于sqrt(n)时,不会输入内部循环。当i
大于sqrt(n)时也是如此,因为j
从i
开始。
因此,我们可以将完成的工作分为两种情况:
i
和/或j
超过sqrt(n)
的迭代中:k
循环未输入,并且不难证明外部两个循环完成的时间复杂度是Theta(n ^ 2)。i
和j
都小于sqrt(n)
的迭代中:前两个循环每次运行sqrt(n)
次,最后一个循环运行到n因此,总迭代次数的上限为O(sqrt(n) * sqrt(n) * n) = O(n^2)
。在这两种情况下,上限是O(n ^ 2),第一种情况表明它也是下界。因此,总时间复杂度为Theta(n ^ 2)。