ソートされたデータを必要とするバイナリ検索が線形検索よりも優れていると考えられるのはなぜですか?


20

線形検索は単純なアプローチであり、漸近的な複雑さのために、バイナリ検索はパフォーマンスよりも優れているといつも聞いています。しかし、バイナリ検索の前に並べ替えが必要な場合、線形検索よりも優れている理由を理解できませんでしたか?

線形検索はでO(n)あり、バイナリ検索はO(log n)です。これが、バイナリ検索の方が優れていると言う根拠のようです。ただし、バイナリ検索ではO(n log n)、最適なアルゴリズムのためのソートが必要です。したがって、ソートが必要なため、バイナリ検索は実際には高速になりません。

著者は、単純な線形検索アプローチを使用するよりも挿入ソートで、アイテムを挿入する必要がある場所を見つけるためにバイナリ検索を使用する方が良いと示唆するCLRSを読んでいます。この場合、各ループ反復で、バイナリ検索を適用できるソート済みリストがあるため、これは正当化されているようです。しかし、検索が必要なデータセットについての保証がない一般的なケースでは、ソート要件のために実際にバイナリ検索を使用していないのは線形検索よりも悪いですか?

私が見落としている実用的な考慮事項はありますか?または、ソートに必要な計算時間を考慮せずに、バイナリ検索は線形検索よりも優れていると見なされますか?


6
他の多くの事柄と同様に、それは次のようになります:「それは依存します...;)」
ジェフB

リストが既に並べ替えられている場合、線形検索の方が優れていると考えていますか?それはここで考慮すべきことかもしれません。
JBキング

3
タイトルを変更することを考えている人には、並べ替えたデータに関する部分を削除しないでください。これを削除すると、これはまったく別の質問のように見えます。
アシームBansal

回答:


53

線形検索よりもバイナリ検索の方が優れていることを見落としている実用的な考慮事項はありますか?

はい-O(n log n)ソートを1回だけ行う必要があります。その後、O(log n)バイナリ検索を何度でも実行できますが、線形検索は毎回O(n)です。

もちろん、これは同じデータで実際に複数の検索を行う場合にのみ利点です。しかし、「1回書き込み、頻繁に読み取る」シナリオは非常に一般的です。


一度だけ何かをするのであれば、それを最適化する意味はあまりありません。

14

基本的な前提は、検索を1回もしないことです。

したがって、同じデータを複数回検索する必要がある場合は、1回並べ替えるだけで、バイナリ検索を利用できます。

頻繁に検索してデータを変更する場合は、新しいエントリがリストにソートされるソート済みリストを使用する価値があります。

したがって、基本的にバイナリ検索は、再ソートの必要なしに同じリストを複数回検索する場合に優れています。

検索する前に毎回ソートする必要がある場合、利点はありません。

リストが既に並べ替えられている(またはほぼ並べ替えられている)場合、非常に高速な並べ替えアルゴリズムがあることに注意してください。ほとんどのパフォーマンスの決定では、ソートされていないリストが必要です。


2
頻繁に検索して頻繁に挿入する場合は、より複雑なデータ構造(バイナリツリーなど)を調べることができます。
MarkJ

@MarkJ元のポスターの基本的な質問は、リスト内の検索に関するものでした。そうでなければ、あなたと完全に同意します。
ウーヴェプロナス

7

ソート済みのリストを作成したら、毎回リストを再ソートする必要はありません。つまり、O(log n)個以上の検索がある場合、事前にソートすることで利益が得られます(O(n log n + k log n)vsO(k*n)


5

2つの電話帳を想像してください。

1つの電話帳の名前はアルファベット順になっています。目的のエントリを見つけるには、中央で開き、エントリを確認してから、オーバーショットまたはアンダーショットに応じて前後に移動します。

もう一方の電話帳には、名前がランダムに並んでいます。目的のエントリを見つけるには、最初から始めて、目的のものが見つかるまで続けます。

2番目の本は、適度な大きさの都市で機能しますか?


3

線形検索よりもバイナリ検索の価値は文脈的だと思います。大量の順序付けされていないデータセットから始めて、そこから少数のアイテムのみを抜き取る計画がある場合、バイナリ検索のソートと実行は遅くなります。ただし、アプリケーションの存続期間中に順序付きリストを維持し、定期的にアクセスする場合、バイナリ検索がはるかに優れた方法です。


3

他の多くの人が答えたように、ソート手順は1回しか実行できず、実際の検索は何度でも実行できるため、バイナリ検索が本当に望ましいです。ただし、nの特定の値(つまり特定の入力サイズ)の場合、バイナリ検索は常に線形検索よりもパフォーマンスが高くなります(1回の実行でも)。

「転換点」は、漸近的な複雑さの方程式を解くことによって計算されます。

n log n + log n = n

することができますようにウルフラムアルファで見るための数値があるのnは、バイナリ検索や並べ替えだけでは常に速く線形検索よりであることを保証していること。もちろん、あなたのケースで機能するn実際の値は、推定が難しいかもしれない多くの要因に依存します。

Mark Probstによるこの興味深い記事によると、現在のプロセッサの優れた詳細なパフォーマンス測定が含まれています。

整数のソートされた配列を検索する必要があり、パフォーマンスが本当に非常に重要である場合、配列のサイズが約64要素未満であれば線形検索を使用し、それ以上であればバイナリ検索を使用します。


2

素人の言葉で:

100億のアイテムを含む順序付けられていないリストがあり、探しているアイテムが最後のアイテムである場合、100億のアイテムを読むことになります。

バイナリ検索の場合、インデックス作成は1回だけ実行できます。正しい位置に後で挿入して、順序を維持できます。


2

「バイナリ検索の方が良い」多くの正当な理由が既にリストされていますが、ユーザーの観点から利点を見ることができます。

通常、ソートされた挿入を実行するとき、データ入力アクション間で小さな待機時間が分割されても十分に生きることができますが、「検索」は可能な限り高速にする必要があります。ユーザーの観点からは、ソートされた挿入とバイナリ検索を組み合わせることで、最高のユーザーエクスペリエンスが得られます。

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