该算法的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,如何将其转换为迭代算法的主要内容,如果未能解决你的问题,请参考以下文章

仍然不了解 Big-O 与最坏情况时间复杂度

NTU课程笔记 MAS714 Big-O notations

在树结构的 Big-O 表示法中:为啥有些来源引用 O(logN) 而有些引用 O(h)?

数据库索引及其 Big-O 表示法

如何将理论效率与实践示例进行比较[关闭]

Big-O 表示法和编码