1

我正在尝试95% percentile从 Java 中的数据集进行计算。我的数据集会有这样的东西-

我将拥有一个ConcurrentHashMap像这样的键值对-

Key = 30
Value = 10

这意味着 10 个电话在 30 毫秒内返回

另一个例子-

Key = 20
Value = 5

这意味着 5 个呼叫在 20 毫秒内返回

所以从上面的地图中,我试图用 Java 计算 95% Percentile。

谁能从我上面的地图中提供任何示例如何在 Java 中做到这一点?谢谢您的帮助

更新代码:-

下面是我得到的代码,它将计算地图中的第 95 个百分位数-

/**
 * A simple method to log 95th percentile information
 */
private static void logPercentileInfo() {

    double total = 0;
    for (Map.Entry<Long, Long> entry : CassandraTimer.histogram.entrySet()) {
        long value = entry.getKey() * entry.getValue();
        total += value;
    }

    double sum = 0.95*total;

    double totalSum = 0;

    SortedSet<Long> keys = new TreeSet<Long>(CassandraTimer.histogram.keySet());
    for (long key : keys) {

        totalSum += CassandraTimer.histogram.get(key);

        if(totalSum >= sum) {
            System.out.println(key);
        }
    }

}

谁能看一下,让我知道我是否写对了?

4

2 回答 2

5

算法是:对 map 中的所有值求和,计算总和的 95%,按升序迭代 map 键,保持值的运行总和,当 sum 等于或超过先前计算的总和的 95% 时,键应该是第 95 个百分位。

于 2013-03-30T02:58:05.123 回答
3

您还可以查看 Apache Commons 的 DescriptiveStatistics

http://commons.apache.org/proper/commons-math/javadocs/api-3.2/org/apache/commons/math3/stat/descriptive/DescriptiveStatistics.html#getPercentile(double)

于 2014-03-05T05:17:38.470 回答