새 키/값 쌍이 삽입 될 때마다 HashMap
값의 두 가지 값을 효율적으로 계산하고 싶습니다.삽입 후 HashMap 값의 평균을 계산하십시오.
3 4
5 6
8 8
1 3
6 8 <- Latest insertion
최신 삽입 값 8
와 키 6
이었다
은 가정하자 우리는 현재이 HashMap<Double, Double>
있습니다.
계산할 첫 번째 평균은 키가 삽입 된 것보다 작은 모든 값 (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
또는 다른 datastrure 개선 할 수있는 경우이다 모든 삽입에.
전 계산을 재사용하는 우아한 방법이 있습니까?
@downvoter : 무엇이 잘못 됐는지 설명해 주시겠습니까? 이 접근법에 개념적 문제가있는 경우 아직 알려지지 않은 경우에는 도움이되지 않습니다. –
이 제안에 감사드립니다. 나는 비슷한 것을 생각하고 효율적인 해결책이 궁금했다. – Juergen
@Juergen 물론 물론 알 수는 없지만,이 문제에 대한 즉시 사용 가능한 데이터 구조가 존재한다면 매우 놀랄 것입니다. 물론 BBST 구현을 찾아 수정할 수도 있습니다. 올바르게 구현하는 것이 쉽지 않기 때문입니다! –