2010-07-16 11 views
47

¿Hay un árbol de búsqueda binaria incorporado en .NET 4.0, o necesito crear este tipo de datos abstractos desde cero?¿Hay un árbol de búsqueda binaria incorporado en .NET 4.0?

Editar

Esto es sobre el árbol de búsqueda binaria específica, y no "árboles" Resumen de tipos de datos en general.

+0

Posible duplicado de [objetos que representan los árboles] (http://stackoverflow.com/questions/1806511/objects-that-represent-trees) –

+1

@RobertMacLean 6 años más tarde, es una víctima? Jaja! –

+1

Sí y usted también lo sabía hace seis años: http://stackoverflow.com/a/3262982/53236: P –

Respuesta

44

Creo que la clase SortedSet<T> en System.Collections.Generic es lo que estás buscando.

De this CodeProject article:

Se lleva a cabo usando un árbol rojo-negro auto-equilibrio que da una complejidad desempeño de O (log n) para insertar, eliminar y buscar. Se utiliza para mantener los elementos en forma ordenada, para obtener el subconjunto de elementos en un rango particular , o para obtener la Min Max o elemento del conjunto.

El código fuente https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic/SortedSet.cs

+1

Un árbol rojo-negro es realmente un tipo especializado de árbol de búsqueda binaria. Ver mi respuesta para más detalles. –

+7

Desafortunadamente, esta clase no proporciona muchos métodos útiles del árbol de búsqueda binaria clásico, e. gramo. lower_bound (que se implementa en 'std :: set' en C++). Cuidado con el método GetViewBetween. Inesperadamente tiene [tiempo de ejecución lineal] (http://stackoverflow.com/questions/9850975/why-sortedsett-getviewbetween-isnt-olog-n) – renadeen

+0

Esta respuesta es incorrecta. SortedSet no es un BST. La inserción y la eliminación tienen una complejidad de tiempo de O (n). – ataravati

3

No estoy seguro de qué quiere decir exactamente con 'árbol', pero puede hacer búsquedas binarias en la clase 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); 
+0

Gracias - esta era información nueva para mí - gracias –

3

La respuesta es: No.

Existen implementaciones disponibles sin embargo. Echar un vistazo al siguiente enlace:

Binary Tree in C#

+0

Extraño No recibí esa sugerencia al hacer mi pregunta sobre los árboles de búsqueda binaria. ¡Gracias, Leniel! –

3

La biblioteca de colecciones C5 (ver http://www.itu.dk/research/c5/) incluye TreeDictionary<> clases con los árboles binarios de color rojo-negro equilibradas. Nota: Todavía no he usado esta biblioteca, ya que el trabajo que hago no necesita nada más que las colecciones .NET estándar.

+0

Bueno. Los árboles rojo-negros son un poco diferentes a los ordinarios BinarySearchTrees, ¡pero aún así son un algoritmo muy bueno! Marcaré ese enlace inmediatamente y lo guardaré en mi cuenta XMarks :) Thanx Dr Herbie. –

2

Gracias a herzmeister der welten, ahora sé que hay! ¡Lo intenté y realmente funcionó!

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(); 
     } 
    } 
} 
5

No, .NET no contiene un Binary Search Tree. Contiene un Red-Black Tree que es un tipo especializado de árbol de búsqueda binaria en el que cada nodo está pintado de rojo o negro y hay ciertas reglas que utilizan estos colores que mantienen el árbol equilibrado y permite al árbol garantizar O (logn) tiempos de búsqueda . Un árbol de búsqueda binaria estándar no puede garantizar estos tiempos de búsqueda.

La clase se llama SortedSet<T> y se introdujo en .NET 4.0. Puedes ver su código fuente here.Aquí está un ejemplo de su uso:

// 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 
17

Cinco años después hice la pregunta me di cuenta de que efectivamente existe una construida en búsqueda binaria Árbol en .NET 4.0. Probablemente se agregó más adelante y funciona como se esperaba. Se autoequilibra (atraviesa) después de cada inserción, lo que disminuye el rendimiento al agregar una gran variedad de elementos.

La Clase SortedDictionary<TKey, TValue> tiene las siguientes observaciones:

La clase genérica SortedDictionary es un árbol binario de búsqueda con O (log n) de recuperación, donde n es el número de elementos en el diccionario. A este respecto, es similar a la clase genérica SortedList. Las dos clases tienen modelos de objetos similares, y ambos tienen recuperación O (log n).

+1

¿Por qué necesitaría una clave (tal vez su modelo lo requería)? ¿SortedSet no lo cubre ya (pero sin la clave)? – bbqchickenrobot

+0

@bbqchickenrobot Es por eso que acepté la respuesta SortedSet ;-) –

Cuestiones relacionadas