【问题标题】:Big-O & Runing Time of this algorthm , how can convert this to an iterative algorthm该算法的 Big-O 和运行时间,如何将其转换为迭代算法
【发布时间】:2018-08-08 14:59:13
【问题描述】:

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

}

【问题讨论】:

  • 你做了什么分析?
  • 我写了分治算法,但我不知道 Big-O 中的运行时间,以及如何转换为迭代算法
  • 返回时为什么要第二次拨打RecursiveMaxOfArray?只需缓存返回结果并返回 that.
  • 数组排序了吗?

标签: algorithm recursion iteration big-o


【解决方案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 定理应用于新的递归。

【讨论】:

    【解决方案2】:

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

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

    嗯,有一个非常简单的解决方案可以解决您希望自己得到的问题 - 遍历列表并跟踪您迄今为止看到的最小值。

    不过,我猜你的问题最好这样表述:

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

    这方面有很多问题和答案,而不仅仅是在 StackOverflow 上,所以我建议你对这个主题做更多的研究。如果这是您打算采用的方法,These blog posts on converting recursion to iteration 可能是一个不错的起点,尽管我无法为它们担保,因为我还没有阅读它们。我实际上只是在谷歌上搜索了“将递归转换为迭代”,选择了第一个结果,然后找到了链接到博客文章的所有四个部分的这个页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多