具有分而治之的阵列中的最大值
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 为高。以上是关于具有分而治之的阵列中的最大值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用分而治之以及如果一个子阵列占多数,组合阵列占多数以找到多数元素的事实?