Arrays 在一个大小为N的数组中寻找最大值的分治策略的时间分析

Arrays 在一个大小为N的数组中寻找最大值的分治策略的时间分析,arrays,algorithm,time-complexity,divide-and-conquer,Arrays,Algorithm,Time Complexity,Divide And Conquer,我编写了一个算法,在大小为N的数组中查找最大数: find_max (s,e,A){ if (s != e){ mid = floor((e-s)/2) + s; a = find_max(s,mid,A); b = find_max(mid + 1, e,A); if (a > b){ return a; } return b; } return A[s]; } 我想知道时间成本,T(n)方程,以及该算法是否渐进地更大、更

我编写了一个算法,在大小为N的数组中查找最大数:

find_max (s,e,A){
if (s != e){
    mid = floor((e-s)/2) + s;
    a = find_max(s,mid,A);
    b = find_max(mid + 1, e,A);
    if (a > b){
        return a;
    }
    return b;
}
return A[s];
}

我想知道时间成本,T(n)方程,以及该算法是否渐进地更大、更快或等效于非分治策略(按顺序比较每个数字)

我想出了一些答案,但我认为它们是不对的


谢谢大家!

当您有一个元素时,您的算法的成本为1(返回唯一元素的成本)

T(1)=1

否则,它是两个递归调用,将输入拆分为一半,再加上固定数量的操作:

T(n)=T(楼层(n/2))+T(天花板(n/2))+c

使用该公式,我们可以找到以下渐近解:

T(n)=O(n)


e、 g.线性算法。因此,渐进地,算法的迭代版本和递归版本需要相同的时间。

代码执行n-1比较,这与代码的迭代版本相同,并且是最优的(请参阅“网球比赛拼图中的网球比赛数”)

您的代码使用n-1比较的证据如下所示:

T(1) = 0

T(n) = 1 + T(floor(n/2)) + T(n - floor(n/2))
      = floor(n/2)-1 + n - floor(n/2)-1 + 1 (by induction)
      = n - 2 + 1
      = n - 1

递归代码使用O(logn)存储,而迭代版本使用O(1)存储。

请记住,在N个元素的未排序数组中查找max元素的解决方案的空间是N本身。问题的下界是输入的维数,Ω(n)的线性关系,因此不可能找到比这更好的东西