二分探索アルゴリズムを実装してください。
二分探索アルゴリズムは、配列を半分に分割することを繰り返し、探している値が含まれる半分だけを残すことで、配列の中から目的の値を見つけ出します。 これにより、目的の値が見つかるまで、あるいは候補となる場所がすべてなくなるまで、その値がありうる場所をすばやく絞り込んでいけます。
二分探索は、配列がソートされているときにだけ使えます。
アルゴリズムは次のようなものです。
例を見てみましょう。
次のソート済みの配列から、数値23を探すとしましょう:[4, 8, 12, 16, 23, 28, 32]。
[23, 28, 32]が残ります。[23]。解答は、テストケースに対して、Juliaの組み込みsearchsorted関数と同じ振る舞いをする必要があります。これはつまり、配列内で最初に見つけた一致する要素のインデックスを返すのではなく、配列内の最初の一致する要素のインデックスを下限、最後の一致する要素のインデックスを上限とする範囲を返すということです。ただし、解答を簡単にするために、対象の要素が繰り返されていないと仮定してもかまいません。ただし、複数一致のボーナスタスクのテストセットは例外です。
探している項目が配列にない場合は、その項目をソート済みの配列に挿入できるインデックスを下限とする空の範囲を返さなければなりません。空の範囲とは、上限が下限より小さい範囲のことです。
詳細については、searchsorted関数のドキュメントと例をお読みください。
searchsorted(a, x; by=<transform>, lt=<comparison>, rev=false)
Return the range of indices of a which compare as equal to x (using binary
search) according to the order specified by the by, lt and rev keywords,
assuming that a is already sorted in that order.
Return an empty range located at the insertion point if a does not contain
values equal to x.
See also: insorted, searchsortedfirst, sort, findall.
Examples
julia> searchsorted([1, 2, 4, 5, 5, 7], 4) # single match
3:3
julia> searchsorted([1, 2, 4, 5, 5, 7], 5) # multiple matches
4:5
julia> searchsorted([1, 2, 4, 5, 5, 7], 3) # no match, insert in the middle
3:2
julia> searchsorted([1, 2, 4, 5, 5, 7], 9) # no match, insert at end
7:6
julia> searchsorted([1, 2, 4, 5, 5, 7], 0) # no match, insert at start
1:0
by・lt・revをサポートするようにしましょう。byは配列のすべての要素に適用される変換を指定し、ltは比較を指定し、revは配列が逆順に並んでいるかどうかを指定します。これらのパラメーターを使用する場合、配列はすでにこれらのパラメーターでソートされていると仮定しなければなりません。詳細はsortのドキュメントを参照してください。