問題:對于一列有序陣列,如何判斷給出的一個值,該值是否存在于陣列,
思路:判斷是否存在,最簡單是,直接回圈該陣列,對每一個值進行比較,但是對于有序陣列來說,這樣寫就完全沒有利用好“有序”這一特點,
所有我們使用到“二分法查找”,
//有序陣列為 $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

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/83264.html
標籤:PHP
下一篇:PHP檔案上傳
