该算法的Big-O&Runing Time,如何将其转换为迭代算法

问题描述 投票:0回答:2

这个算法在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] ;

}
algorithm recursion iteration big-o
2个回答
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定理。


0
投票

还有另一个答案准确地描述了算法的运行时复杂性,如何确定它以及如何改进它,所以我不会专注于此。相反,让我们看一下你问题的另一部分:

我如何将其转换为[an]迭代算法?

嗯,有一个非常简单的解决方案,你希望自己可以自己 - 循环遍历列表并跟踪到目前为止你看到的最小值。

但是,我猜你的问题更好地表达为:

如何将递归算法转换为迭代算法?

关于这一点有很多问题和答案,而不仅仅是StackOverflow,所以我建议你对这个问题做更多的研究。如果这是你要采取的方法,These blog posts on converting recursion to iteration可能是一个好的起点,虽然我不能保证,因为我没有读过它们。我只是用谷歌搜索“将递归转换为迭代”,选择了第一个结果,然后找到了链接到博客文章的所有四个部分的页面。

© www.soinside.com 2019 - 2024. All rights reserved.