bsearchはダイレクトサーチにはかなり適していますが、たとえば検索範囲が必要な場合は何を使用すればよいですか?
アップデート
たとえば、aとbの間の値の範囲を見つけたい場合(a> = x <b)。
アップデート
範囲の値を等しくすることはできません。したがって、array(10,20,30)があり、「15」を見つけようとしている場合、アドレス(ポインター)を最も近い最小範囲に取得します。この例では、これは範囲(10,20)です。
取るパラメータの1つは、bsearch
検索する要素の数です。したがって、たとえば100の代わりに、42で検索するようにします...
bsearch("foo", data, /*100*/42, sizeof *data, cmpfx);
更新後
私がすることは、手動(コードを書くことを意味する)の二分探索です。
アイデアは、(残りの)配列の中央の要素を下限と上限の両方と比較することです。それが小さい場合は、下限が小さい半分で再度検索されます。上限よりも大きい場合は、大きな半分で再度検索します。それ以外の場合は、範囲内の要素が見つかりました。
2回目の更新後
ポインタのペアを返したいですか?
それらを構造体の中にラップするか、ポインタのアドレスを関数...などに渡す必要があります。
しかし、これで検索が簡単になりました。値が見つかるまで(そして長さ0の範囲を返すまで)、または失敗するまで検索します。範囲は、最後に確認した配列値と、障害が発生した状況に応じて、いずれかの側の値、または配列の最後にいる場合はEMPTYの間です。
このbsearch()
関数は、ある条件に一致する単一の要素を見つけるように設計されています。マニュアルページによると:
RETURN VALUE
The bsearch() function returns a pointer to a matching member of the
array, or NULL if no match is found. If there are multiple elements
that match the key, the element returned is unspecified.
ここで重要なのは、キーに一致する要素が複数ある場合、返される要素は指定されていないということです。したがって、取得する要素が最初、最後、または範囲の中央のどこかにあるかどうかはわかりません。
AとBの間の配列で要素を検索するように要件を変更でき、配列にAが1つ、Bが1つだけあることを保証できる場合は、最初にAを検索してから、 B。
start = bsearch(A, array, N, sizeof(*array), compare);
end = bsearch(B, array, N, sizeof(*array), compare);
あなたはおそらくあなたが望んでいることを正確に行うためにあなた自身の関数を書かなければならないでしょう。