ハッシュテーブル内の項目を見つけるのと、ソートされたリスト内の項目を見つけるのはどちらが速いですか?
-
22-08-2019 - |
質問
ハッシュテーブル内の項目を見つけるのと、ソートされたリスト内の項目を見つけるのはどちらが速いですか?
解決
アルゴリズムの複雑さを知るには良いもので、ハッシュテーブルがあることが知られているのO(1)のソートされたベクトル間(あなたのケースで私はそれをリストよりソートされた配列を使用することをお勧めだと思います)のO(n個のログ)のアクセス時間を提供します。
しかし、あなたは複雑さの表記はあなたにNが無限に行くためのアクセス時間を与えることを知っている必要があります。それはあなたがのあなたのデータは成長しているを続けることがわかっている場合は、複雑さの表記はあなたに選んだのためのアルゴリズムにいくつかのヒントを与えることを意味します。
あなたは、データがかなり低い長さを維持することがわかっている場合は、:インスタンスは、あなたの配列/ハッシュテーブルに少数のエントリを持つために、あなたはあなたの時計と対策に行かなければなりません。だから、テストを持っています。
は、例えば、別の問題で:配列をソートします。 をいくつかのエントリのバブルソートのために、それはのO(N Nをログ)<いる間にのO(N ^ 2)は、クイックソート...より速くかもしれないが/ em>の
また、それに応じて他の回答に、そしてあなたの商品に応じて、あなたはあなたのハッシュテーブルのインスタンスのための最高のハッシュ関数を見つけることを試みなければなりません。それ以外の場合は、(ハンクゲイの答えで指摘したように)あなたのハッシュテーブル内のルックアップのために劇的に悪いパフォーマンスにつながる可能性があります。
編集:理解するために、この記事への外観を持っている。
他のヒント
「ソートされたリスト」で、あなたが意味すると仮定すると、「ランダムアクセス可能な、コレクションをソート」。リストには、唯一のO(N)複雑になりますこれは、要素ごとにそれを横切ることができる性質を持っています。
ソートインデックス可能なコレクション内の要素を見つけるための最速の方法は、N進探索であり、O(logN個)、collissions無しハッシュテーブルはOの検索複雑さを有している(1)。
(および/または悪い)の非常にの遅い、ハッシュテーブルが速くなります。
UPDATE:コメンターが指摘したように、あなたのハッシュアルゴリズムが悪いので、あなたはあまりにも多くの衝突から低下した性能を得ていないことでしたが、ハッシュテーブルは十分な大きさではないという理由だけで。あなたがあなた自身の圧延している場合(少なくとも高レベルの言語での)ほとんどのライブラリの実装では、自動的にシーン-遅く予想以上の原因となりますトリガー挿入時にパフォーマンスを後ろにあなたのハッシュテーブルを成長する成長を - しかし、それは間違いなく何か検討する。
の get
での操作 SortedList
は O(log n)
同じ操作で HashTable が O(1)
. 。それで、 通常は, 、 HashTable
はるかに速いでしょう。ただし、これはさまざまな要因によって決まります。
- リストのサイズ
- ハッシュアルゴリズムのパフォーマンス
- 衝突回数 / 品質 ハッシュアルゴリズムの
それは保存しているデータの量に完全に依存します。
投入するのに十分なメモリがあると仮定すると (ハッシュ テーブルが十分大きい場合)、ハッシュ テーブルは一定の時間内にターゲット データを見つけますが、ハッシュを計算する必要があるため、ある程度の (これも固定の) オーバーヘッドが追加されます。
ソートされたリストの検索にはハッシュのオーバーヘッドはありませんが、リストが大きくなるにつれて、ターゲット データを実際に見つける作業に必要な時間は増加します。
したがって、一般に、データ セットが小さい場合は、並べ替えられたリストの方が高速になります。(頻繁に変更されたり、検索頻度が低い非常に小さなデータ セットの場合、 国連ソートされたリストは、ソートのオーバーヘッドを回避できるため、さらに高速になる可能性があります。) データ セットが大きくなるにつれて、リストの検索時間の増加がハッシュの固定オーバーヘッドを覆い隠し、ハッシュ テーブルが高速になります。
ブレークポイントがどこにあるかは、特定のハッシュ テーブルと並べ替えられたリスト検索の実装によって異なります。一般的なサイズの多数のデータ セットに対してテストとベンチマーク パフォーマンスを実行し、特定のケースで実際にどれがより優れたパフォーマンスを発揮するかを確認します。(または、コードがすでに「十分に高速」に実行されている場合は、実行しないでください。使いやすい方を使用してください。最適化する必要のないものを最適化することを心配する必要はありません。)
いくつかのケースでは、それがコレクション(およびより少ない程度に、実装の詳細)の大きさに依存します。あなたのリストが非常に小さい場合は、5-10項目多分、私はリストが速いだろうと思いたいです。そうでなければxtoflは右のそれを持っています。
HashTableには10個の以上のアイテムを含むリストのための、より効率的です。リストが10個の未満のアイテムを持っている場合は、アルゴをハッシュによるオーバーヘッドは、よりになります。
の場合では、高速な辞書を必要とするだけでなく、OrderedDictionaryを使用する注文方法でアイテムを保持する必要があります。 (.NET 2.0以降)