ホームページ >バックエンド開発 >PHPチュートリアル >PHP二分探索の詳しい解説
二分検索は、半検索とも呼ばれ、比較回数が少なく、検索速度が速く、平均パフォーマンスが高いという利点があります。欠点は、検索するテーブルが順序付きテーブルである必要があることと、挿入であることです。削除は難しいです。したがって、二分探索法は、頻繁には変更されないが、頻繁に検索される順序付きリストに適しています。まず、テーブル内の要素が昇順に配置されていると仮定し、テーブルの中央の位置に記録されているキーワードと検索キーワードを比較し、両者が等しい場合は検索が成功します。テーブルを最初と最後の 2 つのサブテーブルに分割します。 If 中央の位置に記録されたキーワードが検索キーワードより大きい場合は、前のサブテーブルがさらに検索され、そうでない場合は次のサブテーブルが検索されます。さらに遠く。条件を満たすレコードが見つかって検索が成功するまで、またはサブテーブルが存在しない場合は検索が失敗するまで、上記のプロセスを繰り返します。
配列が増加配列であると仮定すると、まず配列の中間位置を見つける必要があります。
1つ。中間位置を知るには、開始位置と終了位置を知ってから、中間位置の値を取得してこの値と比較する必要があります。
2つ。中央の値が指定した値より大きい場合は、この時点で値が中央より前にあることを意味します。中央より前なので、変更する必要がある値は です。このとき、終了位置の値は「We're in the middle at this point」となるはずです。
3つ。一方、中間の値が与えた値より小さい場合は、与えられた値が中間の位置より後であることを意味します。このとき、後半の値は であるため、再度 2 つに分割する必要があります。中間値の後なので、変更する必要がある値は開始位置の値です。指定された値が見つかるまで、この時点の開始位置の値が中間位置になります。
4つ。または、中間値が最初の開始位置または終了位置に等しい場合 (この場合、指定された値が見つかりません)、コードを使用して実装しましょう~
//循环实现
function getValue($num,$arr)
{
//查找数组的中间位置
$length=count($arr);
$start=0;
$end=$length;
$middle=floor(($start+$end)/2);
//循环判断
while($start>$end-1)
{
if($arr[middle]==$num)
{
return middle+1;
}elseif($arr[middle]<$num)
{
//如果当前要查找的值比当前数组的中间值还要打,那么意味着该值在数组的后半段
//所以起始位置变成当前的middle的值,end位置不变。
$start=$middle;
$middle=floor(($start+$end)/2);
}else{
//反之
$end=$middle;
$middle=floor(($start+$end)/2);
}}
return false;
}
//递归实现
/*
* 从数组中获取元素值
* @param1 int $num,要查找的目标值
* @param2 array $arr,要查找的数组
* @param3 int $start,查找的起始位置
* @param4 int $end,查找的结束位置
* @return mixed,找到了返回位置,没找到返回false
*/
function getValue4($num,$arr,$start = 0,$end = 100){
//采用二分法查找
$middle = floor(($end + $start) / 2);
//判断
if($arr[$middle] == $num){
//已经找到了,递归的出口
return $middle + 1;
}elseif($arr[$middle] < $num){
//要查找的元素在数组的后半段
$start = $middle + 1;
//边界值
if($start >= $end){
//没有找到,但是已经超出边界值,递归出口
return false;
}
//调用自己去查找:递归点
return getValue4($num,$arr,$start,$end); //getValue4($num,$arr,51,100)
}else{
//要查找的元素在数组的前半段
$end = $middle - 1;
//判断边界值
if($end < 0)return false;
//调用自己:递归点
return getValue4($num,$arr,$start,$end); //getValue4($num,$arr,0,49)
}
//都没有找到
return false;
}以上がPHP二分探索の詳しい解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。