2013-04-08 1 views
8

のための森林を参照してくださいcan`t: 私の数学的なプログラムが通じ反復にアイテムの巨大なコレクションを持つことになります。キー値のペアに似ている、アイテムポインタで構成され、他のアイテム((int)アイテム、(int)ポインター)に主になります。 しかし、彼自身の上の各項目は、このような属性他のいくつかあります:HashSetの、辞書には、ArrayListのは:木について

(項目、ポインタを)、(属性、属性、属性、...)

アイテム、ポインタと属性は次のようになります頻繁に追加されます。

このサイトと他のサイトを検索すると、私はそのプログラムで使用するコレクションについてもっと迷ってしまいました。 vcskicks.comで見つかった。この時点では

辞書ソリューションが最適に動作するようです:

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

や平易な言葉で:

Dictionary<Dictionary<item, pointer>, 
      Dictionary<attribute,attribute, ...> nestedDictionary =  
    Dictionary<Dictionary<item, pointer>, 
       Dictionary<attribute,attribute, ...>(); 

属性の数ではないことに注意してくださいあらかじめ定義されており、長さが異なります。また、現時点では、パフォーマンスオーバーヘッドのためにオブジェクトを使用することを躊躇しています。

ハッシュセット重複した項目が存在するため、異なる属性が存在するため、入りません。 またはハッシュセットには重複した項目がありますが、ハッシュキーは重複しませんか?混乱があるようです。

いくつかによると、以下のHashSetのは計算しません。

11011, 0001 
11011, 0011 

それがする他の人によると、それは別のハッシュキーを持つことになりますので。それは私に困惑を残します。

私の質問:曖昧にされる危険が

:使用するのに最適なコレクション型は何ですか?必要に応じてストーリーにもっと喜んで追加してください。

編集

巨人は意味:アイテムの潜在的に何百万人。すべてのアイテムにはポインタと属性があります。 一般的な使用は、特定の項目についてを検索し、ポインタを取得し、ポインタが残らなくなるまで次のポインタの項目を取得することによってになります。同時に、各項目のすべての属性が収集されます。追加は定期的に行われ、時折のみ削除されます。 ポインタ:ポインタは、それが参照するアイテムのインデックスです。 2つのアイテムがあり、最初のアイテムが2番目のアイテムにリンクされている場合、最初のアイテムは2番目のアイテムのインデックスをポインタとして持ちます。 最高は、メモリ使用量と速度として定義されます。最後に、見つかったすべてのアイテムが互いに比較されます。 例:あなたがオブジェクトのコレクションを維持する必要があるようなので、

[Item , pointer] [attribute, attribute, ...] 
[11011, 1001] [ 1101,  1111 ] 
[10001, 1000] [ 1110,  0101 ] 
[11111, 0010] [ 1111,  1110 ] 
[11011, 0001] [ 0010,  1010 ] 

おかげ

+1

単独でリンクされたリストのように聞こえます – CodesInChaos

+0

「巨人」の大きさはどれくらいですか?一般的な使用法、多くの読書、または多くの追加/削除は何ですか?どのようなパフォーマンスが必要ですか? – RvdK

+0

"ベスト"を定義する必要があると思います。あなたは、メモリ消費、速度、コーディングの容易さ、何かを考えていますか? –

答えて

2

、基本的には以下の特性を持って、それぞれが、思わ:

  • 論理への参照次へアイテム
  • アトリビュート

だから、項目はこのような何か(ちょうど簡単な例...公共のすべてを保つために、しかし、あなたの場合には、あなたが気にしないではない正確にベストプラクティスを)になります。

public struct MyItem 
{ 
    public Dictionary<String, String> attributes; 
    public MyItem next; 
} 

その後、すべてのあなたは必要性は、リストを維持することです:

List<MyItem> myList; 

あなたが何かを追加したい場合は、それは簡単です:

MyItem item1 = new MyItem(); 
item1.attributes["name"] = "Joe"; 
item1.next = null; // this is the default behaviour... just illustrating here 
myList.Add(item1); 

MyItem item2 = new MyItem(); 
item2.attributes["name"] = "Mary"; 
item2.next = item1; 
myList.Add(item2); 

次に、あなたのwアリは横断し、ちょうど次の通りに進む。

MyItem item = myList[0]; 
while (item != NULL) 
{ 
    Console.WriteLine(item["name"]); 
    item = item.next; 
} 

これが役立ちます。

+0

この問題では、 '11011'には2つのポインタ、' 1001'と '0001'があります。質問のポスターが問題を非常にうまく説明しているかどうかはわかりません。 –

+0

私の理解は、ただ1つのポインタがあるということです...それは基本的に単独でリンクされたリストです。この回答は、主に可能な解決策を説明することです...私たちは必要に応じてこれを改良することができます。 – Gigi

+0

こんにちはジギ、答えてくれてありがとう。私は構造体について読んでいました。彼らは確かに解決策のようです。私は病気がこのように行くと思う。ハッシュセットが助けになることができるかどうかまだ分かりませんか? – user2257315

関連する問題