如何编写伪代码的递归关系?

时间:2016-09-24 20:25:46

标签: algorithm math recursion time-complexity big-o

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计算出描述时间复杂度的递归关系?你能指导我解决这个问题吗?我甚至不知道从哪里开始。

2 个答案:

答案 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 - ba的猜测取决于我们可能采取的工作量成本不变(请注意计算b(f + l) / 2方面并不是真正的常数,但它不会改变我们的分析)。我们可以用数学归纳证明这一点:

  1. n是对的;
  2. 假设所有T(1) = a = (a + b)(1) - b都是T(n) = (a + b)n - b
  3. 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`是奇数留作练习。
  4. 这是线性的。

答案 1 :(得分:-1)

你是对的。它返回数组的最小整数。

复杂性

O(nlog(n)); n = size of the array

Explanation:在每次调用中,您将数组分成两个相等的部分,调用f=l。它为数组中的每个数字调用函数O(log(n))次。因此,总复杂度为O(nlog(n))