【问题标题】:what's the growth order of "find a peak" algorithm“找峰”算法的增长顺序是什么
【发布时间】:2021-11-19 01:15:51
【问题描述】:

您好,我需要应用与此类似的算法,但问题是我需要复杂度为 O(logn)。下面代码的复杂度据说是 O(logn),但据我了解,递归方法的增长顺序为 O(n)。所以问题是下面代码的增长顺序是什么。

  public static int findPeak(int[] array, int start, int end) {
        int index = start + (end - start) / 2;
    
        if (index - 1 >= 0 && array[index] < array[index - 1]) {
            return findPeak(array, start, index - 1);
        } else if (index + 1 <= array.length - 1 && array[index] < array[index + 1]) {
            return findPeak(array, index + 1, end);
        } else {
            return array[index];
        }
    }

【问题讨论】:

    标签: java algorithm time-complexity divide-and-conquer


    【解决方案1】:

    每个代码分支中输入数组的大小是函数中原始输入数组的一半。因此,如果T(n)是函数的时间复杂度,我们可以这样写:

    T(n) = T(n/2) + 1
    

    1 显示分支中的比较,T(n/2) 用于任何选定的分支。因此,T(n)O(log(n)) 中。

    【讨论】:

      【解决方案2】:

      它应该是 O(logn)。为简单起见(也是一种简单的思考方式),可以将其视为创建二叉树。在每个函数调用中,它将输入数组分成两半(在二叉树中创建节点)。因此,如果输入的数量为n,则二叉树具有log(n) 级别(一级 -> 一个函数调用)。

      还要注意,在一个函数调用中,只会发生一个递归调用(在 if 块或 else 块中,但不能同时在两者中)。这可能会让您感觉像o(n) 增长。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 2014-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        相关资源
        最近更新 更多