Java Apache Commons数学2.2百分位错误?

Java Apache Commons数学2.2百分位错误?,java,algorithm,math,apache-commons,percentile,Java,Algorithm,Math,Apache Commons,Percentile,我不能100%确定这是一个bug还是我做的不对,但是如果你给百分位提供了大量数据,这些数据与相同的值一致(见下面的代码),那么评估方法需要很长时间。如果你给了百分位,随机值的计算时间会短得多 如下文所述,中位数是百分位数的子位数 private void testOne(){ int size=200000; int sameValue=100; 列表=新的ArrayList(); 对于(int i=0;i

我不能100%确定这是一个bug还是我做的不对,但是如果你给百分位提供了大量数据,这些数据与相同的值一致(见下面的代码),那么评估方法需要很长时间。如果你给了百分位,随机值的计算时间会短得多

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

private void testOne(){
int size=200000;
int sameValue=100;
列表=新的ArrayList();
对于(int i=0;i
众所周知,对于某些数据集,某些算法可能表现出较慢的性能。通过在执行操作之前随机化数据集,实际上可以提高性能

由于percentile可能涉及对数据进行排序,我猜您的“bug”实际上不是代码中的一个缺陷,而是一个性能较慢的数据集的表现。

这是介于2.0版和2.1版之间的一个错误,已修复了多年


2.0版确实涉及到数据排序,但在2.1版中,他们似乎已经切换到了一个新版本。然而,在他们的实现中,这导致了具有许多相同值的数据的一些不良行为。基本上,他们使用了>=和,就我所知,你的代码甚至没有使用百分位数-只有中位数。@Jon-
中位数
百分位数
的一个子类@Alnitak:很公平。对于OP来说,这样说是个好主意,或者直接使用百分位数。鉴于百分位使用排序数组,它可能是排序算法中边缘情况的一种表现形式。例如,经典的快速排序需要花费大量时间对已经排序的数组进行排序。如果运行Arrays.sort(double[]),它返回得相当快。虽然这是一个很好的猜测,但这确实是一个bug。看见
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));
}