【发布时间】:2016-06-15 08:52:03
【问题描述】:
我知道这是一个愚蠢的问题,但我根本不明白。 这段代码取自http://somnathkayal.blogspot.in/2012/08/finding-maximum-and-minimum-using.html
public int[] maxMin(int[] a,int i,int j,int max,int min) {
int mid,max1,min1;
int result[] = new int[2];
//Small(P)
if (i==j) max = min = a[i];
else if (i==j-1) { // Another case of Small(P)
if (a[i] < a[j]) {
this.max = getMax(this.max,a[j]);
this.min = getMin(this.min,a[i]);
}
else {
this.max = getMax(this.max,a[i]);
this.min = getMin(this.min,a[j]); }
} else {
// if P is not small, divide P into sub-problems.
// Find where to split the set.
mid = (i + j) / 2;
// Solve the sub-problems.
max1 = min1 = a[mid+1];
maxMin( a, i, mid, max, min );
maxMin( a, mid+1, j, max1, min1 );
// Combine the solutions.
if (this.max < max1) this.max = max1;
if (this.min > min1) this.min = min1;
}
result[0] = this.max;
result[1] = this.min;
return result;
}
}
假设数组是 8,5,3,7,我们必须找到最大值和最小值, max和min的初始值=arr[0]=8; 第一次名单将分为8,5 我们用 max=8 和 min=8 调用 MaxMin,因为 i==j-1,我们会得到 max=8,min=5,
下次列表会分为[3,7], min1=max1=arr[mid+1]=3, 我们用 max=3 和 min=3 调用 MaxMin。由于 i 等于 j-1,我们将得到 max=7,min=3,
接下来在 max1,max 和 min1,min 之间进行比较, 这是我的困惑, 这里的 max 和 max1 的值分别是 8 和 7,但是如何? 我们没有在任何地方修改 max1,那么它的值是 7,
根据我的理解,我们调用了 MaxMin,max=3 和 min=3,然后更新了 max=7 和 min=3,但是我们没有返回这些更新的值,那么 max1 和 min1 的值是如何更新的, 我被困在这里,请解释一下。 谢谢。
【问题讨论】:
-
调用 this.mix 和 this.max 时是否有外部最小值和最大值?
-
@Lordofdark-这是代码somnathkayal.blogspot.in/2012/08/…的链接
-
我不会称这段代码为“分而治之”——从理论上讲,它相当于一个 for 循环,但在实际效率方面更差(额外的函数调用),并且更加冗长。它确实细分了问题,但与明显的替代方案相比,它征服的很少。二分搜索、Karatsuba、FFT - 是更好的例子。
标签: java arrays max min divide-and-conquer