以下代码在参数大小方面的时间复杂度是多少?激励。
// Process(A, N) is O(sqrt(N)).
Function Complex(array[], size){
if(size == 1) return 1;
if(rand() / float(RAND_MAX) < 0.1){
return Process(array, size*size)
+ Complex(array, size/2)
+ Process(array, size*size);
}
}
我认为它是O(N),因为如果Process(A,N)是O(sqrt(N)),那么Process(A,N * N)应该是O(N)和Complex(数组, size / 2)是O(log(n)),因为它每次运行时都会减小一半。所以一次运行需要O(N)+ O(log(N))+ O(N)= O(N)。
请纠正我并给我一些提示,告诉我如何思考/进行这样的任务。
我非常感谢所有人的帮助和感谢。
答案 0 :(得分:0)
算法的时间复杂度确实是O(N)
,但原因不同。
函数的复杂性可以表示为T(n)
其中:
T(n) = T(n/2) + 2*n
^ ^
recursive 2 calls to
invokation Process(arr,n*n),
each is O(n(
众所周知,这种递归是O(n):
T(n) = T(n/2) + 2*n =
= T(n/4) + 2*n/2 + 2*n =
= T(n/8) + 2*n/4 + 2*n/2 + 2*n
= ....
= 2*n / (2^logN) + ... + 2*n/2 + 2*n
< 4n
in O(n)
让我们正式证明,我们将使用数学归纳法:
基础: T(1)&lt; 4(检查)
假设:对于n
,对于每个k<n
,声明T(k) < 4k
都适用。
对于n
:
T(n) = T(n/2) + n*2 = (*)
< 2*n + 2*n
= 4n
结论:T(n)
位于O(n)
(*)来自归纳假设