.NET 4.0に組み込みのバイナリ検索ツリーがありますか、またはこの抽象データ型をゼロから構築する必要がありますか?
これは特にバイナリ検索ツリーに関するものであり、一般的な抽象データ型「ツリー」ではありません。
SortedSet<T>
の- System.Collections.Generic
クラスが探しているものだと思います。
このCodeProjectの記事 から:
自己バランス赤黒木を使用して実装され、O(log n)のパフォーマンスの複雑さを与えます挿入、削除、および検索用。これは、要素をソートされた順序で保持したり、特定の範囲の要素のサブセットを取得したり、MinまたはMaxセットの要素。
質問をしてから5年後、.NET 4.0には確かにバイナリ検索ツリーが組み込まれていることに気付きました。おそらく後で追加され、期待どおりに動作します。挿入のたびに自己バランス(トラバース)するため、広範囲のアイテムを追加する際のパフォーマンスが低下します。
SortedDictionary<TKey, TValue>
クラスには次の注釈があります。
SortedDictionaryジェネリッククラスは、O(log n)を取得するバイナリ検索ツリーです。nは、ディクショナリ内の要素の数です。この点で、SortedListジェネリッククラスに似ています。 2つのクラスには類似したオブジェクトモデルがあり、両方ともO(log n)取得があります。
c#バランスAVLバイナリツリーは@ http://code.google.com/p/self-balancing-avl-tree/ にあります。また、対数の連結および分割操作も実装します。
いいえ、.NETには Binary Search Tree が含まれていません。 Red-Black Tree が含まれます。これは、各ノードが赤または黒に塗られる特殊な種類のバイナリ検索ツリーであり、これらの色を使用してツリーのバランスを保ち、ツリーを許可する特定のルールがありますO(logn)検索時間を保証します。標準のバイナリ検索ツリーでは、これらの検索時間を保証できません。
クラスは SortedSet<T>
は.NET 4.0で導入されました。あなたはそれのソースコードを見ることができます ここ 。以下にその使用例を示します。
// Created sorted set of strings.
var set = new SortedSet<string>();
// Add three elements.
set.Add("net");
set.Add("net"); // Duplicate elements are ignored.
set.Add("dot");
set.Add("rehan");
// Remove an element.
set.Remove("rehan");
// Print elements in set.
foreach (var value in set)
{
Console.WriteLine(value);
}
// Output is in alphabetical order:
// dot
// net
C5コレクションライブラリ( http://www.itu.dk/research/c5/ を参照)には、TreeDictionary<>
バランスの取れた赤黒二分木を持つクラス。注:私はこのライブラリをまだ使用していません。標準の.NETコレクション以上の作業は必要ありません。
彼女のマイスター・デア・ウェルテンのおかげで、私は今、存在することを知っています!私はそれを試してみましたが、本当にうまくいきました!
namespace Tree
{
public partial class Form1 : Form
{
private SortedSet<int> binTree = new SortedSet<int>();
public Form1()
{
InitializeComponent();
}
private void Insert(int no)
{
binTree.Add(no);
}
private void Print()
{
foreach (int i in binTree)
{
Console.WriteLine("\t{0}", i);
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
Insert(Int32.Parse(tbxValue.Text));
tbxValue.Text = "";
}
private void btnPrint_Click(object sender, EventArgs e)
{
Print();
}
}
}
'tree'の正確な意味はわかりませんが、Listクラスでバイナリ検索を実行できます。
public int BinarySearch( T item );
public int BinarySearch( T item, IComparer<T> comparer );
public int BinarySearch( int index, int count, T item, IComparer<T> comparer );