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

Java 找到大量下一个增量的最有效方法,java,algorithm,performance,coding-efficiency,Java,Algorithm,Performance,Coding Efficiency,我有一个编号长nbr=10000。我在增加和减少这个,增加或减少的数量取决于它的值。如果nbr>x,则nbr+=xx,如果nbr>y,则nbr+=yy等。根据其他因素,增量值(xx、yy等)将发生变化,增量值变化的限制(x、y等)也将发生变化。我想要一个函数public int incremasenbr(int nbr),它根据上述逻辑返回递增的数字,并尽可能高效地执行此操作。目前,我正在像下面这样实现它,但我感觉它不是很有效 private TreeMap<Integer, Intege

我有一个编号
长nbr=10000
。我在增加和减少这个,增加或减少的数量取决于它的值。如果
nbr>x
,则nbr+=xx,如果
nbr>y
,则nbr+=yy等。根据其他因素,增量值(xx、yy等)将发生变化,增量值变化的限制(x、y等)也将发生变化。我想要一个函数public int incremasenbr(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));
    }
私有树映射在NBR\u增量\u映射之上;
私有整数GetIncrementValueUpperNBR(整数nbr){
//查找低于特定价格的有效增量
Map.Entry Entry=高于nbr_increment_Map.lastEntry();
while(条目!=null){
如果(价格>=entry.getKey()){
返回条目.getValue();
}
entry=高于nbr\u increment\u map.lowerEntry(entry.getKey());
}
//否则返回最小增量大小
返回overnbr_increment_map.get(overnbr_increment_map.firstKey());
}
公共整数getNextNbrAbove(整数编号){
返回nbr+this.GetIncrementValueOver nbr(nbr));
}

您可以在对数时间内通过查找下限来完成

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());
}
您需要存储
x+1
而不是
x
,因为
floorrentry
返回的最大键小于或等于给定键。当
nbr
值为
>x
时,我们在这里递增


希望有帮助

您可以通过查找下限在对数时间内完成此操作

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());
}
您需要存储
x+1
而不是
x
,因为
floorrentry
返回的最大键小于或等于给定键。当
nbr
值为
>x
时,我们在这里递增


希望有帮助

树映射方法的复杂性为log(N),其中N是边界数。如果边界的数量足够小,这可能是完全可以接受的

您在评论中提到,您的数字空间受到了相当大的限制。在只有一百万个可能的数字的情况下,您还可以使用数字作为索引构建一个查找表(数组)。这将为您提供O(1),但查找表确实会产生自己的构建成本和内存消耗

根据表更改之间的查找次数,查找表可能更快或更慢


除非您的程序在运行时花费相当大的一部分时间调用getIncrementValueOvernbr(),否则您可能是在浪费时间。无论使用哪种方法,只要它揭示了大量的时间花费在考虑重写它。

您的树型方法具有log(n)的复杂性,其中n是边界的数目。如果边界的数量足够小,这可能是完全可以接受的

您在评论中提到,您的数字空间受到了相当大的限制。在只有一百万个可能的数字的情况下,您还可以使用数字作为索引构建一个查找表(数组)。这将为您提供O(1),但查找表确实会产生自己的构建成本和内存消耗

根据表更改之间的查找次数,查找表可能更快或更慢


除非您的程序在运行时花费相当大的一部分时间调用getIncrementValueOvernbr(),否则您可能是在浪费时间。无论使用哪种方法,只要它揭示了花费了大量的时间考虑重写它。

永远不要检查<代码>结果> />代码> -调用- 1或1。
Comparable.compareTo
的合同允许任何负数,如果该对象低于提供的对象,则允许任何正数,如果该对象大于提供的对象。除此之外:性能是最重要的还是您更想要一个简洁易读的解决方案?价格在什么范围内?它们是整数是正确的吗?性能是优先考虑的。谢谢你指出比较的问题,实际上这是我的错别字。数字的范围在0到1000000之间,有时我重新映射地图。如果很少进行再填充并且调用方法非常频繁,你可以考虑预先计算一个包含1000000个NBR的增量值的<代码> INT[IN] INSARTING/<代码>,并使用<代码> NBR+INCARTALS计算结果[NBR]。具有O(1)复杂性。不过,这种方法需要大约4mib的RAM。此外,使用这种方法,方法代码会变得非常短,并且很可能早晚都会内联,因此即使是方法调用也可以成为无成本的。切勿检查
比较的结果,以便再次调用-1或1。
Comparable.compareTo
的合同允许任何负数,如果该对象低于提供的对象,则允许任何正数,如果该对象大于提供的对象。除此之外:性能是最重要的还是您更想要一个简洁易读的解决方案?价格在什么范围内?它们是整数是正确的吗?性能是优先考虑的。谢谢你指出比较的问题,实际上这是我的错别字。数字的范围在0到1000000之间,有时我重新映射地图。如果很少进行再填充并且调用方法非常频繁,你可以考虑预先计算一个包含1000000个NBR的增量值的<代码> INT[IN] INSARTING/<代码>,并使用<代码> NBR+INCARTALS计算结果[NBR]。
具有O(1)复杂性。不过,这种方法需要大约4mib的RAM。此外,使用这种方法,方法代码变得非常短,并且很可能迟早会内联,因此即使是方法调用也不会产生任何成本。