此重复关系的运行时间为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)
到目前为止,我可以看到,如果我认为n
是n = 2m
的2的幂,那么我可能会证明这一点,但我没有得到清晰的图像。任何人都可以帮助我吗?
答案 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))
是c
和1
之间的常数。
您可以使用小于2
的2的最大幂来做同样的事情。这会将您引导至n
,我们知道T(n) ≥ T(n'')
位于
T(n'')
其中O(n''⋅log(n'')) = O(c⋅n⋅log(c⋅n)) = O(n⋅log(n))
是c
和1/2
之间的常数。
总的来说,T(n)的复杂性受到1
和T(n'')
的复杂性的限制T(n')
因此O(n⋅log(n))
也是T(n)
在O(n⋅log(n))
中,即使它不是2的幂。