该算法的Big-O&Runing Time,如何将其转换为迭代算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了该算法的Big-O&Runing Time,如何将其转换为迭代算法相关的知识,希望对你有一定的参考价值。
这个算法在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] ;
}
在每个阶段,大小为N的阵列被分成相等的一半。然后在大小为N / 2的数组上递归调用该函数三次。为什么三个而不是四个写的?因为if语句只输入其中一个子句。因此,递归关系是T(N) = 3T(N/2) + O(N)
,(使用Master theorem)给出O(N^[log2(3)]) = O(n^1.58)
。
但是,您不需要第三次调用它;只是将每个递归调用的返回结果缓存在局部变量中。递归关系中的系数3变为2;我将留给你在新的复发中应用Master定理。
还有另一个答案准确地描述了算法的运行时复杂性,如何确定它以及如何改进它,所以我不会专注于此。相反,让我们看一下你问题的另一部分:
我如何将其转换为[an]迭代算法?
嗯,有一个非常简单的解决方案,你希望自己可以自己 - 循环遍历列表并跟踪到目前为止你看到的最小值。
但是,我猜你的问题更好地表达为:
如何将递归算法转换为迭代算法?
关于这一点有很多问题和答案,而不仅仅是StackOverflow,所以我建议你对这个问题做更多的研究。如果这是你要采取的方法,These blog posts on converting recursion to iteration可能是一个好的起点,虽然我不能保证,因为我没有读过它们。我只是用谷歌搜索“将递归转换为迭代”,选择了第一个结果,然后找到了链接到博客文章的所有四个部分的页面。
以上是关于该算法的Big-O&Runing Time,如何将其转换为迭代算法的主要内容,如果未能解决你的问题,请参考以下文章
NTU课程笔记 MAS714 Big-O notations