私は、C#の辞書オブジェクトに非常に自然に役立つ比較的大きなデータセットを持っています。現在、私のプログラムが起動するときに準動的に生成される102400個のキーと値のペアがあります。私の問題は、できるだけ早く多数の検索操作を実行する必要があることです。個別の値ごとに複数のキーを使用して辞書を最適化するにはどうすればよいですか?
This Pageによれば、ルックアップの速度は、辞書内のキーと値のペアの数によって直接影響されます。多数の異なるキーが同じ値につながるという点で私のデータはちょっと奇妙です。実際、私には4900個の異なる値があります...これは、それぞれの別個の値に対して平均20個のキーと値のペアがあることを意味します。
私の最初の本能は、値のキーを入れ替えることでした(私はデータ内の別個の値だけを気にするので)。リストまたは配列の古いキーを新しい値として使用します。これは私の辞書サイズを102400のキーと値のペアから4900に減らしましたが、キーを取得する特定の値のすべてのリストを効率的に検索する方法はありません。
は、私は私の記述はおそらく私がキーと値を切り替えるようdificultビットが続くようになったことを知っているので、私は私のデータのモックアップは、私が何を意味するかをお見せするために含めました:
古い方法を:
Key Value
--- -----
1 1
2 2
3 3
4 1
5 3
6 2
7 2
8 1
9 3
10 2
11 3
12 1
新構造:私のプログラムで
Key Value
--- -----
1 {1,4,8,12}
2 {2,6,7,10}
3 {3,9,5,11}
、私は '11' 与えられることになるだろうと私は返す必要があります '3'。最初の構造は簡単なルックアップですが、遅くなっているように見える巨大なリストです...第2の構造は、私が探している値リストを追跡するために非常に多くの論理的なオーバーヘッドを追加します。それを実装しようとする速度。
ここで間違った木を吠えていますか?私は大きなリストの速度を受け入れるべきですか、またはルックアップスピードを上げるためにデータを保存することができる他の方法がありますか?
辞書は検索でO(1)にする必要があります。つまり、検索時間は、辞書が大きくなっても比較的一定に保つ必要があります。しかし、問題は、よく分散されたハッシュを持たないキーです。あなたの辞書は 'Dictionary 'ですか、それともキーの種類(カスタム?)ですか? –
私の辞書は辞書です。私は様々な答えからたくさんの意見を受け取りました。私はいくつかのスピードテストを実装して、さまざまな提案に顕著な影響があるかどうかを確認しようとしています。私は自分のいくつかのテストを追加して、プリミティブ型のより小さな辞書のスピードが上がるかどうかを見てみましょう。 –
Chronicide