2009-07-23 3 views
2

3レベルのツリー状のデータ構造の最適な実装(維持しやすい、合理的に高速で堅牢な)は何ですか? すべての値(ノード)に固有のキーがあるので、DictionaryまたはSortedDictionaryを使用したいと思います。C#の固定深度のツリー状データの最適なデータ構造は何ですか?

第1レベルは、第2レベルのこれらの0から10までの(ほぼ100を超えない、通常は10未満の)アイテムと、第3レベルの約10のアイテムとを有すると想定される。レベル2と3は密接に結びついているので、おそらく単一のオブジェクトで表現されるはずです。すべての関係は1:nは

++-L1 
|++-L2 
||+--L3 
||+--...1 to 10 L3 items for each L2 
||+--L3 
|+--L2 
|+--...0 to 100, usually <10 L2 items for each L1 
|+--L2 
+--L1 
+--L1 
+--...about 300 L1 items 
+--L1 

は、1つのディレクトリにすべての第二レベルのオブジェクトを配置するLEVEL2オブジェクト(リアルツリー)、またはそれが優れているを含むすべての第一レベルのオブジェクト内の辞書を作成する方が良いですか?

オブジェクトはそれほど大きくなく、文字列と数字だけが含まれています。アプリケーションはスタンドアロン(SQL Serverなどは必要ありません)とされています

またはオブジェクト表現が間違っていますか?

+0

あなたはツリー上で検索を行う予定ですか? –

+0

実際の検索ではありませんが、いくつかのフィルタリングを追加する予定です(これはおそらくデータ構造の観点から同じです)。 – Lukas

答えて

3

なぜTreeNodeクラスを作成するだけではないのですか?あなたの木のダイナミクスに応じて、

class TreeNode 
{ 
    private string _name; 
    private int _someNumber; 
    private int _uniqueId; 
    private List<TreeNode> _childNodes; 

    public string Name{get{return _name;}} 
    public int SomeNumber{get{return _someNumber;}} 
    public int UniqueId{get{return _uniqueId;}} 
    public List<TreeNode> ChildNodes{get{return _childNodes;}} 

    public void TreeNode(string name, int someNumber, int uniqueId) 
    { 
    _name=name; 
    _someNumber=someNumber; 
    _uniqueId = uniqueId; 
    _childNodes = new List<TreeNode>(); 
    } 

    public void AddNode(TreeNode node) 
    { 
    _childNodes.Add(node); 
    } 

    // other code for deleting, searching, etc. 
} 
+0

ノードに共通のデータはほとんどありませんが、レベル固有のクラスはこの一般的なTreeViewから継承できます。 .. – Lukas

1

、(あなたは非常に簡単で、比較的効率好むかもしれませんが)比較的簡単かつ高効率なことができる一つの選択肢は、配列の配列の配列(ではない、単一の3D配列になります)。各ノードの子の数が大きく変わると、それは悪いことになります。新しいサブアレイを常に割り当てます。しかし、各ノードの子を一度だけ計算してからそれにアクセスすれば、配列の配列は非常に簡単で簡単かつコンパクトで高速になります。

関連する問題