web-dev-qa-db-ja.com

.NETにTree <T>クラスがないのはなぜですか?

.NETの基本クラスライブラリには、コレクション(リスト、キュー、スタック、ディクショナリ)の優れたデータ構造がいくつかありますが、奇妙なことに、バイナリツリーのデータ構造は含まれていません。これは、さまざまなトラバースパスを利用するアルゴリズムなど、特定のアルゴリズムにとって非常に便利な構造です。正しく書かれた無料の実装を探しています。

私は単に盲目であり、それを見つけられません...それはBCLのどこかに埋められていますか?そうでない場合、バイナリツリー用の無料またはオープンソースのC#/。NETライブラリを推奨できますか?ジェネリックを使用することが望ましい。

編集:探しているものを明確にします。内部的にツリーを使用する順序付き辞書コレクションには興味がありません。私は実際にバイナリツリーに興味があります-サブツリーを抽出したり、ノード上で修正後のトラバーサルを実行したりすることができるように、その構造を公開するものです。理想的には、このようなクラスを拡張して、特殊なツリーの動作(赤/黒、AVL、バランスなど)を提供できます。

82
LBushkin

そのとおり、BCLには何もありません。これは、通常、ツリーを使用するかどうかの選択が実装の詳細であり、そうでなければデータにアクセスするための型破りな方法だからだと思われます。つまり、「binary-search-for element#37」とは言いません。代わりに、「get me element#37」と言います。

しかし、あなたは C5 を見ましたか?非常に便利で、いくつかのツリー実装があります( 12 、)。

29
John Feminella

独自に定義できます:

public class MyTree<K, V> : Dictionary<K, MyTree<K, V>>
{
    public V Value { get; set; }
}

またはキーなし:

public class MyTree<V> : HashSet<MyTree<V>>
{
    public V Value { get; set; }
}
67
Jason

そのような実装から何を望みますか?

二分木?赤、黒?基数ツリー? Bツリー? Rツリー? R *ツリー?

ツリーはデータ構造というよりもパターンであり、パフォーマンスが重要な場所で使用される傾向があります(したがって、実装の詳細もおそらく重要です)。 BCLに何らかのツリークラスが含まれていた場合は、とにかく自分でロールするだけで済みます。

37
Alun Harford

SortedDictionaryは、Tree Data Stuctureに期待されるlog(n)の挿入、検索特性として信じています。

http://msdn.Microsoft.com/en-us/library/f7fta44c(VS.80).aspx

14
Sean

SortedSet<T> は、バイナリ検索ツリーとして実装されます参照SortedDictionary<TKey, TValue> 内部でSortedSet<T>だからそれも二分探索木です 参照

12
Matt Brunell

いいえ、「Tree<T>- like "タイプのBCL(いつも私を困惑させてきたもの)ですが、 これは良い記事です これは、C#での独自の実装を順を追って説明します。

ツリーベースのデータ構造は、.NETが通常使用される種類のアプリケーション(ビジネスアプリ、データ移動アプリなど)ではあまり使用されないという議論をすることができたと思います。それでも、私はあなたに同意します、BCLに実装がまったくないのは奇妙です。

8
Andrew Hare

この記事シリーズは、特にパート3と4を自分で書く必要があったときに役立ちました。

データ構造の広範な検査

1
Gulzar Nazim