Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung der PHP-Binärsuche

Detaillierte Erklärung der PHP-Binärsuche

怪我咯
怪我咯Original
2017-07-14 15:05:222698Durchsuche

Binäre Suche, auch als halbe Suche bekannt, hat den Vorteil weniger Vergleiche, eine schnelle Suchgeschwindigkeit und eine gute durchschnittliche Leistung. Der Nachteil besteht darin, dass die nachzuschlagende Tabelle geordnet sein muss Tabelle und EinfügenLöschenSchwierig. Daher eignet sich die binäre Suchmethode für geordnete Listen, die sich nicht häufig ändern, aber häufig durchsucht werden. Unter der Annahme, dass die Elemente in der Tabelle in aufsteigender Reihenfolge angeordnet sind, vergleichen Sie zunächst das in der mittleren Position der Tabelle aufgezeichnete Schlüsselwort mit dem Suchschlüsselwort. Wenn die beiden gleich sind, ist die Suche erfolgreich. Andernfalls wird der Datensatz in der mittleren Position verwendet Teilen Sie die Tabelle in zwei Untertabellen, die erste und die letzte. Wenn das in der mittleren Position aufgezeichnete Schlüsselwort größer als das Suchschlüsselwort ist, wird die vorherige Untertabelle weiter durchsucht, andernfalls wird die nächste Untertabelle durchsucht weiter. Wiederholen Sie den obigen Vorgang, bis ein Datensatz gefunden wird, der die Bedingungen erfüllt, wodurch die Suche erfolgreich ist, oder bis die Untertabelle nicht mehr vorhanden ist. In diesem Fall schlägt die Suche fehl.

Die binäre Suchmethode erfordert, dass dasArray ein geordnetes Array ist

Angenommen, unser Array ist ein zunehmendes Array, müssen wir zuerst finden das Array Die mittlere Position.

Eins. Um die Mittelposition zu kennen, müssen Sie die Startposition und die Endposition kennen und dann den Wert der Mittelposition nehmen, um ihn mit unserem Wert zu vergleichen.

Zwei. Wenn der Mittelwert größer als unser angegebener Wert ist, bedeutet dies, dass unser Wert zu diesem Zeitpunkt erneut in zwei Teile geteilt werden muss. Da er vor der Mitte liegt, ist der Wert, den wir ändern müssen Zu diesem Zeitpunkt sollte der Wert der Endposition sein. An diesem Punkt befinden wir uns in der Mitte.

Drei. Wenn andererseits der Mittelwert kleiner als der von uns angegebene Wert ist, bedeutet dies, dass der angegebene Wert nach der Mittelposition liegt. Zu diesem Zeitpunkt muss der Wert des letzten Teils erneut durch zwei geteilt werden, da dies der Fall ist Nach dem Mittelwert ist der Wert, den wir ändern müssen, der Startpositionswert. Der Wert der Startposition zu diesem Zeitpunkt sollte zu diesem Zeitpunkt unsere Mittelposition sein, bis wir den angegebenen Wert finden.

Vier. Oder der Zwischenwert entspricht der anfänglichen Startposition oder der Endposition (in diesem Fall wird der angegebene Wert nicht gefunden). Verwenden wir Code, um ihn zu implementieren ~

//循环实现
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;
     }


Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der PHP-Binärsuche. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn