Créer un arbre binaire équilibré à partir d'un flux d'entiers

voix
10

Je viens de terminer une entrevue d'emploi et je luttais avec cette question, ce qui me semble une question très difficile de donner un entretien de 15 minutes.

La question était: écrire une fonction qui donne un flux d'entiers (non ordonnées), construit un arbre de recherche équilibré. Maintenant, vous ne pouvez pas attendre l'entrée à la fin (il est un cours d'eau), vous avez donc besoin d'équilibrer l'arbre à la volée.

Ma première réponse était d'utiliser un arbre rouge-noir, ce qui bien sûr fait le travail, mais je dois supposer qu'ils ne me attendent à mettre en place un arbre noir rouge en 15 minutes.

Alors, est-il une solution simple pour ce problème, je ne suis pas au courant?

Merci,

Dave

Créé 29/08/2011 à 22:25
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
3

Les arbres AA sont un peu plus simple que les arbres rouge-noir, mais je ne pouvais pas mettre en œuvre un du haut de ma tête.

Créé 29/08/2011 à 22:28
source utilisateur

voix
9

Personnellement , je pense que la meilleure façon de le faire serait d'aller pour un arbre de recherche binaire aléatoire comme un Treap . Cela ne signifie pas une garantie absolue que l'arbre sera équilibré, mais avec une forte probabilité de l'arbre aura un bon facteur d'équilibre. Un Treap fonctionne en augmentant chaque élément de l'arbre avec un nombre uniformément aléatoire, puis faire en sorte que l'arbre est un arbre de recherche binaire par rapport aux clés et un tas par rapport aux valeurs aléatoires uniformes. L' insertion dans un Treap est extrêmement facile:

  1. Choisissez un nombre aléatoire pour attribuer à l'élément nouvellement ajouté.
  2. Insérer l'élément dans le BST utilisant insertion standard BST.
  3. Alors que la clé de l'élément nouvellement inséré est supérieure à la clé de sa mère, effectuer une rotation de l'arbre pour amener le nouvel élément au-dessus de son parent.

Cette dernière étape est le seul vraiment dur, mais si vous avez eu un certain temps pour le travailler sur un tableau blanc, je suis sûr que vous pouvez mettre en œuvre ce sur la volée dans une interview.

Une autre option qui pourrait fonctionner serait d'utiliser un arbre évasement . Il est un autre type de BST rapide qui peut être mis en œuvre en supposant que vous avez une fonction standard d'insertion BST et la capacité de faire la rotation des arbres. Il est important, les arbres ébrasés sont extrêmement rapides dans la pratique, et on sait que ce sont (à un facteur constant) au moins aussi bon que tout autre arbre de recherche binaire statique.

Selon ce qui signifie « arbre de recherche », vous pouvez également envisager de stocker les entiers dans une structure optimisée pour la recherche d'entiers. Par exemple, vous pouvez utiliser une structure arborescente de bits pour stocker les entiers, qui charge la recherche dans le temps proportionnel au nombre de bits en un mot de la machine. Cela peut être mis en œuvre tout à fait bien en utilisant une fonction récursive pour regarder par- dessus les bits, et ne nécessite aucune sorte de rotations. Si vous avez besoin pour faire sauter une mise en œuvre en quinze minutes, et si l'intervieweur vous permet de dévier des arbres binaires de recherche standard, cela pourrait être une excellente solution.

J'espère que cela t'aides!

Créé 29/08/2011 à 22:33
source utilisateur

voix
1

L' un des plus simple arbre binaire équilibré est BB (α) -tree. Vous choisissez l'α constant, qui dit combien l'arbre peut obtenir déséquilibré. En tout temps, #descendants(child) <= (1-α) × #descendants(node)doit tenir. Vous traitez comme arbre de recherche binaire normal, mais quand la formule ne s'applique pas à un nœud plus, vous reconstruisez juste cette partie de l'arbre à partir de zéro, de sorte qu'il est parfaitement équilibré.

La complexité de temps après amortissement pour l'insertion ou la suppression est toujours O (log N), comme avec d'autres arbres binaires équilibrés.

Créé 29/08/2011 à 22:49
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more