计算大型数组的平均中位数(最多100,000个元素)

时间:2018-10-20 01:11:57

标签: java

我需要一个大数组来计算平均中位数。我必须使用递归,没有循环,除了.length之外也没有点操作。

该数组最多只能分解为3个,分解的方式是:

  • 0的余数:每段应为[n / 3]个元素。
  • 1的余数:第一个和最后一个应该是[n / 3]个元素的舍入 向下,中间应该是[n / 3]个元素四舍五入
  • 2的余数:第一个和最后一个应该是[n / 3]个元素的舍入 向上,中间应该是[n / 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);

 }

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  • 余数为0表示range = 3n。根据规则,可以将数组分为[0, n][n + 1, 2n][2n + 1, 3n]。在这种情况下,每块的大小为n
  • 余数1表示range = 3n + 1。根据规则,可以将数组分为[0, n][n + 1, 2n + 1][2n + 2, 3n + 1]。第一块和最后一块的大小为n,中间块的大小为n + 1
  • 余数2表示range = 3n + 2。根据规则,可以将数组分为[0, n + 1][n + 2, 2n + 1][2n + 2, 3n + 2]。第一块和最后一块的大小为n + 1,中间块的大小为n

将数组分成3个部分后,可以递归地尝试查找每个部分的中值。我对您要使用中位数感到困惑,但我会让您知道。