あなたが探しているのはSortedMap
とそのメソッドtailMap
とfirstKey
です。詳細については、ドキュメントを参照してください。
プレーン配列に対するこのアプローチの利点は、範囲を維持しやすいことです。実行時のコストがほとんどかからずに、いつでも新しい境界を挿入/削除できます。配列では、両方の並列配列を完全にコピーすることを意味します。
アップデート
両方のバリアントのコードを作成し、ベンチマークしました。
@State(Scope.Thread)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public class BinarySearch
{
static final int ARRAY_SIZE = 128, INCREMENT = 1000;
static final int[] arrayK = new int[ARRAY_SIZE];
static final String[] arrayV = new String[ARRAY_SIZE];
static final SortedMap<Integer,String> map = new TreeMap<>();
static {
for (int i = 0, j = 0; i < arrayK.length; i++) {
arrayK[i] = j; arrayV[i] = String.valueOf(j);
map.put(j, String.valueOf(j));
j += INCREMENT;
}
}
final Random rnd = new Random();
int rndInt;
@Setup(Level.Invocation) public void nextInt() {
rndInt = rnd.nextInt((ARRAY_SIZE-1)*INCREMENT);
}
@GenerateMicroBenchmark
public String array() {
final int i = Arrays.binarySearch(arrayK, rndInt);
return arrayV[i >= 0? i : -(i+1)];
}
@GenerateMicroBenchmark
public String sortedMap() {
return map.tailMap(rndInt).values().iterator().next();
}
}
ベンチマーク結果:
Benchmark Mode Thr Cnt Sec Mean Mean error Units
array thrpt 1 5 5 10.948 0.033 ops/usec
sortedMap thrpt 1 5 5 5.752 0.070 ops/usec
解釈: 配列検索は 2 倍の速さであり、この係数は配列サイズ全体で非常に安定しています。提示されたコードでは、配列サイズは 1024 で、係数は 1.9 です。また、係数が 2.05 の配列サイズ 128 でテストしました。