原理
- 二分查詢也成為折半查詢,是一種高效率的查詢方法。
- 折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列
步驟
- 確定要查詢的區間
- 確定要二分的參照點
- 區間內選取二分點
- 根據二分點的值,綜合左右間情況以及求見的目的,捨去一般無用的區間
- 繼續在有效區間重複上面的步驟
PHP實現
function binary_search($arr, $number)
{
if (!is_empty($arr) || empty($arr)) {
return -1;
}
// 初始變數值
$len = count($arr);
$lower = 0;
$high = $len - 1;
// 最低點比最高點大就退出
while ($lower <= $high) {
// 以中間點作為參照點比較
$middle = intval(($lower + $high) / 2);
if ($arr[$middle] > $number) {
// 查詢數比參照點小,捨去右邊
$high = $middle - 1;
} elseif ($arr[$middle] < $number) {
// 查詢樹比參照點大,捨去左邊
$lower = $middle + 1;
} else {
return $middle;
}
}
return -1;
}
/**
* @param array $arr
* @param int $number
* @param int $lower
* @param int $hith
*/
function binary_search_recursion(&$arr, $number, $lower, $high)
{
$middle = intval(($lower + $high) / 2);
if ($lower > $high) {
return -1;
}
if ($number > $arr[$middle]) {
return __FUNCTION__($arr, $number, $middle, $high);
} elseif ($number < $arr[$middle]) {
return __FUNCTION__($arr, $number, $lower, $middle - 1);
} else {
return $middle;
}
}
時間複雜度
- 有序陣列中如果使用暴力的演算法去查詢,也就是逐個遍歷比較,那麼時間複雜度是O(n)
- 但是,用二分查詢後,因為每次可以捨去一半查詢區間,所以會將時間複雜度減少到O(logn),演算法更優。
本作品採用《CC 協議》,轉載必須註明作者和本文連結