我正在編寫一些代碼來查找其值不超過PHP給定整數的最後一個鍵。例如,數組(0 => 1,1 => 2,2 => 3,3 => 3,4 => 4)。給定整數3,我會找到密鑰3.(二進制搜索)無法理解C++ STL中的1行代碼源:Lower_Bound/Upper_Bound
而且我查找了一些關於Internet上二進制搜索的參考。
我覺得這是爲了找到第一個鍵值不小於給定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或其他值作爲結果?
「*它會工作嗎?還是會出錯?*」您是否嘗試過運行它? – Celeo 2014-12-05 18:14:04
_「在每個循環中」_middle「所指的鍵/值是否會被忘記並在這個二進制搜索過程中丟失?」_它在'if'塊中處理... – 2014-12-05 18:14:13
沒有標準除非專門爲此目的而製作的圖書館資源應該被用作參考。你應該能夠找到更好的源代碼示例來學習。 – 2014-12-05 18:14:13