具有分而治之的阵列中的最大值

Posted

技术标签:

【中文标题】具有分而治之的阵列中的最大值【英文标题】:Maximum in a array with divide and conquer 【发布时间】:2016-10-16 06:28:35 【问题描述】:

假设这是作业,我不知道为什么我不能使用标签“作业”,所以为了清楚起见,我将它写在这里。

我必须编写一个方法“int maximum(int[] a, int l, int r)”,它使用分而治之的方法在从 'l' 到 'r' 的数组 A 中找到最大值。 基本情况将是当 A 内部有一个元素时,因此如果 A.length == 1,则返回该元素。递归部分应该将数组分成两个子数组,从 A[l] 到 A[mid],从 A[mid+1] 到 A[r]。理论上我可以接受,但我不断收到 ***Error,我不明白为什么。

public class Maximum 
public static void main(String[] args) 
    int[] A = 0, 5, 281, 3, 9, 4, 88, 16, 17, 60;
    int l = 0;
    int r = A.length-1;
    System.out.println("Maximum of the array: "+maxArray(A, l, r));

public static int maxArray(int[] A, int l, int r) 

    //Assuming that the index of array is '0' and not '1', l is 0. Else, put 1.

    if (A.length == 1) 
        return A[l];
    

    int mid = r/2;
    int maxLeft = 0;
    int maxRight = 0;

    maxLeft = maxArray(A, l, mid);        //Here is the ***Error!
    maxRight = maxArray(A, mid+1, r);

    if (maxLeft < maxRight) 
        return maxRight;
     else 
return maxLeft;


【问题讨论】:

你不能写作业标签,因为作业是不允许的 @SmallLegend Homework is 是允许的,但它要求显示尝试的代码并明确指定问题。要求在没有任何代码的情况下完成作业的问题,以及包含代码但不是特定问题的问题都是题外话。 对我来说是个消息谢谢@Kayaman,我向Monok道歉 不用道歉,我们都是来教和学的。我也明白为什么我不能,所以谢谢@Kayaman 这很简单,不管“意图”如何,都可以问一个好问题。问题是家庭作业问题通常质量低下(典型的例子是一个只包含家庭作业的“问题”),但这并不意味着家庭作业问题本身对 SO 来说是题外话。 【参考方案1】:

mid的计算有问题。

应该是

int mid = (l+r)/2;

除此之外,

if (A.length == 1) 
    return A[l];

应该是

if (l == r) 
    return A[l];

因为您总是将原始数组传递给您的方法,所以如果原始数组只有一个元素,A.length 只能为 1。

【讨论】:

天哪,现在可以了!非常感谢!你能详细解释一下我的错误吗? @Monok 如果要在 [l,r] 范围内找到中间索引,则不是 r/2。它是 (l+r)/2。如果 l==0,它只会是 r/2。至于停止条件,我在答案中添加了解释。 完全理解,再次感谢。我没有意识到,如果我有一个范围,我已经知道如何计算中间值,所以我试图找到另一种错误的方法。【参考方案2】:

在分治法中,当我们计算中间元素的索引时,平均值是第一个和最后一个索引的总和除以2。

另外,当左元素索引与右元素索引相同时,这意味着数组只有一个元素,然后我们只返回单个数组元素。

您的解决方案是:

 public class Helloworld

 public static void main(String []args)
  int[] A = 0, 5, 281, 3, 9, 4, 88, 16, 17, 60;
int l = 0;
int r = A.length-1;
System.out.println("Maximum of the array: "+maxArray(A, l, r));
 

 public static int maxArray(int[] A, int l, int r) 

//Assuming that the index of array is '0' and not '1', l is 0. Else, put 1.

if (l == r)  // checking codition/
    return A[l]; 


int mid = (l+r)/2; // Calculating mid.
int maxLeft = 0;
int maxRight = 0;

maxLeft = maxArray(A, l, mid);        
maxRight = maxArray(A, mid+1, r);

if (maxLeft < maxRight) 
    return maxRight;
 else return maxLeft;

【讨论】:

你应该得到 2k :) 嘿,我正在努力理解这一点。我可以知道为什么 maxRight 需要为 mid+1 +1 的原因吗?谢谢。 maxRight 是另一半的新低,所以另一半 mid+1 为低,r 为高。

以上是关于具有分而治之的阵列中的最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用分而治之以及如果一个子阵列占多数,组合阵列占多数以找到多数元素的事实?

通过递归分而治之的数组中的最大数字

c_cpp 使用分而治之的方法查找未排序数组中的最小值和最大值

最大子数组:分而治之

使用分而治之的范式提高算法效率

使用分而治之的方法找到最大值和最小值