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


87

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

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

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


同意しました。値をバインドする2つのノードを(O(Log N)時間で)見つける必要がある場合があります(値がコレクションに見つからない場合)。たとえば、コレクション(ツリー)には13と17(とりわけ)が含まれており、16未満の最大値と16より大きい最小値を探しています。ツリーはこれを実行できますが、辞書、ソート済みリスト、およびハッシュテーブルはO(N)を取ります。 。

回答:


31

そうです、BCLには何もありません。これは、ツリーを使用するかどうかの選択は通常、実装の詳細であり、それ以外の場合はデータにアクセスするための型破りな方法であるためだと思います。つまり、「binary-search-for element#37」とは言わないでください。代わりに、「要素#37を取得してください」と言います。

しかし、C5を見たことがありますか?これは超便利だし、彼らはいくつかの木の実装を持っている(123)。


3
C5は、Bツリーではなく赤黒木をサポートします。それらは人々が知っておくべき違いです。Bツリーは、ディスクベースのツリーまたは大容量メモリベースのツリーに最適です。より多くのノードが同じローカリティに保持されるため、プロセッサキャッシュのパフォーマンスが向上し、ディスクへの読み取り/書き込みが高速になります。
AnthonyLambert 2010年

68

あなたはあなた自身を定義することができます:

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; }
}

ただし、これには、コンパイル時に処理するツリーレベルの数を知っておく必要があります。間違っていますか?
Veverke 2016

1
いいえ、C#コンパイラはこの構文をサポートしています。
ジェイソン

2
要素がこのように順序付けられていないことに注意してください
Sebastian

@VeverkeおそらくあなたはC ++テンプレートを考えていたのでしょう。.NETジェネリックはランタイムタイプです。
トムブロジェット2016

私は興味がある。これをどのように使用しますか?実質的に?サンプルはありますか?
Syaiful Nizam Yahya 2017

39

そのような実装から何が欲しいですか?

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

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


1
質問の「理由」の部分に対するベストアンサー。
Joel Coehoorn 2009年

そして、それらは検索ツリーだけです。式の木、意思決定の房もあります...
ヘンクホルターマン

実際、実装の詳細は重要です。私の場合、一連の変換の一部として、組織化されたデータセットに対してさまざまなトラバーサル(中置、後置)を実行するいくつかのアルゴリズムを実装しようとしています。ツリー構造は、私の問題を解決するための最もエレガントな方法です。
LBushkin 2009年

11
パラレルユニバースでは、誰かが「.Netにリストタイプがないのはなぜですか?」という質問をしていて、「そのような実装から何が必要ですか?配列?リンクリスト?キュー?A」という答えが得られます。辞書?" これは前後関係のない答えだと思います。
rymdsmurf 2016


12

SortedSet<T>二分探索木refとして実装されています。SortedDictionary<TKey, TValue>内部的に利用するSortedSet<T>ので、それも二分探索木refです。


5
残念ながら、これらは単に順序付けられたマップとリストの実装です。どちらもバイナリツリーとしての再利用には役立ちません。これらのツリー構造は、コレクションの実装の詳細にすぎません。私は実際にツリー構造を公開するクラスを探しています。
LBushkin 2009年

9

いいえ、Tree<T>BCLには「-like」タイプはありませんが(私もいつも戸惑っています)、C#で独自の実装を行うための優れた記事紹介します。

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



-5

使用できるTreeNodeがあります。これは一般的ではなく、Windowsフォームに隠されており、ツリービューコントロールで使用されますが、他の場所でも使用できます。


ええ、でもそれはSystem.ObjectypeのTagプロパティを持っているだけです。一般的な<T>パラメータなし
Henk Holterman

3
私はいつもそのようなことをすることについて奇妙に感じます。特定の例ではあまり目立ちませんが、たとえば依存関係からクラスを定期的に再利用する場合、依存関係を説明するのが難しくなり、再利用されたクラスが予期しない方法で変更された場合に問題が発生する可能性があります。依存関係のバージョン。
ポールモリー

4
それを使用することの利益は何でしょうか?通常、ツリーノードには関連する機能はありません。子、そして最終的には親への参照を保持するだけです。System.Windows.Formsクラスを誤用する理由はありません!自分で書くだけです-1分以内に。
user492238 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.