这是解决此问题的更严格的方法:
将算法的运行时间定义为f(n)
因为n
是我们唯一的输入。外循环告诉我们这一点
f(n) = Sum(g(i,n), 1, n-1)
从到Sum(expression, min, max)
的总和在哪里。请注意,在这种情况下,表达式是具有固定(总和索引)和(输入)的评估。我们可以剥离另一层并定义:expression
i = min
i = max
g(i, n)
i
n
f(n)
g(i, n)
g(i, n) = Sum(h(j), i+1, n), where i < n
这是 到 的h(j)
wherej
范围之i+1
和n
。最后我们可以定义
h(j) = Sum(O(1), 1, j)
因为我们假设这r = r+1
需要时间O(1)
。
请注意,此时我们没有做任何挥手,说诸如“哦,你可以将循环相乘。'最里面的操作'是唯一重要的。” 这种说法甚至不适用于所有算法。这是一个例子:
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
Solve_An_NP_Complete_Problem(n);
for (k = 0; k < n; k++)
{
count++;
}
}
}
上面的算法不是O(n^3)
……它甚至不是多项式的。
无论如何,既然我已经确定了严格评估的优越性(:D),我们需要向上工作,这样我们才能弄清楚上限是什么f(n)
。首先,很容易看出h(j)
是O(j)
(只需使用 Big-Oh 的定义)。由此我们现在可以重写g(i, n)
为:
g(i, n) = Sum(O(j), i+1, n)
=> g(i, n) = O(i+1) + O(i+2) + ... O(n-1) + O(n)
=> g(i, n) = O(n^2 - i^2 - 2i - 1) (because we can sum Big-Oh functions
in this way using lemmas based on
the definition of Big-Oh)
=> g(i, n) = O(n^2) (because g(i, n) is only defined for i < n. Also, note
that before this step we had a Theta bound, which is
stronger!)
所以我们可以重写f(n)
为:
f(n) = Sum(O(n^2), 1, n-1)
=> f(n) = (n-1)*O(n^2)
=> f(n) = O(n^3)
您可能会考虑证明下界以表明f(n) = Theta(n^3)
. 诀窍是注意简化g(i, n) = O(n^2)
但在计算时保持严格的界限f(n)
。它需要一些丑陋的代数,但我很确定(即我实际上没有做过)你也能够证明f(n) = Omega(n^3)
(或者Theta(n^3)
如果你真的很细致,就直接证明)。