ホームページ >バックエンド開発 >PHPチュートリアル >PHPの順序付きリスト検索・補間検索アルゴリズムの手順の詳細な説明

PHPの順序付きリスト検索・補間検索アルゴリズムの手順の詳細な説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-19 09:56:461858ブラウズ

今回は、PHP の順序付きテーブル検索と補間検索アルゴリズムの手順について詳しく説明します。PHP の順序付きテーブル検索と補間検索アルゴリズムの 注意点 について、実際の事例を見てみましょう。

はしがき:

先ほど二分探索を紹介しましたが、考えてみましょう、なぜ半分に折らなければならないのでしょうか? 4分の1以上に折りたたむのではなく?

例えば、英語の辞書で「apple」を検索するとき、辞書を開いたときに無意識のうちに表紙を見たり裏ページを見たりしませんか? 「zoo」をもう一度チェックする場合、どのようにチェックしますか?もちろん辞書の真ん中から調べ始めるのではなく、ある目的を持って前や後ろに目を向けます。

同様に、たとえば、0 から 10000 までの値の範囲が小さいものから大きいものまで均等に分散された 100 個の要素を持つ 配列 で 5 を見つけたい場合、当然、小さい配列の添字を最初に考慮して検索を開始します。

上記の分析は、実際には二分探索を改良した補間探索のアイデアです。

基本的な考え方:

検索方法は、検索対象のキーワードキーとルックアップテーブル内の最大および最小のレコードのキーワードを比較することに基づいています。その核心は補間計算式にあります。まずは半分の探索の計算を見てみましょう。 式:

補間探索は、その 1/2 を改善し、次の計算計画に変更することです:

補間探索アルゴリズムの中核は、補間の計算式:

$num - $arr[$ lower]
——————————————
$arr[$high] - $arr[$ lower]

コード:

<?php
//插值查找(前提是数组必须是有序数组) 事件复杂度 O(logn)
//但对于数组长度比较大,关键字分布又是比较均匀的来说,插值查找的效率比折半查找的效率高
$i = 0; //存储对比的次数
//@param 待查找数组
//@param 待搜索的数字
function insertsearch($arr,$num){
 $count = count($arr);
 $lower = 0;
 $high = $count - 1;
 global $i;
 while($lower <= $high){
  $i ++; //计数器
  if($arr[$lower] == $num){
   return $lower;
  }
  if($arr[$high] == $num){
   return $high;
  }
  // 折半查找 : $middle = intval(($lower + $high) / 2);
  $middle = intval($lower + ($num - $arr[$lower]) / ($arr[$high] - $arr[$lower]) * ($high - $lower)); 
  if($num < $arr[$middle]){
   $high = $middle - 1;
  }else if($num > $arr[$middle]){
   $lower = $middle + 1;
  }else{
   return $middle;
  }
 }
 return -1;
}
$arr = array(0,1,16,24,35,47,59,62,73,88,99);
$pos = insertsearch($arr,62);
print($pos);
echo "<br>";
echo $i;

概要:

時間計算量の観点からは、これもO(logn)ですが、長い順序付きリストと比較的均等な分布を持つルックアップテーブルの場合、キーワードを使用すると、内挿検索アルゴリズムの平均パフォーマンスは、「適切なキーワードを多数検索」の 2 倍になります。逆に、配列内の分布が {0, 1, 2, 2000, 2001,. 。 。 999998, 999999} この種の非常に不均一なデータでは、内挿検索の使用はあまり適切な選択ではない可能性があります。

自分で例を作りました:

$arr = array(0,1,2,2000,2001,2002,2003,2004,5555,69666,99999,100000);
echo "位置:".binsearch($arr,5555);
echo "<br>";
echo "比较次数:".$i;
$i = 0; //重置比较次数
echo "<br>";
echo "位置:".insertsearch($arr,5555);
echo "<br>";
echo "比较次数:".$i;

結果出力:

位置:8
比较次数:2
位置:8
比较次数:9

極端に不均一なデータの場合、補間探索効率は半分探索よりも低いことがわかります。

追記 その他の関連記事はオンラインでご覧いただけます!

binsearch()推奨書籍:

PHP 長時間接続のユースケース分析

PHP データ エクスポートの実装方法

以上がPHPの順序付きリスト検索・補間検索アルゴリズムの手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。