2010-07-16 12 views
47

C'è un albero di ricerca binario integrato in. NET 4.0, o devo creare questo tipo di dati astratto da zero?C'è un albero di ricerca binario integrato in .NET 4.0?

Modifica

Questo è circa l'albero binario di ricerca specifico, e non astratta dei tipi di dati "alberi" in generale.

+0

Possibile duplicato di [oggetti che rappresentano gli alberi] (http://stackoverflow.com/questions/1806511/objects-that-represent-trees) –

+1

@RobertMacLean sei anni dopo, è una vittima? LOL! –

+1

Sì e lo sapevi già sei anni fa: http://stackoverflow.com/a/3262982/53236: P –

risposta

44

Penso che la classe SortedSet<T> in System.Collections.Generic sia ciò che stai cercando.

Da this CodeProject article:

E 'implementato utilizzando un auto-bilanciamento rosso-nero albero che dà una complessità prestazioni di O (log n) per inserire, eliminare, e consultare. E 'utilizzato per mantenere i elementi in modo ordinato, per ottenere il sottoinsieme di elementi in un particolare gamma, oppure per ottenere il Min o Max elemento dell'insieme.

codice sorgente https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic/SortedSet.cs

+1

Un albero rosso-nero è davvero un tipo specializzato di albero di ricerca binario. Vedi la mia risposta per maggiori dettagli. –

+7

Sfortunatamente questa classe non fornisce molti metodi utili per il classico albero di ricerca binaria, e. g. lower_bound (che è implementato in 'std :: set' in C++). Attenzione al metodo GetViewBetween. Inaspettatamente ha [tempo di esecuzione lineare] (http://stackoverflow.com/questions/9850975/why-sortedsett-getviewbetween-isnt-olog-n) – renadeen

+0

Questa risposta è sbagliata. SortedSet non è un BST. L'inserimento e l'eliminazione hanno una complessità temporale di O (n). – ataravati

3

Non sono sicuro di cosa si intenda esattamente con "albero", ma è possibile eseguire ricerche binarie nella classe Elenco.

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

Grazie - questa era una nuova informazione per me - thanx –

3

La risposta è: No.

Ci sono implementazioni disponibili però. Date un'occhiata al seguente link:

Binary Tree in C#

+0

Strano Non ho ricevuto questo suggerimento mentre ponevo la mia domanda sugli alberi di ricerca binaria. Grazie Leniel! –

3

La biblioteca collezioni C5 (vedi http://www.itu.dk/research/c5/) include TreeDictionary<> classi con alberi binari rosso-neri equilibrati. Nota: non ho ancora usato questa libreria, poiché il lavoro che faccio non ha bisogno di più delle collezioni .NET standard.

+0

Bello. Gli alberi Red-Black sono leggermente diversi dai normali BinarySearchTrees, ma comunque un algoritmo molto carino! Inserirò subito questo link e lo salverò sul mio account XMarks :) Thanx Dr Herbie. –

2

Grazie a herzmeister der Welten, io ora so che ci sono! L'ho provato e ha funzionato davvero!

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 non contiene un Binary Search Tree. Contiene un Red-Black Tree che è un tipo specializzato di albero di ricerca binaria in cui ogni nodo è dipinto in rosso o nero e ci sono alcune regole che usano questi colori che mantengono l'albero bilanciato e consente all'albero di garantire i tempi di ricerca O (logn) . Un albero di ricerca binaria standard non può garantire questi tempi di ricerca.

La classe è denominata SortedSet<T> ed è stata introdotta in .NET 4.0. Puoi guardare il suo codice sorgente here.Ecco un esempio di esso è 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

Cinque anni dopo ho chiesto la domanda che mi sono reso conto che c'è davvero un costruito in Binary Search Tree in .NET 4.0. Probabilmente è stato aggiunto in seguito e funziona come previsto. Si autostabilancia (attraversa) dopo ogni inserimento che riduce le prestazioni all'aggiunta di una vasta gamma di articoli.

La classe SortedDictionary<TKey, TValue> ha le seguenti osservazioni:

La classe generica SortedDictionary è un albero binario di ricerca con O (log n) di recupero, dove n è il numero di elementi nel dizionario. In questo senso, è simile alla classe generica SortedList. Le due classi hanno modelli di oggetti simili ed entrambi hanno il recupero di O (log n).

+1

Perché avresti bisogno di una chiave (forse il tuo modello lo richiedeva)? Non SortedSet copre già questo (ma senza la chiave)? – bbqchickenrobot

+0

@bbqchickenrobot Ecco perché ho accettato la risposta SortedSet ;-) –

Problemi correlati