如何找到递归关系的运行时间?

时间:2015-03-05 02:10:02

标签: recursion big-o complexity-theory

此重复关系的运行时间为O(nlogn)。由于我是算法新手,我将如何以数学方式显示算法?

T(n) = 2⋅T(n/2) + O(n)
T(n) = 2 ( 2⋅T(n/4) + O(n) ) + O(n)  // since T(n/2) = 2⋅T(n/4) + O(n)

到目前为止,我可以看到,如果我认为nn = 2m的2的幂,那么我可能会证明这一点,但我没有得到清晰的图像。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

如果你使用主定理,你会得到你期望的结果。

如果您想通过手动"来证明这一点,您可以通过假设n = 2m是2的幂(您已经说过)来轻松地看到这一点。这导致你

T(n) = 2⋅T(n/2) + O(n)
     = 2⋅(2⋅T(n/4) + O(n/2)) + O(n)
     = 4⋅T(n/4) + 2⋅O(n/2) + O(n)
     = 4⋅(2⋅T(n/8) + O(n/4)) + 2⋅O(n/2) + O(n)
     = Σk=1,...,m 2k⋅O(n/2k)
     = Σk=1,...,m O(n)
     = m⋅O(n)

m = log₂(n)起,您可以将其写为O(n log n)

最后,如果n是2的幂,则无关紧要。 要看到这一点,您可以考虑这一点:您输入n(不是2的幂),并且在输入中添加更多元素,直到它包含n' = 2m元素{{1 }和m ∈ ℕ,即log(n) ≤ m ≤ log(n) + 1是2的最大幂,大于n'。显然n成立,我们知道T(n')在

T(n) ≤ T(n')

其中O(n'⋅log(n')) = O(c⋅n⋅log(c⋅n)) = O(n⋅log(n) + n⋅log(c)) = O(n⋅log(n)) c1之间的常数。

您可以使用小于2的2的最大幂来做同样的事情。这会将您引导至n,我们知道T(n) ≥ T(n'')位于

T(n'')

其中O(n''⋅log(n'')) = O(c⋅n⋅log(c⋅n)) = O(n⋅log(n)) c1/2之间的常数。

总的来说,T(n)的复杂性受到1T(n'')的复杂性的限制T(n')因此O(n⋅log(n))也是T(n)O(n⋅log(n))中,即使它不是2的幂。