3

我不是 100% 确定这是一个错误还是我没有做正确的事情,但是如果你给 Percentile 提供大量与相同值一致的数据(参见下面的代码),那么评估方法需要很长时间。如果你给 Percentile 随机值评估需要相当短的时间。

如下所述,中位数是百分位数的子类。

百分位数java文档

private void testOne(){
  int size = 200000;
  int sameValue = 100;
  List<Double> list = new ArrayList<Double>();

  for (int i = 0; i < size; i++)
  {
    list.add((double)sameValue);
  }
  Median m = new Median();
  m.setData(ArrayUtils.toPrimitive(list.toArray(new Double[0])));

  long start = System.currentTimeMillis();
  System.out.println("Start:"+ start);

  double result = m.evaluate();

  System.out.println("Result:" + result);
  System.out.println("Time:"+ (System.currentTimeMillis()- start));
}


private void testTwo(){
  int size = 200000;
  List<Double> list = new ArrayList<Double>();

  Random r = new Random();

  for (int i = 0; i < size; i++)
  {
    list.add(r.nextDouble() * 100.0);
  }
  Median m = new Median();
  m.setData(ArrayUtils.toPrimitive(list.toArray(new Double[0])));

  long start = System.currentTimeMillis();
  System.out.println("Start:"+ start);

  double result = m.evaluate();

  System.out.println("Result:" + result);
  System.out.println("Time:"+ (System.currentTimeMillis()- start));
}
4

2 回答 2

4

This is a known issue between versions 2.0 and 2.1 and has been fixed for version 3.1.

Version 2.0 did indeed involve sorting the data, but in 2.1 they seemed to have switched to a selection algorithm. However, a bug in their implementation of that led to some bad behavior for data with lots of identical values. Basically they used >= and <= instead of > and <.

于 2012-11-30T18:09:20.470 回答
3

众所周知,某些算法对于某些数据集可能表现出较慢的性能。实际上可以通过在执行操作之前随机化数据集来提高性能。

由于百分位数可能涉及对数据进行排序,我猜测您的“错误”并不是代码中的真正缺陷,而是表现较慢的数据集之一的表现。

于 2011-04-03T20:22:29.010 回答