Есть ли встроенное дерево двоичного поиска в .NET 4.0, или мне нужно создать этот абстрактный тип данных с нуля?
Изменить
Это касается дерева двоичного поиска, а не абстрактного типа данных "деревья" в целом.
Есть ли встроенное дерево двоичного поиска в .NET 4.0, или мне нужно создать этот абстрактный тип данных с нуля?
Это касается дерева двоичного поиска, а не абстрактного типа данных "деревья" в целом.
Я думаю, что SortedSet<T>
в System.Collections.Generic
- это то, что вы ищете.
Он реализуется с использованием самобалансирующееся красно-черное дерево, которое дает сложность выполнения O (log n) для вставки, удаления и Погляди. Он используется для элементов в отсортированном порядке, чтобы получить подмножество элементов в определенном диапазон или для получения Мин или Максэлемент набора.
Исходный код https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic/SortedSet.cs
Через пять лет после того, как я задал этот вопрос, я понял, что в .NET 4.0 есть встроенное двоичное дерево поиска. Вероятно, он был добавлен позже и работает так, как ожидалось. Он самостоятельно балансирует (перемещается) после каждой вставки, что снижает производительность при добавлении большого количества предметов.
Класс SortedDictionary<TKey, TValue>
имеет следующие замечания:
Общий класс SortedDictionary - это двоичное дерево поиска с извлечением O (log n), где n - количество элементов в словаре. В этом отношении он похож на общий класс SortedList. Эти два класса имеют похожие объектные модели, и оба имеют O (log n).
можно найти бинарное дерево ACL с балансировкой С# @http://code.google.com/p/self-balancing-avl-tree/. Также реализует логарифмические операции конкатенации и разделения
Нет,.NET не содержит Двоичное дерево поиска. Он содержит Red-Black Tree, который является специализированным деревом двоичного поиска, в котором каждый node окрашен в красный или черный цвет, и есть определенные правила, использующие эти цвета, которые удерживают дерево сбалансированным и позволяют дереву гарантировать 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
Я не уверен, что именно вы имеете в виду с "деревом", но вы можете выполнять бинарные поиски в классе 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 );
Ответ: Нет.
Существуют доступные реализации. Взгляните на следующую ссылку:
Библиотека C5-коллекций (см. http://www.itu.dk/research/c5/) включает классы TreeDictionary<>
со сбалансированными красно-черными двоичными деревьями. Примечание. Я еще не использовал эту библиотеку, так как работа, которую я делаю, больше не нуждается в стандартных сборках .NET.
Thanx to herzmeister der welten, теперь я знаю, что есть! Я попробовал, и это действительно сработало!
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();
}
}
}