【发布时间】:2014-07-05 00:15:58
【问题描述】:
我想在每次插入新的键/值对时有效地计算 HashMap 的两种值的均值。
假设我们目前有这个HashMap<Double, Double>:
3 4
5 6
8 8
1 3
6 8 <- Latest insertion
最新插入的是键6,值为8。
要计算的第一个平均值包括所有键小于插入键的值,即6。
这些是键3,5,1 的值4,6,3,所以平均值是(4+6+3)/3=4.3...
第二个平均值是“相反”,因此所有大于6的键的所有值的平均值。
带有值1 的键8 给出了这个平均值为8/1=8。
现在,插入一个新的密钥/对:
3 4
5 6
6 8
8 8
1 3
4 9 <- Latest insertion
同样,我们需要计算所有键值小于4 的值的平均值。
这些是键 3,1 的值 4,3,因此“较小的平均值”现在是 (4+3)/2=3.5
对于键/值对 5/6,6/8,8/8,“更大的平均值”现在是 (6+8+8)/3=7.3...。
一个简单的实现可能是这样的:
public class CalculateMapMean {
private double smallerMean = 0.0;
private double greaterMean = 0.0;
private HashMap<Double, Double> someMap = new HashMap<Double, Double>();
public void calculateMeans(double latestInsertedKey) {
double sumGreater = 0;
double sumSmaller = 0;
double sumGreaterCount = 0;
double sumSmallerCount = 0;
for (Map.Entry<Double, Double> entry : someMap.entrySet()) {
double key = entry.getKey();
double value = entry.getValue();
if (key > latestInsertedKey) {
sumGreater += value;
++sumGreaterCount;
}
else if (key < latestInsertedKey) {
sumSmaller += value;
++sumSmallerCount;
}
}
if (sumGreaterCount != 0) {
greaterMean = sumGreater / sumGreaterCount;
}
else {
greaterMean = 0.0;
}
if (sumSmallerCount != 0) {
smallerMean = sumSmaller / sumSmallerCount;
}
else {
smallerMean = 0.0;
}
}
}
问题是,是否可以使用TreeMap 或其他数据结构显着改进均值的计算,这样就不会在每次插入时遍历所有键。
有没有优雅的方式重用以前的计算?
【问题讨论】:
标签: java performance algorithm map mean