这个algorthm在Big-O中的运行时间是多少以及我如何将其转换为迭代算法?
public static int RecursiveMaxOfArray(int[] array) {
int array1[] = new int[array.length/2];
int array2[] = new int[array.length - (array.length/2)];
for (int index = 0; index < array.length/2 ; index++) {
array1[index] = array[index];
}
for (int index = array.length/2; index < array.length; index++) {
array2[index - array.length/2] = array[index] ;
}
if (array.length > 1) {
if(RecursiveMaxOfArray(array1) > RecursiveMaxOfArray(array2)) {
return RecursiveMaxOfArray(array1) ;
}
else {
return RecursiveMaxOfArray(array2) ;
}
}
return array[0] ;
}
答案 0 :(得分:1)
在每个阶段,大小为N的数组被分成相等的一半。然后在大小为N / 2的数组上递归地将该函数称为三次次。为什么三个而不是四个写的?因为if语句只输入其中一个子句。因此,递归关系为T(N) = 3T(N/2) + O(N)
,(使用Master theorem)给出O(N^[log2(3)]) = O(n^1.58)
。
但是,您不需要第三次调用它;只是将每个递归调用的返回结果缓存在局部变量中。递归关系中的系数3变为2;我会留给你在新的复发时应用Master定理。
答案 1 :(得分:0)
还有另一个答案可以准确地描述算法的运行时复杂性,如何确定它以及如何改进它,因此我不会专注于此。相反,让我们看一下你问题的另一部分:
如何[将]转换为[an]迭代算法?
嗯,这是一个非常简单的解决方案,你希望自己可以获得 - 循环遍历列表并跟踪到目前为止你看到的最小值。
但是,我猜你的问题更好地表达为:
如何将递归算法转换为迭代算法?
关于这一点有很多问题和答案,而不仅仅是StackOverflow,所以我建议你对这个问题做更多的研究。 These blog posts on converting recursion to iteration可能是一个好的起点,如果这是你要采取的方法,虽然我不能保证,因为我没有读过它们。我只是用谷歌搜索“将递归转换为迭代”,选择了第一个结果,然后找到了链接到博客文章的所有四个部分的页面。