バイナリ検索があるのは、ソートデータが必要なのは、リニア検索よりも優れていると考えられますか?

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/204260

質問

リニア検索が素朴なアプローチであり、バイナリ検索は漸近的な複雑さのためにパフォーマンスが良くなっていると常に聞いた。しかし、バイナリ検索の前にソートが必要な場合は、リニア検索よりも優れているのは理由は決して理解できませんでしたか?

線形検索はO(n)とバイナリ検索であるO(log n)です。それはバイナリ検索が優れていると言っているという基礎と思われます。しかしバイナリ検索は、最良のアルゴリズムのためのO(n log n)のソートを必要とします。そのため、バイナリ検索は実際にはとしてとしてのではありません。

私は、著者がナイーブ線形検索アプローチを使用する代わりに挿入並べ替えであることを意味するCLRを読んでいます。アイテムを挿入する場所を見つけるためのバイナリ検索を使用することを意味します。この場合、これは各ループ反復と同じように、バイナリ検索を適用できるソートリストがあると思われます。しかし、検索する必要があるデータセットについての保証がない一般的な場合では、ソート要件のために線形検索よりも実際に悪いバイナリ検索を使用していない場合は?

それを見下ろすのは、線形検索よりも優れていますか?またはバイナリ検索は、ソートに必要な計算時間を考慮せずに、線形検索よりも優れていると見なされますか?

役に立ちましたか?

解決

線形検索よりもバイナリ検索をよりよくすることを見下ろす実際的な考慮事項はありますか?

はい - O(n log n)を一度だけ並べ替える必要があります。

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

他のヒント

基本的な仮定は、1つの検索をしないことです。

だからあなたが同じデータを複数回検索する必要があるならば、あなたは一度だけソートしてバイナリ検索から利益を得ることができます。

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

だから基本的にバイナリ検索は、頼りにせずに同じリストを複数回検索するときに良いです。

毎回並べ替える必要があるときは、利点がない。

goodリストがすでにソートされているとき(またはほぼソートされている)ソートアルゴリズムがあることに注意してください。ほとんどのパフォーマンス決定は、非符訳リストを期待しています。

ソートリストがあると、毎回並べ替える必要はありません。これは、O(Log N)を持っている場合(Log N)検索を事前に検索します。/ P>

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

1つの電話帳にはアルファベット順の名前があります。必要なエントリを見つけるには、途中で開き、エントリを確認してから、オーバーショットまたはアンダーショットかによって前後に移動します。

他の電話帳にはランダムな順序で名前があります。あなたが望むエントリを見つけるには、あなたがあなたが欲しいものを見つけるまであなたは始めと続けるまで続けます。

2番目の本は、どんな合理的にサイズの街でも機能しますか?

リニアサーチオーバーリニアサーチの値はコンテキストであると思います。あなたが莫大な順不同のデータ・セットから始めて、それから少数のアイテムを摘むことだけを計画している場合は、ソートしてバイナリ検索を実行することだけが遅くなります。ただし、アプリケーションの有効期間を通して注文されたリストを管理して定期的にアクセスする場合は、バイナリ検索は進むためのはるかに優れた方法です。

他の多くの人が答えたのと同じように、ソートステップは一度だけ行うことができ、実際の検索はあなたが好きな回数だけ行うことができるので、確かに好ましいです。しかしながら、 n の特定の値(すなわち、特定の入力サイズ)の場合、バイナリ検索は、線形検索よりも常時より実行されています(1つの単一ランでさえ)。

「チップ点」は、漸近複雑さ式を解くことによって計算されます:

n log n + log n = n
.

Wolfram Alpha を参照してください。 n の数値は、バイナリ検索とソートが常にリニアサーチのみよりも常に速くなることを保証します。もちろん、あなたの場合で働く N N 実際の値は、推定が難しいかもしれない多くの要因によって異なります。

この興味深い記事

整数のソートされた配列を検索する必要がある場合 パフォーマンスは本当に、本当に重要です。 配列は約64の要素のサイズで、バイナリ検索がある場合 上記。

素人の言葉で:

10億アイテムを持つ順序付けられていないリストがあれば、あなたが探しているアイテムが最後のものであることが、10億アイテムを読んで終わることになるでしょう。

バイナリ検索の場合、インデックス作成は一度だけ行うことができます。注文を維持するために適切な場所で挿入をすることができます。

すでに「バイナリ検索が優れている」という多くの優れた理由が記載されているのは、ユーザーの観点からの利点を見てもらうこともあります:

通常の待ち時間で非常によく暮らすことができますが、アクションの入力中のデータの間に分割された挿入を行います。ユーザーの観点からは、バイナリ検索と組み合わされたソートされた挿入物は、可能な限り最良のユーザーエクスペリエンスを与えます。

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top