web-dev-qa-db-ja.com

辞書とリスト

だから私はDictionary<int, int>今日仕事中。私はおそらくList<int>代わりに。違いはありますか、また、ある構造が他の構造よりも優先されるユースケースがありますか?

30
ZeroDivide

インデックスが位置的な配置以外に特別な意味を持つ場合は、Dictionary<int, int>を使用します。

すぐに頭に浮かぶ例は、データベースにid列とint列を格納することです。たとえば、[person-id]列と[personal-pin]列がある場合、それらをDictionary<int, int>に含めることができます。このようにpinDict[person-id]はPINを提供しますが、インデックスは意味があり、List<int>内の位置だけではありません。

しかし、実際には、整数の2つの関連リストがある場合は常に、これは適切なデータ構造になる可能性があります。

33
Kris Harper

Listを配列、Dictionaryハッシュテーブル と考えてください。意味のあるキーを値にマップ(または関連付け)する必要がある場合にのみDictionaryを使用しますが、Listは位置(またはインデックス)のみを値にマップ(または関連付け)します。

たとえば、人の年齢と身長の関連付けを保存するとします。 Dictionary<int, int>は、個人の年齢(int)を身長(int)にマッピングします。

Dictionary<int, int> personHeightMap = new Dictionary<int, int>();

personHeightMap.Add(21, 185);
personHeightMap.Add(31, 174);

int height = personHeightMap.ContainsKey(21) ? personHeightMap[21] : -1;

あまり便利な例ではありませんが、Listではこれらの値を適切な位置に格納する必要があるため、これをエレガントに行うことはできません。

28
Bernard

意味的には、Dictionary<int, T>List<T>は非常によく似ており、どちらも.NETフレームワークのランダムアクセスコンテナーです。辞書の代わりとしてリストを使用するには、リストの空のスロットを表すために、タイプTnullなど)に特別な値が必要です。 Tintのようなnull許容型ではない場合は、代わりにint?を使用できます。または、正の値を格納するだけの場合は、次のような特別な値を使用できます-空のスロットを表す1。

どちらを選択するかは、キー値の範囲によって異なります。 Dictionary<int, T>のキーが整数間隔内にあり、それらの間に多くのギャップがない場合(たとえば、[0、... 100]から80個の値)、List<T>がより適切です。インデックスによるアクセスが高速であり、この場合の辞書に比べてメモリと時間のオーバーヘッドが少ないためです。

キー値が[0、...、1000000]のような範囲の100 int値である場合、List<T>は、Tの1000000値を保持するためにメモリを必要とします。 Tの値が100程度、intの値が100程度の大きさ(さらに、オーバーヘッドもあり、実際には、これらの100のキーと値を格納するためのメモリの約2倍を期待しています)。したがって、後者の場合、辞書がより適切になります。

15
Doc Brown

どうすればそれらを同等と見なすことができますか?

ディクショナリはスパースであり、ランダム挿入を許可しますが、順トラバーサルを問題にします。リストはスパースではなく、順不同の挿入は高価であり、本質的に順トラバーサルを提供します。

一方が他方よりも劇的に優れていない状況はほとんどありません。

6
Loren Pechtel

余談ですが、他のプログラミング言語では、このタイプのデータ構造を辞書ではなくマップと呼んでいます。

データをキーと値のペアとして有意義に定義できる場合、キーを使用して値を検索する必要がある場合、ディクショナリははるかに高速なアクセスを提供します。

たとえば、顧客のリストがあるとします。各顧客には、名前や住所、一意の顧客番号などの詳細が含まれています。処理中の注文のリストもあるとします。各注文には、行われている内容の詳細が含まれ、注文者の顧客番号を含める必要があります。

注文の発送準備が整ったら、発送先の住所を見つける必要があります。顧客がプレーンリストとして保存されている場合は、リスト全体を検索して、正しい顧客番号を持つ顧客を見つける必要があります。代わりに、顧客番号をキーとして、顧客を辞書に格納できます。辞書を使用すると、検索を行わなくても、正しい顧客を1つのステップで引き出すことができます。

2
Simon B

辞書はハッシュを使用してデータを検索します。辞書は最初にキーのハッシュ値を計算し、このハッシュ値はターゲットデータバケットにつながります。その後、バケット内の各要素が等しいかどうかを確認する必要があります。ただし、最初のステップでは何も検索しないため、実際にはリストは最初の項目検索の辞書よりも高速になります。しかし、2番目のステップでは、リストは最初の項目を調べ、次に2番目の項目を調べる必要があります。そのため、各ステップで検索に時間がかかります。リストが大きいほど、時間がかかります。

...についての詳細 辞書対リスト 例を示します。

1
Walshregal