查找算法的递归关系

时间:2010-05-27 08:53:49

标签: recurrence relation

我正在阅读我的算法教科书,我正在阅读有关递归关系和查找算法的大O复杂性。我跑过这条线

"In the case of the merge-sort algorithm, we get the recurrence equation:

    t(n) = b                  if n < 2

         = 2t(n/2) +bn        if n >= 2

for b > 0

我的回答是“我们知道怎么回事?!?!”

所以我想知道是否有系统的方法,或者只是从算法中获得这些递归关系的逻辑方法

有人可以解释一下b和两个2来自何处?

3 个答案:

答案 0 :(得分:1)

嗯,这个陈述(大概)是对所讨论算法的讨论或至少是陈述的结论。没有细节,我只能做出有根据的猜测,这将是这样的:

  • 算法所做的第一件事是检查是否要求它处理0或1个元素。如果这是真的,它会立即返回。因此,然后n < 2,有一个固定的费用 - 称之为b
  • 对于n >= 2,算法将其输入分为两部分,每部分大小为n/2,并在每个部分上调用自身。每次这样的调用都会有t(n/2)的成本,并且有两次这样的调用
  • 将两个部分合并在一起会产生额外费用 - 此费用将与n成比例 - 称之为bn

唯一有点奇怪的是,为什么出现的两个常数因子应该是相同的并不完全是显而易见的 - 但是大O分析的一部分原因是恒定因素最终无关紧要。

答案 1 :(得分:1)

合并排序算法可以概括为:

mergesort (array A) {
   mergesort (first half of A);
   mergesort (second half of A);
   merge the two halves and return;
}

存在O(N)算法来合并两个长度为N的阵列,即,对于某些常数 b ,其复杂度为 bN 。 0

假设mergesort的复杂性为T(N)。由于N的一半是N / 2,我们看到:

mergesort (array A) {                    T(N)    =
   mergesort (first half of A);          T(N/2)  +
   mergesort (second half of A);         T(N/2)  +
   merge the two halves and return;       bN
}

解释了N≥2的情况。

N&lt; 2个案例(你停止递归的基本情况)是微不足道的。

答案 2 :(得分:0)

T(n) = c if n < d
     = A*T(n/b) + f(n)

其中d> = 1并且存在A个子问题且子问题最多为n / b大小。 f(n)是将问题划分为子问题并将子问题解决方案合并为整个问题的解决方案所需的总额外时间。

这是分而治之的算法。

我想知道为什么合并排序有2个子问题?