web-dev-qa-db-ja.com

.NET 4.0に組み込みのバイナリ検索ツリーはありますか?

.NET 4.0に組み込みのバイナリ検索ツリーがありますか、またはこの抽象データ型をゼロから構築する必要がありますか?

編集

これは特にバイナリ検索ツリーに関するものであり、一般的な抽象データ型「ツリー」ではありません。

60
Benny Skogberg

SortedSet<T>の-​​ System.Collections.Generic クラスが探しているものだと思います。

このCodeProjectの記事 から:

自己バランス赤黒木を使用して実装され、O(log n)のパフォーマンスの複雑さを与えます挿入、削除、および検索用。これは、要素をソートされた順序で保持したり、特定の範囲の要素のサブセットを取得したり、MinまたはMaxセットの要素。

ソースコード https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic/SortedSet.cs

54
herzmeister

質問をしてから5年後、.NET 4.0には確かにバイナリ検索ツリーが組み込まれていることに気付きました。おそらく後で追加され、期待どおりに動作します。挿入のたびに自己バランス(トラバース)するため、広範囲のアイテムを追加する際のパフォーマンスが低下します。

SortedDictionary<TKey, TValue>クラスには次の注釈があります。

SortedDictionaryジェネリッククラスは、O(log n)を取得するバイナリ検索ツリーです。nは、ディクショナリ内の要素の数です。この点で、SortedListジェネリッククラスに似ています。 2つのクラスには類似したオブジェクトモデルがあり、両方ともO(log n)取得があります。

19
Benny Skogberg

c#バランスAVLバイナリツリーは@ http://code.google.com/p/self-balancing-avl-tree/ にあります。また、対数の連結および分割操作も実装します。

7
ros

いいえ、.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コレクション以上の作業は必要ありません。

4
Dr Herbie

答えはいいえだ。

ただし、利用可能な実装があります。次のリンクをご覧ください。

C#のバイナリツリー

3

彼女のマイスター・デア・ウェルテンのおかげで、私は今、存在することを知っています!私はそれを試してみましたが、本当にうまくいきました!

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();
        }
    }
}
2
Benny Skogberg

'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 );
2
Trap