値がPHPの特定の整数以下の最後のキーを見つけるためのコードを書いています。
例: array(0=>1,1=>2,2=>3,3=>3,4=>4)。整数 3 を指定すると、キー 3 が見つかります。(二分探索)
そして、インターネットで二分探索に関する参考文献を探しました。
これは、値が C++ の特定の整数以上である最初のキーを見つけることです。
それは言います:
template <class _ForwardIter, class _Tp, class _Distance>
_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
const _Tp& __val, _Distance*)
{
_Distance __len = 0;
distance(__first, __last, __len);
_Distance __half;
_ForwardIter __middle;
while (__len > 0) {
__half = __len >> 1;
__middle = __first;
advance(__middle, __half);
if (*__middle < __val) {
__first = __middle;
++__first;
__len = __len - __half - 1;
}
else
__len = __half; // <======this line
}
return __first;
}
では、なぜ「__len = __half;」を使用するのでしょうか。「__len = __half + 1;」ではなく?
各ループで _middle が参照するキー/値は、このバイナリ検索プロセスで忘れられて失われませんか?
つまり、2 つの "__len" を合計しても完全な "__len" にならないようです。__middle がスキップされたようです。
PS: 元の質問に対する私の PHP コードは次のとおりです。
$cid_start = $count - 1;
$len = $count;
while($len > 0){
$half = $len >> 1;
$middle = $cid_start - $half;
if($c_index[$middle][1] > $time_start){
$cid_start = $middle - 1;
$len = len - $half - 1;
}else{
$len = $half + 1;
}
}
それはうまくいきますか?それともエラーになりますか?
また、配列に何も見つからない場合、結果として -1 などを取得するにはどうすればよいですか?