我有一個數字long nbr = 10000
。我在增加和減少這個數字,增加或減少的數量取決於它的數值。如果nbr > x
,那麼nbr + = xx,如果nbr > y
,那麼nbr + = yy等。取決於其他因素,增量值(xx,yy等)將改變並且增量值改變的界限(x,y等)將會改變。我想要一個函數public int increaseNbr(int nbr),根據上面的邏輯返回一個遞增的數字,並儘可能有效地做到這一點。目前我正在執行它,但我有一種感覺,它不是非常有效。查找大數中下一個增量的最有效方法
private TreeMap<Integer, Integer> aboveNbr_increment_map;
private Integer getIncrementValueAboveNbr(int nbr) {
// finds the valid increment below a certain price
Map.Entry<Integer, Integer> entry = aboveNbr_increment_map.lastEntry();
while (entry != null) {
if (price>=entry.getKey()) {
return entry.getValue();
}
entry = aboveNbr_increment_map.lowerEntry(entry.getKey());
}
// otherwise return the lowest increment size
return aboveNbr_increment_map.get(aboveNbr_increment_map.firstKey());
}
public Integer getNextNbrAbove(int nbr) {
return nbr + this.getIncrementValueAboveNbr(nbr));
}
從不檢查'compareTo'調用結果再次-1或1. Comparable.compareTo'的合約允許任何*負數如果此對象低於提供的對象且* any *正數if這個對象更大。除此之外:性能問題最重要還是您想要簡潔易讀的解決方案?價格在多大範圍內?他們是整數是否正確? –
性能是重中之重。感謝您指出compareTo問題,實際上這是我的一個錯字。數字的範圍在0到1,000,000之間,我有時重新填充地圖。 – user3607022
如果很少進行重新填充,並且您的方法被非常頻繁地調用,那麼可以考慮預先計算一個長度爲1,000,000的int [] incvals],其中包含每個可能的nbr的增量值,並使用帶有* nbr + incvals [nbr] O(1)*複雜性。儘管這種方法需要大約4MB的RAM。另外使用這種方法,方法代碼變得非常短,並且很可能遲早會內聯,這樣即使方法調用也可以免費。 –