2012-03-09 3 views
0

Dictionary<string, object>よりも優れたデータ構造を探しています。私はNアイテムを持っているマップを持っています - マップは一度構築され、その後、何度も何度も読み込まれます。プログラムの有効期間中はマップは変更されません(新しい項目が追加されず、削除された項目や並べ替えられていない項目はありません)。マップは変更されないため、マップを使用するアプリケーションが多量にマルチスレッド化されていても、スレッドセーフである必要はありません。私は、マップにないアイテムについてルックアップの約50%が起こると予想しています。追記型文字列からオブジェクトへのマップ

Dictionary<TKey, TItem>は非常に速く、私はそれを使用することになるかもしれませんが、このシナリオではより高速な別のデータ構造があるのだろうかと思います。残りのプログラムは明らかにこのマップよりも高価ですが、パフォーマンス重視の部分で使用されています。できるだけ高速化したいと思います。

+1

おそらく関連しています:[.NETには読み取り専用の汎用辞書がありますか?](http://stackoverflow.com/questions/678379/is-there-a-read-only-generic-dictionary-available- –

+0

@ M.Babcock:ありがとうございますが、あなたのリンクは関連していません。私は地図を読み取り専用にしようとしていません - 私のアプリケーションはそれを一度構築してから変更しません。私は上記のシナリオのためにおそらくより速いデータ構造を見出そうとしています。もし何もないなら、私は 'Dictionary 'でうまくいっていますが、速度を上げることができるのであれば私はまた興味があります。私もジェネリックマップは必要ありません。キーは 'string'で、アイテムは私の(特定の)クラスの一つです。 – xxbbcc

+0

私はそれを理解しましたが、実装がより効率的かどうかは分かりませんでした。それは大したことではない場合は、その実装は、標準の 'Dictionary 'よりもわずかに薄いですが、私はそれが_slightly_(ただし目立たないほど)速いと思います。 –

答えて

3

。あなたの文字列のリストに基づいて作成し、それを辞書に使用することができます。

HashTableにはconstructor that accepts IHashCodeProviderがあり、独自のハッシュ関数を指定できます。 Dictionaryに相当するものが見つかりませんでしたので、代わりにHashtableを使用する必要があります。

PerfectStringHashクラスで内部的に使用すると、すべての型キャストが実行されます。

ハッシュのバケット数を指定できる必要がある場合があることに注意してください。私はHashTableはあなたが負荷率を指定できると思う。あなたはかもしれませんあなた自身がハッシュを完全にロールする必要があることがわかります。誰もが使える良いクラスだと思います。一般的な完璧なハッシュです。

編集:Apparantly誰かがすでにいくつかPerfect Hash algorithms in C#を実装しました。

+0

ありがとうございます - これは私が以前には分かっていなかったことを示唆しています。私はおそらくこの時点でこれを実装しないでしょう。なぜなら、辞書は非常に高速であり、期限が近づいていることを示しているので、私たちはこれを行う時間はないでしょうが、とにかく新しいことを学ぶのが好きです。 – xxbbcc

0

一般的な辞書の読み取りパフォーマンスは、ほとんどのTKeyのMSDNのコメントによれば "O(1)に近い"です(文字列キーだけではかなり良いパフォーマンスが得られるはずです)。そして、独自のコレクションを実装することなく、フレームワークからフリーで箱から取り出します。あなたがPerfect Hash Functionで探しているものを

http://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.90).aspx

+0

ありがとう、私はそれがかなり速いことを知っています。私はそれを置き換えるものを必ずしも探しているわけではありませんが、もっと速い構造があるかどうかを確かめたいと思っています。 – xxbbcc

+1

ああ、.NETトライ実装と汎用辞書を使って検索速度のベンチマークを行うと、このスレッドでは興味深い結果になるでしょう。 –

+0

私はそれをします。私は '文字列'キーで 'Dictionary 'の速度を測定しました。かなり印象的です。 – xxbbcc

0

文字列キーを使用する必要がある場合 - ディクショナリは、少なくとも(非常に良い選択肢ではないが)非常に良いです。

測定を開始するときにもう1つ注意すべきことは、ハッシュ自体の計算に測定可能な影響があるかどうかを検討してください。長い文字列を検索するには、ハッシュを計算するのに時間がかかります。検索したいアイテムが一定のgetハッシュ時間を持つ他のオブジェクトとして表現できるかどうかを確認してください。

関連する問題