Foo(A,f,l)
**Precondition: A[f ...l] is an array of integers, f,l are two naturals ≥ 1 with f ≤ l.
if (f = l) then
return A[f]
else
m ← floor of((f+l)/2)
return min(Foo(A,f,m), Foo(A,m + 1,l))
end if
如果我错了,请纠正我,但我认为此代码返回数组的最小整数。但是,如何根据数组A计算出描述时间复杂度的递归关系?你能指导我解决这个问题吗?我甚至不知道从哪里开始。
答案 0 :(得分:0)
我们可以从伪代码的结构中恢复的递归关系。我们可以让T(n)
表示算法所花费的时间作为输入大小的函数。对于n = 1
,时间是不变的,比如T(1) = a
。我们现在的问题是n
更大,我们如何表达T(n)
?
我们将在else
的{{1}}条款中。我们做了一些额外的工作 - 让我们称之为n > 1
- 然后调用该函数两次,一次输入大小为b
,一次输入大小为floor(n/2)
。所以我们可以将这部分递归写为ceiling(n/2)
。我们现在可以写出一些条款。
T(n) = b + T(floor(n/2)) + T(ceiling(n/2))
我们发现n T(n)
1 a
2 b + a + a = b + 2a
3 b + b + 2a + a = 2b + 3a
4 b + b + 2a + b + 2a = 3b + 4a
5 b + b + 2a + 2b + 3a = 4b + 5a
... ...
k = (k-1)b + (k)a = kb - b + ka = k(a + b) - b
对某些常量T(n) = (a + b)n - b
和a
的猜测取决于我们可能采取的工作量成本不变(请注意计算b
在(f + l) / 2
方面并不是真正的常数,但它不会改变我们的分析)。我们可以用数学归纳证明这一点:
n
是对的; T(1) = a = (a + b)(1) - b
都是T(n) = (a + b)n - b
。n <= k
会举行吗?请记住T(k + 1) = (a + b)(k + 1) - b
。假设T(k + 1) = b + T(floor((k+1)/2)) + T(ceiling((k+1)/2)
是偶数且k+1
。那么T(k + 1)= b + 2T(m)= b + 2 [(a + b)(m) - b] = b + 2(m)(a + b) - 2b =(2m)(a + b) - b =(k + 1)(a + b) - b m = (k+1)/2
k + 1`是奇数留作练习。这是线性的。
答案 1 :(得分:-1)
复杂性
O(nlog(n)); n = size of the array
Explanation:
在每次调用中,您将数组分成两个相等的部分,调用f=l
。它为数组中的每个数字调用函数O(log(n))
次。因此,总复杂度为O(nlog(n))