2016-04-28 1 views
2

を探しに来た:辞書を使用する代わりにソートしてから、私はハッシュテーブルとの考えを勉強していた

要素を検索する代わりに、最初のバイナリ検索をやって、リストをソートするための辞書を使用しないのはなぜ?我々はすべての要素を通過する必要があるため

  1. 我々はO(n)(と思う)の時間で辞書にリストを変換することができます(私は複数回検索すると仮定)。
  2. 私たちは辞書にこれらすべての要素を追加し、この辞書の準備ができたら、私たちはその後、O(1)時間(平均)とO(n)で任意の要素を検索することができます
  3. O(1)時間がかかりますが今、最悪の場合

です私たちが平均的なケースについて話したら、O(n)は、他のソートアルゴリズムよりも優れているのは、たぶん彼らがO(nlogn)を取るからです。私が言ったことのすべてについて正しいのであれば、どうしてこのようにしませんか?

ソートされていない辞書や配列では行えないソートされた要素では、さまざまなことができることは知っていますが、検索にのみ固執すれば、他のソートアルゴリズム?

+1

または、要素を検索するためにO(n)のソートされていないリストを反復処理するだけですか? – timgeb

+1

@timgeb次にn回検索する必要がある場合は、 'n * O(n)'という複雑さがあり、最初にソートしてからn回検索すると 'n * O(logn)'となります。あなたは何回でもO(1)の時間で何回でも検索することができます。 –

+0

@jamessmithええ、何回も検索したいとは言いませんでした。その場合は、リストをセットに変換してください(なぜあなたは辞書を望みますか?)をO(n)に格納し、次にO(1)の包含チェックを行います。あなたが分けることができるソートされたリストを保持することは、あなたが注文を必要とするとき、および/または要素を複製するときにのみ役立ちます。 – timgeb

答えて

2

正しく、うまく設計されたハッシュテーブルはソートと検索に勝る可能性があります。

インプレース要件、データセットのダイナミズム、検索回数対挿入/削除、効果的なハッシュ関数を構築するのが簡単など、多くの要因があります。

1

バイナリ検索keyが検索されるべきkey Sのリストがすでにソートされ、それはその最悪のケースの検索を行うこと、並べ替えた後、検索する必要がないという事実を利用した検索技術であります時間O(log n)

あなたがkey秒のソートされたリストを持っているとkeyを検索したくない場合は、最悪の場合にはO(n)複雑で実行されます線形検索のために行く必要があります、その後、並べ替えた後、どの検索する必要はありません最もよく知られているソートの藻類はO(n log n)の時間でしか動かないので間違いなく遅くなります。

listkeyのsからdictionaryを構築して、検索を実行すると、線形検索はパフォーマンス向上のために同じことをもたらすともdictionaryの場合に必要とされる補助記憶装置が必要となりますので、ここでノー有利です。 複数のルックアップがあり、キースペースが小さい場合dictionaryを使用すると、辞書を作成することがO(n)の1回の作業であり、その後の検索はO(1)によって実行できます。これは、dictionary

+2

"あなたが探しているキーをすでに知っているなら、それは検索と呼ばれません" - 私はこの文を理解していません。あらかじめあなたが知っているキーのプレゼンス*を探しています。あなたが知らないことをどうやって探すことができますか? –

+1

"よく知られているソートの藻類" - ソートは 'O(n log n)+ c'よりも小さくすることは実際に数学的に証明されています。今日のアルゴリズムは、その定数「c」を最小化しようとしています。 –

+0

"最悪の場合、O(n)の複雑さで実行される線形検索では、最もよく知られているソート・アルゴが' O(n log n) '時間内でしか動作できないので、ソートしてから正確に遅く検索する必要はありません。なぜ私は質問に「(複数回検索したいと思っているとします)」と言ったケースとして取り上げているのですか? –

関連する問題