web-dev-qa-db-fra.com

Existe-t-il une arborescence de recherche binaire intégrée dans .NET 4.0?

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?

Éditer

Il s'agit de l'arbre de recherche binaire en particulier, et non du type de données abstrait "arbres" en général.

60
Benny Skogberg

Je pense que le SortedSet<T> classe dans System.Collections.Generic est ce que vous recherchez.

De cet article CodeProject :

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.

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

54
herzmeister

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).

19
Benny Skogberg

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

7
ros

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
7

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.

4
Dr Herbie

La réponse est non.

Il existe cependant des implémentations. Jetez un œil au lien suivant:

Arbre binaire en C #

3
Leniel Maccaferri

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

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