検索対象のキーではなく、次に大きな項目のインデックスを返すように、有名な二分探索アルゴリズムを変更したいと考えています。
したがって、4 つのケースがあります。
- キーがすべての項目より小さい場合、0 を返します。
- キーがすべてのアイテムより大きい場合、items.length を返します。
- キーがインデックス x にある場合、x+1 を返します。
- キーが見つからない場合は、次に大きいキーのインデックスを返します。
例えば:
data = { 1, 3, 5, 7, 9, 11 };
- 0 を検索すると 0 が返されます。
- 11 または 12 を検索すると、6 が返されます。
5 または 6 を検索すると 3 が返されます。
while (low <= high) { mid = (low + high) / 2; if (data[mid] < val) low = mid + 1; else if (data[mid] > val) high = mid - 1; else { break; } }
現在、低い値と高い値を調べることで機能しています。そうするための興味深いコードはありますか?
編集 !!!
これが私がそれを機能させる方法です:
if (low <= high)
found = (low + high) / 2 + 1;
else if (low >= data.length)
found = data.length ;
else if (high < 0)
found = -1;
else
found = low;
もっとエレガントな方法を探しています!
編集 II !!!
重複がない場合、このコードは機能します。重複のケースを処理するには、最初の if 条件を変更する必要があります。
if (low <= high)
found = (low + high) / 2 + 1;
より大きな要素が見つかるまで繰り返します。