考虑以下功能:
ChernivtsiTransport:
我得到第一个循环是O(logn),而第二个循环给出O(n),它总共给出O(n)的时间复杂度。但是由于递归调用,我认为时间复杂度将是 O(nlogn),但显然它只是 O(n)。任何人都可以解释原因吗?
答案 0 :(得分:4)
递归调用几乎给出了以下复杂性(通过T(n)
表示输入n的复杂性):
T(n) = log(n) + n + T(n/3)
正确指出的第一个观察是你可以忽略对数,因为它由n
支配。现在我们只剩下T(n) = n + T(n/3)
。例如,尝试将其写入0。我们有:
T(n) = n + n/3 + n/9+....
您可以轻松证明上述总和始终小于2*n
。事实上,可以证明更好的限制,但这足以说明整体复杂性为O(n)
。
答案 1 :(得分:1)
对于使用递归算法的过程,如下所示:
procedure T( n : size of problem ) defined as:
if n < base_case then exit
Do work of amount f(n) // In this case, the O(n) for loop
T(n/b)
T(n/b)
... a times... // In this case, b = 3, and a = 1
T(n/b)
end procedure
应用Master theorem来查找时间复杂度,f(n)
在这种情况下为O(n)
(由于第二个for循环,就像你说的那样)。这使c = 1
。
现在,log b a = log 3 1 = 0,使这个定理的第3个案例,根据该时间复杂性T(n) = Θ(f(n)) = Θ(n)
。