このアルゴリズムはまだバイナリ検索アルゴリズムと見なされますか?


13

2番目のコードカタ(毎回異なるメソッドを使用してバイナリ検索アルゴリズムを5回実装するように要求する)を実行している間に、次のように機能するわずかに異なるソリューションを思い付きました。

長さ100のソートされた配列があり、その開始フィールドに数字200が含まれ、その終了フィールドに数字400が含まれている場合、人間を研究する数学として、私は通常のバイナリ検索アルゴリズムのようなフィールド50ではなく、番号270です。

次に、配列のフィールド35の数が270の場合、35は検索したインデックスです。

そうでない場合は、取得した数値(280など)を比較し、配列の下部を取得する操作を繰り返します(したがって、開始フィールドに200を含み、終了フィールドに280を含む35フィールドがあります)。私が見つけた数は、私が探しているもの、または配列の上部よりも大きいです(たとえば260を取得しました:現在、65のインデックスがあり、最初のインデックスには260が含まれ、最後のインデックスには400が含まれています。取得した数値が検索している数値よりも小さい場合、このサブ配列のインデックス4(配列全体のインデックス39)。

問題は、このアルゴリズムをバイナリ検索アルゴリズムと見なすことはできますか?そうでない場合、独自の名前を持っていますか?


2
バイナリ検索であるかどうかは、純粋に意見の問題のようです。本質的に、あなたが与えることができる唯一の答えは、「ええ、それはバイナリ検索と呼ぶのに十分にバイナリ検索に近い」または「いいえ、そうではありません」です。引数が続きます。
デビッドリチャービー

回答:


22

これをバイナリ検索とは呼びません。

これは明らかにバイナリ検索に似ており、バイナリ検索の改良版と見るのが自然です。ただし、アルゴリズムの複雑さの特性が大きく異なるため、内挿検索では、データが均一に分布していると仮定してO(log(log(n))の実行時間を予想していますが、O(n)の最悪の場合の実行時間を確保することでこれを実現しています。

「バイナリ検索の最悪の場合の実行時間はO(log(n))です」よりも「境界要素の選択に応じて、バイナリ検索の最悪の場合の実行時間はO(log(n))」です。これは、補間検索をバイナリ検索アルゴリズムとして分類できないことを意味します。


補間検索がうまくいかないときに中断した場合、十分に線形なデータでO(log n)最悪の場合とO(log log n)を保持できます。私の推測では、「log nの試行後にターゲットが見つからなかった場合、バイナリ検索に切り替えた場合」のようなものは動作しますが、それを証明するのは面倒です。もちろん、これには基本的にバイナリ検索の2倍の時間がかかるキラー入力のクラスがあります。
スティーブジェソップ

そのキラー入力のアイデアは興味深いです。キラー入力が検索に悪影響を与えるのではなく(つまり、配列の終わり近くで分割することにより)、「分割可能な範囲」を配列の3分の2などに制限/トリミングする場合はどうなりますか。それは最悪の場合log3(n)を持ちますが、それでもlog(log)の最良の場合は楽しめます。
アンドリューガラッシュ

@SteveJessop漸近的な複雑さは完全な図ではないことに注意してください。O(log n)は非常に高速です。さらに、バイナリ検索は各ループでほとんど機能しません。したがって、すでに補間検索の問題は、各ループでより多くの作業を行うという事実を補うために非常に長い入力が必要なことです。あなたの提案はそれにさらに仕事を追加します。均一でないデータのO(n)を受け入れることができなかった場合、最良の解決策は、何らかのハイブリッドアプローチではなく、純粋なバイナリ検索を使用することだと思います。
-Taemyr

@SteveJessop:アルゴリズムを切り替える必要はありません。これは並行して行うことができます。範囲Rを指定すると、ポイントP1をバイナリ検索の通常の中点として、P2を内挿を使用して決定できます。これで3つのサブ範囲が得られましたが、いずれも元の範囲の半分を超えることはできません。P1とP2の両方に対してターゲット値を確認し、3つのサブレンジの
どれ

16

はい、これは 補間検索ます。いくつかの注意事項(計算モデルとデータの分布に依存)により、予想される実行時間はOログログn、バイナリ検索よりも優れています。


涼しい。質問は、コードカタに使用できるかどうかですが、それは私の問題です(笑)。私はそれをバイナリ検索よりも複雑だと思っていますが、そうではありません。
user6245072

数年前にログファイルのインデックスを作成するコードを書いたときに、これを一度発見しました。また、データについては、補間とバイナリスライスを交互に行うステップの方が、どちらのオプションよりも優れていることもわかりました。それに名前があるのか​​、それとも既知の効果なのかはわかりません。
ニールスレーター

@NeilSlaterはおそらく補間検索をヘッジしていますか?
スティーブコックス

@SteveCox:その用語を検索したところ、何も見つかりませんでした。:新しい質問としてあることを依頼することを決めたcs.stackexchange.com/questions/59750/...
ニール・スレーター

-1

正しい用語は、二分論の熟考された検索だと思います。

フラット配列を検索し、それに含まれる数字の想定されるフラット分布に基づいて、熟考したシークを行います。

これは、人が辞書で単語を検索する方法に対応します。しかし、データの分布が不規則な場合、非常に効率が悪くなる可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.