1. 程式人生 > 實用技巧 >二分查詢法

二分查詢法

<?php
/**
 * @param array $arr    遞增數字陣列
 * @param int   $number 待查詢的數字
 * @return int          返回找到的鍵
 */
function binary_search($arr,$number){
    // 非陣列或陣列為空,返回-1
    if(!is_array($arr)||empty($arr)){
        return -1;
    }
    // 初始化變數值
    $len = count($arr);
    $lower = 0;
    $high = $len - 1;
    
// 最低點比最高點大就退出 while($lower<=$high){ //以中間點作為參照點 $middle = intval(($lower+$high)/2); if($number < $arr[$middle]){ $high = $middle - 1; // 查詢數比參照點小,則捨去右邊 }else if ($number > $arr[$middle]){ $lower = $middle + 1; // 查詢數比參照點大,則捨去左 邊 }else
{ return $middle; } } //未找到,返回-1 return -1; } $arr = [1,3,5,7,9,11,16,26,27,29,34,35,39,65,97]; $find_key = binary_search($arr,27); echo '$arr['.$find_key.']='.$arr[$find_key];

在有序陣列中如果用暴力演算法查詢,也就是阻隔遍歷比較,那麼時間複雜度是O(n);

但是用二分法查詢,每次都會捨棄一般查詢區間,所以複雜度是O(logn);