繁体   English   中英

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

[英]Calculating the average median of a large array (up to 100,000 elements)

我有一个很大的数组,需要用来计算平均中位数。 我必须使用递归,没有循环,除了.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);

 }

非常感谢您的任何帮助,谢谢。

  • 剩余的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个部分后,可以递归地尝试查找每个部分的中值。 我对中位数的处理方式感到困惑,但我会让您弄清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM