递归,内循环和时间复杂度

时间:2015-08-14 08:37:42

标签: algorithm recursion time-complexity

考虑以下功能:

ChernivtsiTransport:

我得到第一个循环是O(logn),而第二个循环给出O(n),它总共给出O(n)的时间复杂度。但是由于递归调用,我认为时间复杂度将是 O(nlogn),但显然它只是 O(n)。任何人都可以解释原因吗?

2 个答案:

答案 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)