私は数字がlong nbr = 10000
です。私はこれを増減しており、増減する金額は金額に左右されます。 nbr > x
の場合は、nbr + = xx、nbr > y
の場合はnbr + = yyなどとなります。他の要因によっては、インクリメント値(xx、yyなど)も変化します。 、など)が変更されます。私は上記のロジックに従って増分された数値を返す関数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 *負の数を、このオブジェクトはより大きい。それとは別に、パフォーマンスが最も重要か、簡潔で読みやすいソリューションがほしいと思いますか?どの範囲で価格がありますか?それらが整数であることは間違いありませんか? –
パフォーマンスが優先されます。 compareToの問題を指摘してくれてありがとう、実際には私の部分の誤植でした。数字の範囲は0〜1,000,000の間であり、マップを再作成することがあります。 – user3607022
再構築がほとんど行われず、あなたのメソッドが頻繁に呼び出された場合は、可能な各nbrのインクリメント値を含む長さ1,000,000の 'int [] incvals'をあらかじめ計算しておき、' nbr + incvals [nbr] 'と* O(1)*複雑さ。このアプローチでは約4MBのRAMが必要です。さらに、このアプローチを使用すると、メソッドコードが非常に短くなり、メソッド呼び出しでさえコストがかからなくなるように、インライン化が遅くとも遅くなる可能性が非常に高くなります。 –