找到大数下一个增量的最有效方法

时间:2017-03-24 18:58:16

标签: java algorithm performance coding-efficiency

我有一个号码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));
    }

2 个答案:

答案 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(),否则你可能会浪费你的时间。描述使用该方法的任何内容,并且只有在显示花费大部分时间时才考虑重写它。