6

我正在从文件中读取大量整数,最后我想从这些整数中获取一些基本统计数据(中位数、平均值、第 25 个百分位数、第 75 个百分位数等)。我可以随时随地计算其中的一些统计数字,但在我看来,计算第 25/75 个百分位数会很复杂。我认为最简单的方法是将整数放在一个列表中并从该列表中进行统计。但是,由于列表太大,它可能会因使用如此多的内存而减慢程序的速度。你们有什么建议吗?这就是我获取数据的方式和我想到的两个选项:

Scanner input = new Scanner(new File("name"));
ArrayList<Integer> lits= new ArrayList<Integer>();
while(input.hasNextLine()){
  list.add(Integer.parseInt(input.nextLine()));
}
doStatistics(list);

或者

Scanner input = new Scanner(new File("name"));
while(input.hasNextLine()){
   //I dont know how I would acomplish this for the percentile stats
   acqquireStats(Integer.parseInt(input.nextLine()));
}
4

2 回答 2

3

鉴于值的数量明显小于样本的数量,存储每个值的数量比存储每个值的数量更有意义。

Long[] samples = new Long[101];

while(input.hasNextLine()){
    try{
      samples[Math.max(0, Math.min(100, Integer.parseInt(input.nextLine())))];
    } catch (ParseException e){/*not a number*/}
}

这给您留下了仅由一个小数组表示的大量数据。

于 2012-06-14T18:01:05.333 回答
1

本文和 John D. Cook 是您最好的选择:

http://www.codeproject.com/Articles/33781/Calculate-Percentiles-in-O-1-space-and-On-time

于 2012-06-14T17:25:53.570 回答