【问题标题】:sum of each median on the array数组中每个中位数的总和
【发布时间】:2013-08-20 18:07:30
【问题描述】:

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

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 周的堆应用讲座中介绍)。文本 文件包含从 1 到 10000 的整数列表,未排序; 您应该将其视为一串数字,一个接一个到达。 设 xi 表示文件的第 i 个编号,第 k 个中位数 mk 为 定义为数字 x1,…,xk 的中位数。 (所以,如果 k 是奇数,那么 mk 是 x1,…,xk 中第 ((k+1)/2) 个最小的数;如果 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);
}

【问题讨论】:

  • 输出结果:arrayIndex [9997]: 9998,中值索引:4998,中值:4999 总计:24995000 arrayIndex [9998]:9999,中值索引:4999,中值:5000 总计:25000000 arrayIndex [9999]:10000,中位数索引:4999,中位数:5000 总计:25005000 mod%10000:5000
  • while (s.hasNextLine()) { array[i] = Integer.parseInt(s.nextInteger());我++; s.nextLine(); }
  • 这个问题应该是用两个Binary Heaps或者一个BST来排序的;看起来你浪费时间上课是因为你没有学到很多东西。

标签: java algorithm heap median


【解决方案1】:

我认为问题出在这里:

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

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

【讨论】:

  • 由于Arrays.sort(array); 调用,它们应该已经按顺序排列,不是吗?
  • 但是如果你使用Arrays.sort(array),那么xk不是文件中原来的xk
  • 我想我知道你在说什么......所以我会在每次循环迭代中对数组的部分进行排序......我会尝试一下。
猜你喜欢
  • 2021-10-03
  • 1970-01-01
  • 2021-10-07
  • 2013-06-23
  • 2016-05-17
  • 2017-05-26
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多