分治算法数组中的最大个数

Posted

技术标签:

【中文标题】分治算法数组中的最大个数【英文标题】:Divide and Conquer Algorithm Max Number in Array 【发布时间】:2020-08-02 10:47:12 【问题描述】:

我是分治算法的新手,需要构造一个来找到数组中的最大数。下面是我的代码,我知道我需要将数组分成两部分,然后递归地找到每一部分的最大值。然后,结合并找到 2 个部分中最大的。下面是我的代码,我正在努力弄清楚如何递归调用该函数以找到每个部分的最大值。

private static int problem(int[] histogram) 
        int left = 0;
        int right = histogram.length -1;
        if (left == right)
            return left;
        
        int middle = (left + right)/2;

        return -1;
        

另外,这会是 O(n log n) 时间复杂度吗?

【问题讨论】:

【参考方案1】:
static int maxNumber(int[] array) 
        switch (array.length) 
            case 1:
              return array[0];
            case 2:
              return array[0] > array[1]
                ? array[0]
                : array[1];
            default:
              int left = maxNumber(Arrays.copyOfRange(array, 0, (int) (array.length / 2)));
              int right = maxNumber(Arrays.copyOfRange(array, (int) (array.length / 2), array.length));
              return left > right
                ? left
                : right;
        
    

如您所见,递归中最重要的部分是处理结束条件。告诉递归何时停止。在我们的例子中,当我们在一个数组中有一个或两个数字时我们停止(如果我们用 3 个元素划分数组,我们会得到一个 2 和一个 1)。

处理完结束条件后,剩下的就是递归。您将数组分成两部分并在每一部分上运行相同的函数。这会给你(最终)答案。

请记住,这种解决方案的空间复杂度非常高。每次调用递归函数时都会创建两个子数组。这可以通过各种方法签名来解决:maxNumber(array, start, end),它将首先被称为maxNumber(array, 0, array.length),并且每次递归运行,而不是复制数组,您只需使用相同的数组引用调用该方法,但您缩小了@ 987654324@ 和 end 指针。

【讨论】:

以上是关于分治算法数组中的最大个数的主要内容,如果未能解决你的问题,请参考以下文章

最大子数组-经典动态规划+分治算法

基础算法 分治法求最大最小元

分治算法解最大子序列和问题

整数数组和的分治算法

分治算法 ------最大子段和

分治策略 - 典型实例 - 选择问题