【问题标题】:How to write the recurrence relation of a pseudocode?如何写出伪代码的递归关系?
【发布时间】:2016-09-24 20:25:45
【问题描述】:
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 来描述时间复杂度的递归关系呢?您能否指导我解决问题,以便我理解?我什至不知道从哪里开始。

【问题讨论】:

  • 以 A、f、l 的值为例,画出调用的内容,即完整的循环。您会看到,在每次传递中,搜索空间减半。复杂度是对数的。
  • 有了这个前提条件f <= l,您无法确保在您的内部调用中实现它。另外,这似乎是一个无用的前提,也许你应该删除它。您既不能确保m >= 1
  • 看看这个question
  • n 是数组的大小,所以n = l - f + 1T(1) = 1,那么T(n) 是什么?

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


【解决方案1】:

我们可以从伪代码的结构中恢复的递归关系。我们可以让T(n) 表示算法所花费的时间作为输入大小的函数。对于n = 1,时间是恒定的,比如T(1) = a。我们现在的问题是对于更大的n,我们如何表达T(n)

我们将在else 子句中为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 的一些常量ab 的猜测取决于我们可能认为是常量的工作量的成本(请注意,计算(f + l) / 2 在@ 方面并不是真正恒定的987654337@,但不会改变我们的分析)。我们可以使用数学归纳法证明这一点:

  1. T(1) = a = (a + b)(1) - b是对的;
  2. 假设T(n) = (a + b)n - b 代表所有n <= k
  3. T(k + 1) = (a + b)(k + 1) - b 是否成立?请记住T(k + 1) = b + T(floor((k+1)/2)) + T(ceiling((k+1)/2)。假设k+1 是偶数并且m = (k+1)/2。那么 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, as required. The case wherek + 1` 是奇数,留作练习。

这是线性的。

【讨论】:

    【解决方案2】:

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

    而复杂度是

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2021-07-27
      相关资源
      最近更新 更多