我写了这个算法,在大小为N的数组中找到MAX号:
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)方程以及该算法是否渐近地更大,更快或等效于非分治策略(按顺序比较每个数字)。
我想出了一些答案,但我认为他们不对。
谢谢!
答案 0 :(得分:3)
当你有一个元素时,算法的成本为1(返回唯一元素的成本)
T(1)= 1
否则,它是两个递归调用,将输入分成一半,加上一定数量的操作:
T(n)= T(floor(n / 2))+ T(ceil(n / 2))+ c
使用master theorem,我们可以找到以下渐近解决方案:
T(n)= O(n)
e.g。线性算法。因此渐近地,算法的迭代版本和递归版本需要相同的时间。
答案 1 :(得分:3)
代码执行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(1)存储的迭代版本不同,您的递归代码使用O(log N)存储。
答案 2 :(得分:0)
请记住,在N个元素的未排序数组中查找max元素的解决方案空间本身就是N.问题是输入维数Ω(n)的边界线较低,因此找不到比这更好的东西是不可能的。