二分查詢的定義

MaChao發表於2020-11-01

原理

  • 二分查詢也成為折半查詢,是一種高效率的查詢方法。
  • 折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列

步驟

  • 確定要查詢的區間
  • 確定要二分的參照點
  • 區間內選取二分點
  • 根據二分點的值,綜合左右間情況以及求見的目的,捨去一般無用的區間
  • 繼續在有效區間重複上面的步驟

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 協議》,轉載必須註明作者和本文連結

相關文章