1

次のような一意のパスを大量に保存する必要があります"C:\MyDir\MySubDir\myfile.txt"

コレクションにパスが含まれているかどうかをすばやく確認できるようにしたいので、できるだけ少ないメモリを使用します。

このタスクに最も適したコレクションは何ですか?

文字列自体ではなく、一意のパスを表す値を格納して、使用するメモリを減らすことはできますか?

4

6 に答える 6

3

Trieを見てください私たちは2000万のパスで非常に効率的に行いました

于 2012-05-29T16:07:21.007 に答える
2

データにすばやくアクセスする必要がある場合、つまりO(1)時間にコレクションに何かが存在するかどうかを知りたい場合のハッシュセット。

.NET 4では、を使用しHashSetます。これはハッシュテーブルのようなものですが、キーと値のペアではなく、値のみが格納されます。

HashSet<string> myStrings = new HashSet<string>();
myStrings.Add(@"c:\foo\bar.txt");
myStrings.Add(@"c:\foo\baz.gif");
myStrings.Add(@"c:\foo\bat.bin");
于 2012-05-29T16:05:35.770 に答える
2

これはTRIEに最も適しています。次に例を示します。c#でトライを実装します。

あなたの質問に答えるために、はい、TRIEは文字列自体ではなく一意のパスを保存します。

試行は、メモリ消費と実行速度の両方において、タスクにとって非常に効率的です。

編集: 一方が他方より優れているというわけではありません。TRIEはこのタイプのストレージ/取得の問題のために発明されたものであり、非常に効率的です。 ハッシュも高速です。どちらがニーズに最も適しているかを知りたい場合は、両方を実装してください。どちらの方法でも長くはかからないはずです。 測定、測定、測定。

于 2012-05-29T16:08:44.280 に答える
2

他の人が答えたように、aTrieHashSetは速いフェッチ時間を提供します。必要なのはa未満ですが、どちらも単純な古いものよりも多くのメモリを必要と
する ことに注意してください(これを参照)。TrieHashSetList

本当に必要かどうかはわかりませんが、ここでメモリが実際に問題になる場合は、文字ではなくフォルダ名をノードとして使用して、実装を最適化できTrieます(通常、フォルダ名は1文字より長いため)。このようにして、パスのツリー構造を使用します。

于 2012-05-29T16:28:25.480 に答える
0

コレクションをすばやく検索できるようにする目的で、Dictionary/HashTableを使用してみませんか。

「一意のパスを表す値を格納することは可能ですか。」-これについて考えてみてください。コレクションに値が存在することを確認する必要があるたびに、文字列を暗号化/復号化する必要があります。良くないアプローチ

編集: 速度が問題ではない場合は、データベースにすべてのキーを保存して、パスが存在するかどうかを確認するためにテーブルをすばやくループすることができますか?

于 2012-05-29T16:08:29.273 に答える
0

一意のデータポイントを格納するためによく使用されるデータ構造はセットです。これには.NETHashSet<T>クラスを使用できます。HashSetを使用すると、値を追加する前に値が存在するかどうかを確認する必要がなく、クイックルックアップも取得できます。

于 2012-05-29T16:09:13.500 に答える