我需要一个大数组来计算平均中位数。我必须使用递归,没有循环,除了.length之外也没有点操作。
该数组最多只能分解为3个,分解的方式是:
一旦数组超过较小的值,我就对递归应该如何工作感到困惑。这就是我到目前为止所拥有的,
public static double medianAverage(double a, double b, double c) {
if ((a < b && b < c) || (c < b && b < a))
return b;
else if ((b < a && a < c) || (c < a && a < b))
return a;
else if(a == c) return b;
else if(b == c) return a;
else if(a == b) return c;
else
return c;
}
/**
* @return Returns median average
*/
public static double medianHelper(int[] a, int range, int start, int end) {
double avg = 0;
int n = range / 3;
// Base Cases:
if(range == 1) return a[start];
if(range == 2) return (a[start] + a[start + 1]) / 2.0;
if(range == 3) return medianAverage(a[start], a[start + 1], a[start + 2]);
if(range > 3) {
if(range % 3 == 0) {
double p1 = medianHelper(a, n, start, n);
double p2 = medianHelper(a, n, n, n * 2);
double p3 = medianHelper(a, n, n * 2, n * 3);
return medianAverage(p1, p2, p3);
}
if(range % 3 == 1) {
// TODO: Implement
}
if(range % 3 == 2) {
// TODO: Implement
}
}
return avg;
}
public static double median3(int[] a) {
return medianHelper(a, a.length, 0, a.length);
}
非常感谢您的帮助。
答案 0 :(得分:0)
range = 3n
。根据规则,可以将数组分为[0, n]
,[n + 1, 2n]
和[2n + 1, 3n]
。在这种情况下,每块的大小为n
。range = 3n + 1
。根据规则,可以将数组分为[0, n]
,[n + 1, 2n + 1]
和[2n + 2, 3n + 1]
。第一块和最后一块的大小为n
,中间块的大小为n + 1
。range = 3n + 2
。根据规则,可以将数组分为[0, n + 1]
,[n + 2, 2n + 1]
和[2n + 2, 3n + 2]
。第一块和最后一块的大小为n + 1
,中间块的大小为n
。将数组分成3个部分后,可以递归地尝试查找每个部分的中值。我对您要使用中位数感到困惑,但我会让您知道。