我有一个号码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));
}
答案 0 :(得分:2)
您可以使用floorEntry
通过查找下限来在对数时间内执行此操作。
private TreeMap<Integer, Integer> aboveNbr_increment_map;
private Integer getIncrementValueAboveNbr(int nbr) {
Entry<Integer, Integer> entry = aboveNbr_increment_map.floorEntry(nbr);
if(entry != null) {
return nbr + entry.getValue();
}
return aboveNbr_increment_map.get(aboveNbr_increment_map.firstKey());
}
在此商店之前,TreeMap
中的键值像这样 -
aboveNbr_increment_map.put(x + 1, xx);
aboveNbr_increment_map.put(y + 1, yy);
您需要存储x + 1
而不是x
,因为floorEntry
会返回小于或等于给定键的最大键。当nbr
值为> x
时,我们正在增加。
希望它有所帮助!
答案 1 :(得分:2)
您的TreeMap方法具有log(N)的复杂性,其中N是边界的数量。如果边界的数量足够小,这可能是完全可以接受的。
您在评论中提到您的号码空间相当受限制。只有一百万个可能的数字,您还可以使用数字作为索引来构建查找表(数组)。这会给你O(1),但查找表确实会产生自己的构建成本和内存消耗。
根据表更改之间的查找次数,查找表可能更快或更慢。
除非你的程序花费大量的运行时调用getIncrementValueAboveNbr(),否则你可能会浪费你的时间。描述使用该方法的任何内容,并且只有在显示花费大部分时间时才考虑重写它。