阵列上每个中位数的总和

时间:2013-08-19 01:50:47

标签: java algorithm heap median

我想得到每个中位数的总和......是的,这是作业...我的答案是错的,但我无法弄清楚为什么它没有给我正确的答案。有什么建议吗?

package coursera_week6_p2;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;

public class Coursera_week6_p2 {

public static void main(String[] args) throws FileNotFoundException {
    Scanner s = new Scanner(new File("/Users/michellepai/Downloads/Median.txt"));
    int[] array = new int[10000];
    int i = 0;
    while (s.hasNextLine()) {
        array[i] = Integer.parseInt(s.nextLine());
        i++;
    }
    Arrays.sort(array);

    int m = 0;
    long med = 0;
    for (int k = 0; k < array.length; k++) {
        if (k % 2 == 0) {
            m = k/2;
        } else {
            m =(k-1)/2;
        }
        System.out.println("arrayIndex [" + k + "]: "+ array[k] +" , median index: " + m +           " , median: " + array[m]);
        med = med + array[m];
        System.out.println("total: " + med);
        }
        System.out.println(med%10000);
    }
}

此问题的目标是实施“中位数维护” 算法(在关于堆应用程序的第5周讲座中介绍)。文本 file包含未排序顺序的1到10000之间的整数列表; 你应该把它视为一个数字流,一个接一个地到达。 令xi表示文件的第i个数,第k个中值mk是 定义为数字x1,...,xk的中位数。 (所以,如果k是奇数,那么mk 是((k + 1)/ 2)x1,...,xk中的最小数;如果k是偶数,那么mk就是 x1,...,xk中的第(k / 2)个最小数。) 在下面的框中,您应键入这些10000中位数的总和,模数 10000(即仅最后4位数)。也就是说,你应该计算 (M1 + M2 + M3 +⋯+ M10000)mod10000。

这就是我的结果......我终于得到了正确答案:D

public static void main(String[] args) throws FileNotFoundException {
    Scanner s = new Scanner(new File("/Users/michellepai/Downloads/Median.txt"));
    int[] array = new int[10000];
    int i = 0;
    while (s.hasNextLine()) {
        array[i] = Integer.parseInt(s.nextLine());
        i++;
    }
    int m = 0;
    long med = 0;
    for (int k = 0; k < array.length; k++) {
        //int k = 2;
        int temp[] = new int[k + 1];
        for (int j = 0; j <= k; j++) {
            temp[j] = array[j];
        }
        Arrays.sort(temp);
        if (k % 2 == 0) {
            m = k / 2;
        } else {
            m = (k - 1) / 2;
        }

        System.out.println("arrayIndex [" + k + "]: "+ array[k] +" , median index: " + m + " , median: " + array[m]);
        med = med + temp[m];
    }
    System.out.println(med % 10000);
}

1 个答案:

答案 0 :(得分:2)

我认为问题在于:

  

让xi表示文件的第i个数,第k个中位数mk定义为数字x1,...,xk的中位数

根据上面的定义,mk被定义为数字x1,...,xk的中值。 要计算mk,**您应该排序x1,...,xk,而不是整个数组。使用Arrays.sort(array);对整个数组进行排序后,xk不是文件的第i个。