二分查詢法
阿新 • • 發佈:2020-08-18
<?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);