以下の配列は、小さなサイズ (5000 未満) の重複 (一意の正の整数を含む) なしで並べ替えられ、交差 (以下を参照) は何十億回も呼び出されるため、マイクロ最適化は重要です。この記事C
では、言語で以下のコードを高速化する方法をうまく説明しています。
int i = 0, j = 0, c = 0, la = a.length, lb = b.length;
intersection = new int[Math.min(la, lb)];
while (i < la && j < lb) {
if (a[i] < b[j]) i++;
else if (a[i] > b[j]) j++;
else {
intersection[c] = a[i];
i++; j++; c++;
}
}
int[] intersectionZip = new int[c];
System.arraycopy(intersection, 0, intersectionZip, 0, c);
Java では、これらの低レベルの命令を呼び出すことは不可能だと思います。しかし、彼らは「ブランチレス実装を使用してこのアプローチを改善することが可能です」と述べています。どうやってそれをするでしょうか?を使用していswitch
ますか?それともa[i] < b[j]
、整数オペランドでの二項演算との置換a[i] > b[j]
またはa[i] == b[i]
比較でしょうか?
二分探索アプローチ (複雑さを伴うO(la log(lb))
) は、よりも でla
はないため、当てはまりません。ステートメントを変更する方法が興味深い。<<
lb
if