Lorsque la plupart des gens parlent d'arbres binaires, ils pensent le plus souvent aux arbres binaires. recherche arbres, donc je vais couvrir ça en premier.
Un arbre de recherche binaire non équilibré n'est en fait guère plus utile que pour enseigner aux étudiants les structures de données. En effet, à moins que les données n'arrivent dans un ordre relativement aléatoire, l'arbre peut facilement dégénérer en sa forme la plus défavorable, qui est une liste liée, puisque les arbres binaires simples sont no équilibré.
Un bon exemple : j'ai eu à réparer un logiciel qui chargeait ses données dans un arbre binaire pour les manipuler et les rechercher. Il écrivait les données sous forme triée :
Alice
Bob
Chloe
David
Edwina
Frank
de sorte que, en le relisant, on obtient l'arbre suivant :
Alice
/ \
= Bob
/ \
= Chloe
/ \
= David
/ \
= Edwina
/ \
= Frank
/ \
= =
qui est la forme dégénérée. Si vous cherchez Frank dans cet arbre, vous devrez chercher dans les six nœuds avant de le trouver.
Les arbres binaires deviennent vraiment utiles pour la recherche lorsque vous les équilibrez. Cela implique de faire tourner les sous-arbres à travers leur nœud racine de manière à ce que la différence de hauteur entre deux sous-arbres soit inférieure ou égale à 1. Si l'on ajoute les noms ci-dessus, un par un, dans un arbre équilibré, on obtient la séquence suivante :
1. Alice
/ \
= =
2. Alice
/ \
= Bob
/ \
= =
3. Bob
_/ \_
Alice Chloe
/ \ / \
= = = =
4. Bob
_/ \_
Alice Chloe
/ \ / \
= = = David
/ \
= =
5. Bob
____/ \____
Alice David
/ \ / \
= = Chloe Edwina
/ \ / \
= = = =
6. Chloe
___/ \___
Bob Edwina
/ \ / \
Alice = David Frank
/ \ / \ / \
= = = = = =
Vous pouvez en fait voir des sous-arbres entiers tourner vers la gauche (aux étapes 3 et 6) au fur et à mesure que les entrées sont ajoutées, ce qui vous donne un arbre binaire équilibré dans lequel la consultation la plus défavorable est la suivante O(log N)
plutôt que le O(N
) que la forme dégénérée donne. A aucun moment, le NULL le plus élevé ( =
) diffèrent des plus bas de plus d'un niveau. Et, dans l'arbre final ci-dessus, vous pouvez trouver Frank en regardant seulement trois noeuds ( Chloe
, Edwina
et, enfin, Frank
).
Bien sûr, ils peuvent devenir encore plus utiles lorsque vous les rendez équilibrés multi-voies des arbres plutôt que des arbres binaires. Cela signifie que chaque nœud contient plus d'un élément (techniquement, ils contiennent N éléments et N+1 pointeurs, un arbre binaire étant un cas particulier d'un arbre multivoie à 1 voie, avec 1 élément et 2 pointeurs).
Avec un arbre à trois voies, on se retrouve avec :
Alice Bob Chloe
/ | | \
= = = David Edwina Frank
/ | | \
= = = =
Cette fonction est généralement utilisée pour gérer les clés d'un index d'éléments. J'ai écrit un logiciel de base de données optimisé pour le matériel où un nœud a exactement la taille d'un bloc de disque (disons 512 octets) et où vous mettez autant de clés que vous pouvez dans un seul nœud. Le site pointeurs dans ce cas, étaient en fait des numéros d'enregistrement dans un fichier à accès direct de longueur fixe distinct du fichier d'index (donc le numéro d'enregistrement X
pourrait être trouvé en cherchant simplement à X * record_length
).
Par exemple, si les pointeurs sont de 4 octets et que la taille des clés est de 10, le nombre de clés dans un nœud de 512 octets est de 36. Cela représente 36 clés (360 octets) et 37 pointeurs (148 octets) pour un total de 508 octets avec 4 octets gaspillés par nœud.
L'utilisation de clés multivoie introduit la complexité d'une recherche en deux phases (une recherche multivoie pour trouver le bon nœud combinée à une petite recherche séquentielle (ou binaire linéaire) pour trouver la bonne clé dans le nœud) mais l'avantage de faire moins d'E/S disque compense largement.
Je ne vois aucune raison de faire cela pour une structure en mémoire, vous feriez mieux de vous en tenir à un arbre binaire équilibré et de garder votre code simple.
N'oubliez pas non plus que les avantages de O(log N)
en O(N)
n'apparaissent pas vraiment lorsque vos ensembles de données sont petits. Si vous utilisez un arbre à plusieurs voies pour stocker les quinze personnes de votre carnet d'adresses, c'est probablement trop. Les avantages apparaissent lorsque vous stockez quelque chose comme toutes les commandes de vos cent mille clients au cours des dix dernières années.
L'intérêt de la notation big-O est d'indiquer ce qui se passe lorsque le système N
s'approche de l'infini. Certaines personnes peuvent ne pas être d'accord, mais il est même possible d'utiliser le tri à bulles si vous êtes sûr que les ensembles de données resteront en dessous d'une certaine taille, tant que rien d'autre n'est facilement disponible :-)
Quant aux autres utilisations des arbres binaires, il en existe un grand nombre, comme par exemple :
- Les tas binaires où les clés supérieures sont supérieur ou égal à inférieurs plutôt qu'à gauche de (ou en dessous ou égal à et à droite) ;
- Les arbres de hachage, similaires aux tables de hachage ;
- Arbres syntaxiques abstraits pour la compilation de langages informatiques ;
- Arbres de Huffman pour la compression de données ;
- Arbres de routage pour le trafic réseau.
Étant donné la quantité d'explications que j'ai générées pour les arbres de recherche, je suis réticent à entrer dans beaucoup de détails sur les autres, mais cela devrait suffire pour les rechercher, si vous le souhaitez.