我有一個整數列表,我想規範化它們,使他們的總和是比方說100.因此,例如(1, 1, 1, 1) --> (25, 25, 25, 25)
。這是比較容易實現的:正常化整數
int sum = calcSum(list);
double factor = 100.0/sum;
List<Integer> newList = Lists.newArrayList();
for (Integer i : list) {
newList.add(i*factor);
}
這工作只要總和爲100除數很不幸,這映射(1, 2) --> (33, 66)
,而不是(1, 2) --> (33, 67)
。我可以添加四捨五入到我的解決方案
newList.add(i*factor); --> newList.add(Math.round(i*factor));
不幸的是,這仍然有問題,(1, 1, 1) --> (33, 33, 33)
。我意識到在這種情況下,我需要添加某種tiebreaker,並隨意選擇其中一個條目爲34.假設比率爲(0.334, 0.333, 0.333)
我想選擇第一個元素,而不是任意選擇。即使在一個完美的領帶的情況下,隨機選擇一個元素增加1是不夠好,因爲我可能不得不增加超過1.
我可能會想出一個不雅的算法,反覆選擇最大值(沒有選擇相同的元素兩次,並與任意tiebreaker),並增加它,直到總和爲100.有沒有更好的算法來做到這一點?
看起來您可以使用Bresenham算法背後的想法。 – biziclop