Recurrence 求一个算法的递推关系

Recurrence 求一个算法的递推关系,recurrence,relation,Recurrence,Relation,我在读我的算法课本,我在读关于递归关系的书,发现算法的复杂性很大。我跑过这条线 "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 “对于合并排序算法,我们得到递归方程: 如果n=2 对于b>0 我

我在读我的算法课本,我在读关于递归关系的书,发现算法的复杂性很大。我跑过这条线

"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
“对于合并排序算法,我们得到递归方程:
如果n<2,则t(n)=b
=2t(n/2)+bn,如果n>=2
对于b>0
我的回答是“我们怎么知道的?!”?!?!"

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

有人能解释一下b和两个2的来源吗?

好吧,这句话(大概)是讨论的结论,或者至少是对所讨论的算法的一句话。没有细节,我只能做出有根据的猜测,如下所示:

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

唯一有点奇怪的是,为什么出现的两个常量因子应该是相同的,这并不完全清楚,但big-O分析的一部分要点是常量因子最终并不重要。

合并排序算法可以总结为:

mergesort (array A) {
   mergesort (first half of A);
   mergesort (second half of A);
   merge the two halves and return;
}
合并两个长度为N的数组有一个O(N)算法,即对于某些常数b>0,其复杂度为bN

假设
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<2的情况(停止递归的基本情况)是微不足道的。

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

这是用于分治算法的


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

对问题的更新应该作为对问题的编辑,而不是答案。要回答您的查询,请查看文本中提到的合并排序算法,您将看到它对自身进行了两次递归调用,从而产生了两个子问题。