计算步骤以形成算法的递归关系

时间:2016-04-02 11:11:16

标签: algorithm code-analysis

我是算法分析的新手。我刚刚写了一个分而治之的算法,该算法应该在O(n)时间内从数组中找到一个最大数,并且我坚持形成它的重现。

以下是我的算法。

int findMax(int *A, int S, int E){

    if(S == E){        //1 unit of time
        return A[S];
    }
    else if(S == (E-1)){  // 1 unit of time
        if(A[S] > A[E]){  // 1 unit of time
           return A[S];
        }
        else{
           return A[E];
        }
    }

    mid = (S+E)/2;            // 1 unit of time     
    L = findMax(A, S, mid);
    R = findMax(A, mid+1, E);   // 1 unit of time 

    if(L > R){          // 1 unit of time
       return L;
    }
    else if(R > L){     // 1 unit of time
       return R;
    }

}

如果我错了,请告诉我。

我形成的复发是:

T(n)= 2T(n / 2)+7

我正确地将所有单位成本加起来7?

请帮我解决这个问题。感谢。

1 个答案:

答案 0 :(得分:1)

首先,并非所有代码路径都返回,让我们修改算法的最后一个if / else语句,如下所示:

if(L > R){          // 1 unit of time
   return L;
}
else {     // 1 unit of time
   return R;
}
  • T(1) = 1:这只是第一次比较并成功。
  • T(2) = 3:这将进行三次比较,以找到最多两个项目。
  • T(N) = 2*T(N/2) + 4, for N > 2

最后一个如下:

+1 for first if comparison, which will fail
+1 for the else if part of the first comparison block, which will also fail
+1 for computing the middle element
+2*T(N/2) for the recursive parts
+1 for the last comparison (single if)