ハッシュテーブルまたはソートされたリストでアイテムを見つけるのが速いのはどれですか?
アルゴリズムの複雑さは知っておくとよいでしょう。ハッシュテーブルはO(1)であることが知られていますが、ソートされたベクトル(あなたの場合はソートされた配列を使用する方が良いと思います)リスト)はO(log n)アクセス時間を提供します。
ただし、複雑さの表記により、Nが無限大になるためのアクセス時間が与えられることを知っておく必要があります。つまり、データが増え続けることがわかっている場合、複雑さの表記により、選択するアルゴリズムに関するヒントが得られます。
データの長さがかなり短くなることがわかっている場合(たとえば、配列/ハッシュテーブルにエントリが数個しかない場合)、監視と測定を行う必要があります。だから、テストをしてください。
たとえば、別の問題では、配列の並べ替えです。 いくつかのエントリのバブルソートの場合、O(N ^ 2)は..よりも速い場合がありますO(n log n)である間、クイックソート。
また、他の回答に応じて、またアイテムによっては、ハッシュテーブルインスタンスに最適なハッシュ関数を見つけようとする必要があります。そうしないと、ハッシュテーブルでのルックアップのパフォーマンスが劇的に低下する可能性があります(ハンクゲイの回答で指摘されているように)。
編集:理解するためにこの記事を見てください Big O表記の意味 。
「ソートされたリスト」とは、「ランダムにアクセス可能なソートされたコレクション」を意味すると仮定します。リストには、要素ごとにのみトラバースできるという特性があり、その結果、O(N)複雑になります。
ソートされたインデックス可能なコレクション内の要素を見つける最も速い方法は、N項検索O(logN)によるものですが、衝突のないハッシュテーブルの検索の複雑さはO(1)です。
ハッシュアルゴリズムが非常に遅い(および/または悪い)でない限り、ハッシュテーブルは速くなります。
更新:コメント提供者が指摘しているように、ハッシュアルゴリズムが悪いためではなく、ハッシュテーブルが十分に大きくないために、衝突が多すぎるためにパフォーマンスが低下する可能性もあります。ほとんどのライブラリ実装(少なくとも高級言語では)は、バックグラウンドでハッシュテーブルを自動的に拡張します。これにより、拡張のトリガーとなる挿入のパフォーマンスが予想よりも遅くなりますが、独自の実装を使用している場合は、間違いなく何かです。検討する。
get
のSortedList
操作はO(log n)
ですが、HashTableの同じ操作はO(1)
です。したがって、通常、HashTable
ははるかに高速になります。しかし、これはいくつかの要因に依存します。
それはあなたが保存したデータの量に完全に依存します。
スローするのに十分なメモリがあると仮定すると(ハッシュテーブルが十分に大きいため)、ハッシュテーブルは一定の時間内にターゲットデータを検索しますが、ハッシュを計算する必要があると、(固定された)オーバーヘッドが追加されます。
ソートされたリストを検索しても、ハッシュオーバーヘッドは発生しませんが、リストが大きくなるにつれて、ターゲットデータを実際に見つける作業を行うために必要な時間が長くなります。
したがって、一般に、ソートされたリストは、小さなデータセットの方が一般的に高速です。 (頻繁に変更されたり、検索頻度が低い非常に小さいデータセットの場合、ソートを実行するオーバーヘッドが回避されるため、nソート済みリストはさらに高速になる可能性があります。)データセットが大きくなると、リストの検索時間の増加は、ハッシュの固定オーバーヘッドを覆い隠し、ハッシュテーブルが高速になります。
そのブレークポイントがどこにあるかは、特定のハッシュテーブルとsorted-list-searchの実装によって異なります。多数の一般的なサイズのデータセットでテストとベンチマークパフォーマンスを実行して、特定のケースで実際にパフォーマンスが向上するかどうかを確認します。 (または、コードがすでに「十分に高速」に実行されている場合は、使用しないでください。より快適な方を使用し、最適化する必要のないものを最適化する必要はありません。)
場合によっては、コレクションのサイズ(および程度は低いですが実装の詳細)によって異なります。あなたのリストが非常に小さい場合、多分5-10アイテム、私はリストがより速いだろうと思います。そうでなければ、xtoflはそれを正しく持っています。
HashTableは、10を超えるアイテムを含むリストに対してより効率的です。リストの項目が10未満の場合、ハッシュアルゴリズムによるオーバーヘッドは大きくなります。
高速な辞書が必要であるが、アイテムを順序付けられた方法で保持する必要がある場合は、OrderedDictionaryを使用してください。 (.Net 2.0以降)