【问题标题】:Complexity of a divide and conquer recursive algorithm分而治之递归算法的复杂性
【发布时间】:2019-04-07 16:03:30
【问题描述】:

我正在尝试获取特定分治算法的复杂性,因此转置给定矩阵。

根据我一直在阅读的内容,我知道递归应该如下开始:

C(1) = 1
C(n) = 4C(n/2) + O(n)

我知道如何解决递归问题,但我不确定它是否正确。每次调用该函数时,将问题除以 2(vars fIni 和 fEnd),然后再调用另外 4 个函数。此外,最后,以 O(n²) 的复杂度调用交换,所以我很确定在上述递归中我没有考虑到这一点。

代码如下:

void transposeDyC(int **m,int f,int c, int fIni, int fEnd, int cIni, int cEnd){
    if(fIni < fEnd){
        int fMed = (fIni+fFin)/2;
        int cMed = (cIni+cFin)/2;

        transposeDyC(m,f,c, fIni, fMed, cIni, cMed);
        transposeDyC(m,f,c, fIni, fMed, cMed+1, cEnd);
        transposeDyC(m,f,c, fMed+1, fFin, cIni, cMed);
        transposeDyC(m,f,c, fMed+1, fFin, cMed+1, cEnd);

        swap(m,f,c, fMed+1, cIni, fIni, cMed+1, fEnd-fMed);
    }
}

void swap (int **m,int f, int c,int fIniA, int cIniA, int fIniB, int cIniB, int dimen){
    for (int i=0; i<=dimen-1; i++){
        for (int j=0; j<=dimen-1; j++) {
            int aux = m[fIniA+i][cIniA+j];
            m[fIniA+i][cIniA+j] = m[fIniB+i][cIniB+j];
            m[fIniB+i][cIniB+j] = aux;
        }
    }
}

我真的被递归和分而治之的复杂性所困。我不知道如何继续。

【问题讨论】:

    标签: c recursion complexity-theory


    【解决方案1】:

    你弄错了递归。它是 4C(n/2) + O(n2),因为当将矩阵连接回来时,对于大小为 n,总共有 n2 个元素。


    两种方式:

    1. Master Theorem

      这里我们有 a = 4, b = 2, c = 2, Logba = 2

      由于,Logba == c,这属于情况2,导致复杂度为O(ncLog n) = O(n2 记录 n)。


    1. 递归树可视化

      如果你尝试展开你的递归,你可以看到你正在解决大小为 n 的问题,方法是将它分解为大小为 n/2 的 4 个问题,然后做一个大小为 n2(在每个级别)。

      每个级别完成的总工作量 = 4 * 工作量 (n/2) + n2

      总级别数将等于您必须划分 n 大小的问题的次数,直到遇到大小为 1 的问题。这将简单地等于 Log2 n.

      因此,总工作量 = Log(n) (4*(n / 2) + n2),即 O(n2 Log n)。

    【讨论】:

      【解决方案2】:

      每个递归步骤将元素数量减少 4 倍,因此递归级别的数量将在 O(log n) 的数量级上。在每一层,交换的顺序都是O(n^2),所以算法的复杂度是O((n^2)(log n))。

      【讨论】:

      • 那么,递归应该如下? C(1) = 1 C(n) = 4C(n/2) + O(n²)
      猜你喜欢
      • 2019-10-05
      • 1970-01-01
      • 2019-05-16
      • 2012-07-08
      • 2013-10-12
      • 2023-03-03
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多