學習PHP查詢一列有序陣列是否包含某值的方法

2020-08-11 18:00:36

問題:對於一列有序陣列,如何判斷給出的一個值,該值是否存在於陣列。

思路:判斷是否存在,最簡單是,直接回圈該陣列,對每一個值進行比較。但是對於有序陣列來說,這樣寫就完全沒有利用好「有序」這一特點。

相關學習推薦:(視訊)

所有我們使用到「二分法查詢」,

//有序陣列爲

$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中文網其它相關文章!