Voici la source de ma question.
Étant donné un arbre à équilibrage automatique (AVL), codez une méthode qui renvoie la médiane.
(Médiane: la valeur numérique séparant la moitié supérieure d'un échantillon de données de la moitié inférieure. Exemple: si la série est
2, 7, 4, 9, 1, 5, 8, 3, 6
alors la médiane est 5.)
Je peux proposer la solution suivante:
- Parcourez l'arbre donné, retournez le nombre d'éléments.
- Traversez
n / 2 + 1
(sin
c'est impair) l'arbre en appliquant à nouveau une marche dans l'arbre dans l'ordre. La valeur dun / 2 + 1
e élément est la médiane.
Mais je peux le faire avec un arbre de recherche binaire, non? Existe-t-il un meilleur algorithme pour un AVL?
data-structures
search-trees
selection-problem
balanced-search-trees
Maksim Dmitriev
la source
la source
Réponses:
Si vous modifiez l'arborescence AVL en stockant la taille de la sous-arborescence à chaque nœud plutôt que juste sa hauteur, alors vous pouvez trouver la médiane dans le tempsO(logn) en utilisant le fait que l'arbre est équilibré. Pour ce faire, vous écrivez une procédure plus générale Sélectionnez qui accepte un nœudv et un certain nombre k et trouve le k e plus petit nœud du sous-arbre enraciné à v .
Supposons que le sous-arbre gauche (le cas échéant) aitL nœuds. Sik ≤ L puis nous rentrons dans le sous-arbre gauche. Sik = L + 1 puis nous revenons v . Sinon, nous rentrons dans le sous-arbre droit, réduisantk par L + 1 .
Le temps d'exécution de cet algorithme est linéaire dans la hauteur de l'arbre, qui estO ( logn ) .
la source
AVL est un arbre de recherche binaire avec une propriété spéciale: c'est un arbre auto-équilibré. Sa hauteur est toujours logarithmique. L'arbre binaire ordinaire dans certains pires scénarios peut être une liste liée (si vous ajoutez des données triées), sa hauteur est donc n. L'arbre AVL dans le pire des cas est l'arbre fibonacci.
la source