質問: 順序付き配列の場合、指定された値が配列内に存在するかどうかを確認する方法。
アイデア: 存在するかどうかを判断する最も簡単な方法は、配列を直接ループして各値を比較することです。しかし、順序付けされた配列の場合、このように記述すると、「順序付けされた」機能を完全に活用できません。
すべて「二分探索」を使用します。
//有序数组为 $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 が中間値の右側、つまり開始値の前にある可能性があることを意味します。再割り当てする必要があります = 中間値 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 class="brush:php;toolbar:false">'; 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 は 4 番目の要素値の添字 3
推奨ビデオチュートリアル:「php チュートリアル」
以上がPHP は、順序付けられた配列に特定の値が含まれているかどうかを調べます (二分探索)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。