Existe-t-il une arborescence de recherche binaire intégrée dans .NET 4.0, ou dois-je créer ce type de données abstrait à partir de zéro?
Il s'agit de l'arbre de recherche binaire en particulier, et non du type de données abstrait "arbres" en général.
Je pense que le SortedSet<T>
classe dans System.Collections.Generic
est ce que vous recherchez.
Il est implémenté à l'aide d'un arbre rouge-noir auto-équilibré qui donne une complexité de performance de O (log n) pour l'insertion, la suppression et la recherche. Il est utilisé pour conserver les éléments dans un ordre trié, pour obtenir le sous-ensemble d'éléments dans une plage particulière, ou pour obtenir Min ou Élément Max de l'ensemble.
Cinq ans après avoir posé la question, je me suis rendu compte qu'il existe en effet un arbre de recherche binaire intégré dans .NET 4.0. Il a probablement été ajouté plus tard et fonctionne comme prévu. Il s'équilibre automatiquement (traversant) après chaque insertion, ce qui diminue les performances lors de l'ajout d'une large gamme d'articles.
Le SortedDictionary<TKey, TValue>
La classe a les remarques suivantes:
La classe générique SortedDictionary est un arbre de recherche binaire avec récupération O (log n), où n est le nombre d'éléments dans le dictionnaire. À cet égard, elle est similaire à la classe générique SortedList. Les deux classes ont des modèles d'objets similaires et les deux ont une récupération O (log n).
un arbre binaire AVL équilibré C # peut être trouvé @ http://code.google.com/p/self-balancing-avl-tree/ .it implémente également des opérations de concaténation et de division logarithmiques
Non, .NET ne contient pas arbre de recherche binaire . Il contient un arbre rouge-noir qui est un type spécialisé d'arbre de recherche binaire dans lequel chaque nœud est peint en rouge ou en noir et il existe certaines règles utilisant ces couleurs qui maintiennent l'arbre équilibré et permettent à l'arbre pour garantir O (logn) les temps de recherche. Un arbre de recherche binaire standard ne peut garantir ces temps de recherche.
La classe est appelée SortedSet<T>
et a été introduit dans .NET 4.0. Vous pouvez regarder son code source ici . Voici un exemple de son utilisation:
// 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
La bibliothèque de collections C5 (voir http://www.itu.dk/research/c5/ ) comprend TreeDictionary<>
classes avec des arbres binaires équilibrés rouge-noir. Remarque: Je n'ai pas encore utilisé cette bibliothèque, car le travail que je fais n'a besoin de rien de plus que les collections .NET standard.
La réponse est non.
Il existe cependant des implémentations. Jetez un œil au lien suivant:
Merci à herzmeister der welten, je sais maintenant qu'il y en a! Je l'ai essayé et ça a vraiment fonctionné!
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();
}
}
}
Je ne sais pas exactement ce que vous voulez dire par "arbre", mais vous pouvez faire des recherches binaires sur la classe 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 );