1

値が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 などを取得するにはどうすればよいですか?

4

2 に答える 2