問題:對于一列有序數組,如何判斷給出的一個值,該值是否存在于數組。
思路:判斷是否存在,最簡單是,直接循環該數組,對每一個值進行比較。但是對于有序數組來說,這樣寫就完全沒有利用好“有序”這一特點。
所有我們使用到“二分法查找”,
//有序數組為
$arr = array(2,5,66,87,954,1452,5865);
//查找值
$str = 1452;
//我們先定義 三個參數
$front = 0;//一個開始值下標
$end = count($arr) - 1;//一個結束值下標
$mid = intval(($front + $end) / 2);//中間值下標
1、第一次比較,我們直接判斷查找值str是否等于中間值mid,如果等于 直接返回 true;
2、如果查找值str大于中間值mid,則說明查找值str可能在中間值的右邊,即對開始值front需重新賦值 = 中間值mid + 1,結束值end不用變,依次中間值mid為新的開始值 + 結束值;
3、如果查找值str小于中間值mid,則說明查找值str可能在中間值的左邊,即開始值不用變,結束值end需重新賦值 = 中間值 - 1,依次中間值mid為開始值 + 新的結束值;
-----如上,對于傳入的開始值,結束值,中間值,進行比較。一旦開始值 大于 結束值 則說明沒有找到,結束查詢,反之等于就返回已找到。
具體代碼如下:
$str = 89;//查找值
$arr = [1,55,66,89,420];//有序數組
$ren = find($arr, $str);
echo 'pre>';
var_dump($ren);
function find($arr, $str){
$front = 0;//開始下標
$end = count($arr) - 1;//結束下標
while($front = $end){//結束值 大于 開始值 ,反之則退出
$mid = intval(($front + $end) / 2);//中間值下標
if($str == $arr[$mid]){
return $mid;//存在直接返回值的下標
}
if($str > $arr[$mid]){
$front = $mid + 1;//在前面
}
if($str $arr[$mid]){
$end = $mid - 1;//在后面
}
}
return false;
}
返回結果:89為第四個元素值下標3
int(3)
以上就是PHP查找一列有序數組是否包含某值(二分查找)的詳細內容,如果有任何補充可以聯系腳本之家小編。
您可能感興趣的文章:- PHP數組基本用法與知識點總結
- PHP 數組操作詳解【遍歷、指針、函數等】
- php數組指針函數功能及用法示例
- php數組函數array_push()、array_pop()及array_shift()簡單用法示例
- PHP字符串與數組處理函數用法小結
- PHP實現二維數組(或多維數組)轉換成一維數組的常見方法總結
- PHP實現提取多維數組指定一列的方法總結
- php實現快速對二維數組某一列進行組裝的方法小結
- PHP數組對象與Json轉換操作實例分析
- 如何在PHP中使用數組