Iは整数であり、(数字で開始することができる)、英数字の文字列となっている第二である第一その値の対からなるデータ構造を有する:どのC#データ構造によって、部分文字列に対して最も効率的に文字列のペアを検索できますか?
+--------+-----------------+
| Number | Name |
+--------+-----------------+
| 15 | APPLES |
| 16 | APPLE COMPUTER |
| 17 | ORANGE |
| 21 | TWENTY-1 |
| 291 | 156TH ELEMENT |
+--------+-----------------+
これらのテーブルだろう100,000行までを構成します。
私は、数字(文字列のように)または文字列の一部のいずれかをユーザーが検索できるルックアップ機能を提供したいと考えています。理想的には、ユーザのタイプに応じてルックアップが「ライブ」になります。各キーストロークの後(または、わずかに遅れて〜250-500ms後)、最も可能性の高い候補を見つけるために新しい検索が行われる。そのため、例えば、理想的(291 156TH ELEMENT
AP
が15 APPLES
と16 APPLE COMPUTER
15 APPLES
に検索を絞り込むます15 APPLES
、16 APPLE COMPUTER
、17 ORANGE
、および291 156TH ELEMENT
15
を返します
1
で検索、必須ではありません)ELEM
は291 156TH ELEMENT
を返します。
Iは、最終的int
sはstring
sと比較されているから2つのDictionary<string, string>
Sを使用して考えていた - 文字列の一部ずつ意志の整数部分によってインデックスおよびその他。
しかし、実際に部分文字列で検索するとハッシュ関数を使用すべきではありません。必要と思われるメモリを2倍使用するのは無駄です。
最終的には、サブストリングのために2つの大きなリストを同時にテキスト検索することはうまくいくのですか?
これが失敗すると、SortedDictionary
はどうですか?パフォーマンスは向上しますが、ハッシュの問題は解決されません。
オンザフライで正規表現を作成することについて考えましたが、それはひどく実行すると思います。
私はLINQをまだ見ていないので、私はC#(Javaの世界から来たもの)が新です。それは答えですか?
EDIT 18:21 EST:潜在的な解決方法に影響する場合、「名前」フィールドの文字列は12-15文字より長くなりません。
Iは(http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm)[クヌース - モリス - プラット法]のわずかに修飾された実装と思います便利である。 – ChaosPandion
あなたが「効率的に」と言うとき、あなたは「素早く」または最小のメモリを意味しますか?一般に、これらのシナリオでは、メモリの速度を交換したり、2つのバランスをとることができます。かなり静的な100kの文字列もあります。つまり、回転率はほとんどなく、繰り返し検索されていますか? – EBarr
@エバー:メモリは大きな問題ではありませんが、私は無駄になりたくありません。ここでスピードが重要です。 – Tenner