回答:
明らかに、補間検索を行うには、順序よりも多くの種類のキーが必要です-キーを比較して、どちらが大きいかを判断するだけでなく、キーで計算を行い、可能性のある距離を推定できる必要があります少ない。
データセットのプロパティに関する限り、それは主に1つのプロパティになります。キーが可能性の範囲全体に合理的に均等に(または少なくとも予測可能に)分配される可能性。それがなければ、補間検索は実際にはバイナリ検索よりも遅くなります。
たとえば、小文字の文字列をキーとして使用したデータセットを考えてみましょう。「x」で始まるキーがあると仮定します。内挿検索は、セットの終わり近くで検索を開始する必要があることを明確に示します。ただし、ほとんどのキーが実際に「z」で始まり、「a」から「y」までのほとんどのキーがない場合、検索するキーは実際にはセットの先頭に非常に近い場合があります。'w'で始まる文字列が存在する先頭に検索が近づくまで、かなりの回数の反復が必要になる場合があります。反復ごとにデータセットの最大10%のみが考慮対象から除外されるため、キーが 'w'で始まる開始点に近づくまでに数回の反復が必要になります
対照的に、バイナリ検索は中央で開始され、2回目の反復で4分の1マークに到達し、3回目の1/8マークに到達します。そのパフォーマンスは、キーのスキューの影響をほとんど受けません。キーが均等に分散されているかのように、各反復により、データセットの半分が考慮対象から除外されます。
ただし、補間検索をバイナリ検索よりも著しく悪化させるには、実際にはかなりゆがんだ分布が必要であることを急いで付け加えます。たとえば、かなりの量のローカライズされたクラスタリングが存在する場合でも、非常に優れたパフォーマンスを発揮できます。
また、補間検索では必ずしも線形補間を使用する必要はありません。たとえば、キーが非線形分布(たとえば、ベル曲線)に従うことがわかっている場合、補間関数でそれを考慮することはかなり簡単になり、均一な分布とほとんど変わらない結果を得ることができます。
a
ただし、で始まる単一の外れ値は、パフォーマンスを劇的に低下させます。
質問は、実際にはバイナリ検索よりも優れた補間関数を簡単に思い付くことができるのではないかと思われます。
big-O表記を使用すると、サイズNのデータセットでの補間アルゴリズムのパフォーマンスはO(N)です。ただし、補間に使用される線形スケールでのデータの均一な分布を仮定すると、パフォーマンスはO(log log N)であることが示されます。
補間検索の実際のパフォーマンスは、プローブの数を減らしても、各プローブに必要なより複雑な計算を上回るかどうかに依存します。これは、各プローブがディスクシークを含み、補間演算よりもはるかに遅い、ディスク上の大きなソートされたファイルでレコードを見つけるのに役立ちます。
Bツリーなどのインデックス構造もディスクアクセス数を削減し、多くの種類のデータにインデックスを付けることができ、オンラインで更新できるため、ディスク上のデータのインデックス作成によく使用されます。それでも、特定のソートされているがインデックス付けされていないディスク上のデータセットを強制的に検索する場合は、補間検索が便利です。
バイナリ検索と補間検索はどちらも線形検索方法と見なされます。
それらは両方とも、検索されるリストがキーとして参照される列でソートされることを期待しています。これはとても重要です。
バイナリ検索は、並べ替えられた順序で保存されている限り、文字列または数値に対して機能します。バイナリ検索の背後にある主な考え方は、中間要素の調査に基づいているということです。補間検索はバリアントです。真ん中の要素を使用する代わりに、渡された値と比較する次の要素がどこにあるかを推測します。JB Kingが提供するリファレンスを参照してください解答や補間検索アルゴリズムは、次のキー値を計算する方法の詳細については、この回答では、以下のものを。
「補間検索は、均一な分布でソートされた配列順に配置された数値要素でのみ機能します(つまり、任意の連続する要素間の間隔はほぼ一定です」 )。