ホームページ  >  記事  >  バックエンド開発  >  再帰的実装と非再帰的実装の PHP バイナリ検索サンプル コード

再帰的実装と非再帰的実装の PHP バイナリ検索サンプル コード

怪我咯
怪我咯オリジナル
2017-07-14 15:04:032135ブラウズ

二分検索は、半検索とも呼ばれ、比較回数が少なく、検索速度が速く、平均パフォーマンスが高いという利点があります。欠点は、検索するテーブルが順序付きテーブルである必要があることと、挿入であることです。削除は難しいです。したがって、二分探索法は、頻繁には変更されないが、頻繁に検索される順序付きリストに適しています。まず、テーブル内の要素が昇順に配置されていると仮定し、テーブルの中央の位置に記録されているキーワードと検索キーワードを比較し、両者が等しい場合は検索が成功します。テーブルを最初と最後の 2 つのサブテーブルに分割します。 If 中央の位置に記録されたキーワードが検索キーワードより大きい場合は、前のサブテーブルがさらに検索され、そうでない場合は次のサブテーブルが検索されます。さらに遠く。条件を満たすレコードが見つかって検索が成功するまで、またはサブテーブルが存在しない場合は検索が失敗するまで、上記のプロセスを繰り返します。

二分探索の基本的な考え方は、n 個の要素をほぼ等しい 2 つの部分に分割し、a[n/2] と x を比較し、x=a[n/2] の場合に x を見つけ、アルゴリズムが終了することです。 xarraya の左半分で searchx を続行します。x>a[n/2] の場合は、次の x.

の右半分を検索します。配列a サンプルコードです

​​
// 递归二分查找
$arr = [1,2,3,4,11,12,124,1245];
function bin_recur_find($arr, $beg, $end, $v) {
	if ($beg <= $end) {
		$idx = floor(($beg + $end)/2);
		if ($v == $arr[$idx]) {
			return $idx;
		} else {
			if ($v < $arr[$idx]) {
				return bin_recur_find($arr, $beg, $idx - 1, $v);
			} else {
				return bin_recur_find($arr, $idx + 1, $end, $v);
			}
		}
	}
	return -1;
}
// 非递归二分查找
function bin_find($arr, $v) {
	$beg = 0;
	$end = count($arr) - 1;
	while ($beg <= $end) {
		$idx = floor(($beg + $end)/2);
		if ($v == $arr[$idx]) {
			return $idx;
		} else {
			if ($v < $arr[$idx]) {
				$end = $idx - 1;
			} else {
				$beg = $idx + 1;
			}
		}
	}
	return -1;
}

echo bin_recur_find($arr, 0, count($arr) - 1, 100) . "\n";
echo bin_find($arr, 100) . "\n";

以上が再帰的実装と非再帰的実装の PHP バイナリ検索サンプル コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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