我正在编写一些代码来查找其值不超过 PHP 给定整数的最后一个键。
例如,数组(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”在每个循环中所指的键/值不会在这个二进制搜索过程中被遗忘并迷失吗?
我的意思是,似乎两个“__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 或其他结果?