php查詢演算法,PHP演算法之二分查詢

2021-10-25 22:34:52 字數 1239 閱讀 4282

二分查詢的定義

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

演算法的要求

從上面的定義我們可以知道,滿足該演算法的要求必須如下兩點:

必須採用順序儲存結構。

必須按關鍵字大小有序排列。

演算法的步驟

其實,二分查詢也還是比較容易理解的,大概就是一分為二,然後兩邊比較,保留有效區間,繼續一分為二查詢,直到找到或者超出區間則結束,所以二分查詢的基本步驟是:

確定要查詢的區間

確定要二分時的參照點

區間內選取二分點

根據二分點的值,綜合左右區間情況以及求解的目的,捨去一半無用的區間

繼續在有效區間重複上面的步驟

演算法原始碼

這裡,我主要採用遞迴和非遞迴兩種方法實現,具體如下:

首先第一種是非遞迴的演算法實現,演算法如下:

* 二分查詢演算法

* @param array $arr 待查詢區間

* @param int $number 查詢數

* @return int 返回找到的鍵

function binary_search($arr, $number) else if ($arr[$middle] < $number) else elseif ($number < $arr[$middle]) else {

return $middle;

演算法的使用

需求是在乙個排列好的區間($arr)中,查詢乙個數($number)的所在位置,所以,呼叫演算法查詢如下:

// 待查詢區間

$arr = [1, 3, 7, 9, 11, 57, 63, 99];

// 非遞迴查詢57所在的位置

$find_key = binary_search($arr, 57);

// 遞迴查詢57所在的位置

$find_key_r = binary_search_recursion($arr, 57, 0, count($arr));

// 輸出列印

print_r($find_key);

print_r($find_key_r);

時間複雜度分析

在有序陣列中如果用暴力的演算法去查詢,也就是逐個遍歷比較,那麼時間複雜度是o(n);但是,用二分查詢後,因為每次可以捨去一半查詢區間,所以會將時間複雜度減少到o(logn),演算法更優。

最後

PHP查詢演算法之二分查詢 折半查詢

折半查詢意為從把陣列從中間分成兩半,找到乙個中間值,然後進行判斷,首先這個陣列一定是從大到小或者從小到大排好序的。下面的 裡陣列是從小到大排序的。遞迴形式的 定義乙個從小到大排好序的陣列 arr 12 34 43 56 77 86 88 90 99 101 要查詢的數字 num 88 count c...

PHP 二分查詢演算法

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。param array arr 待查詢區間 param int number 查詢數 param int lower 區間最低點 param in...

php二分查詢演算法

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。資料一分為二,然後兩邊比較,保留有效區間,繼續一分為二查詢,直到找到或者超出區間則結束,所以二分查詢的基本步驟是 確定要查詢的區間 確定二分時的參...