web-dev-qa-db-fra.com

Tas vs arbre de recherche binaire (BST)

Quelle est la différence entre un tas et BST? 

Quand utiliser un tas et quand utiliser un BST? 

Si vous voulez obtenir les éléments de manière triée, BST est-il meilleur que le tas?

131
kc3

Heap garantit simplement que les éléments des niveaux supérieurs sont plus grands (pour max-tas) ou plus petits (pour les min-tas) que les éléments des niveaux inférieurs, alors que BST garantit l'ordre (de "gauche" à "droite"). Si vous voulez des éléments triés, utilisez BST.

66

Quand utiliser un tas et quand utiliser un BST

Heap est meilleur à findMin/findMax (O(1)), tandis que BST est bon à all trouve (O(logN)). Insert est O(logN) pour les deux structures. Si vous ne vous souciez que de findMin/findMax (par exemple, lié à une priorité), optez pour heap. Si vous voulez tout régler, allez avec BST.

Les premières diapositives de ici expliquent les choses très clairement.

46
xysun

Comme mentionné par d'autres, Heap peut faire findMinoufindMax dans O(1) mais pas les deux dans la même structure de données. Cependant, je ne suis pas d'accord pour dire que Heap est meilleur dans findMin/findMax. En fait, avec une légère modification, le BST peut faire les deuxfindMinetfindMax dans O (1).

Dans ce fichier BST modifié, vous gardez une trace du nœud min et du nœud max chaque fois que vous effectuez une opération pouvant potentiellement modifier la structure de données. Par exemple, lors d'une opération d'insertion, vous pouvez vérifier si la valeur minimale est supérieure à la valeur nouvellement insérée, puis affecter la valeur minimale au noeud nouvellement ajouté. La même technique peut être appliquée sur la valeur maximale. Par conséquent, cette BST contient ces informations que vous pouvez récupérer dans O (1). (identique au tas binaire)

Dans ce BST (BST équilibré), lorsque vous pop min ou pop max, la prochaine valeur minimale à affecter est le successeur du noeud min, tandis que la prochaine valeur maximale à affecter est le prédécesseur du nœud max. Ainsi, il effectue dans O (1). Cependant, nous devons rééquilibrer l’arbre pour qu’il continue à exécuter O (log n). (identique au tas binaire)

Je serais intéressé d'entendre votre pensée dans le commentaire ci-dessous. Merci :)

Mettre à jour

Renvoi à une question similaire Pouvons-nous utiliser un arbre de recherche binaire pour simuler le fonctionnement du tas? pour plus de discussion sur la simulation de tas utilisant BST. 

7
Yeo

Une autre utilisation de BST sur Heap; à cause d'une différence importante:

  • trouver le successeur et le prédécesseur dans un fichier BST prend O(h) temps. (O(logn) en BST équilibré)
  • tandis que dans Heap, prendrait O(n) le temps de trouver le successeur ou le prédécesseur d'un élément.

Utilisation de la BST sur un segment de mémoire : Maintenant, disons que nous utilisons une structure de données pour stocker l'heure d'atterrissage des vols. Nous ne pouvons pas programmer d'atterrissage si la différence d'horaire d'atterrissage est inférieure à «d». Et supposons que de nombreux vols atterrissent dans une structure de données (BST ou Heap).

Nous voulons maintenant programmer un autre vol qui atterrira à t . Par conséquent, nous devons calculer la différence de t avec son successeur et son prédécesseur (devrait être> d). Ainsi, nous aurons besoin d’un BST pour cela, ce qui le fait rapidement c’est-à-dire dans O(logn) s’il est équilibré.

Édité:

Sorting BST prend O(n) le temps nécessaire pour imprimer les éléments dans un ordre trié (ordre transversal), tandis que Heap peut le faire en temps O (n logn) heapifie le tableau, ce qui lui permet de faire le tri en temps O (n logn).

3
CODError

Un arbre de recherche binaire utilise la définition suivante: pour chaque nœud, le nœud situé à sa gauche a une valeur inférieure (clé) et le nœud situé à sa droite a une valeur supérieure (clé). 

Where, étant une implémentation d'un arbre binaire, utilise la définition suivante: 

Si A et B sont des nœuds, où B est le nœud enfant de A, alors la valeur (clé) de A doit être supérieure ou égale à la valeur (clé) de B. C’est, Clé (A) ≥ clé (B).

http://wiki.answers.com/Q/Difference_between_binary_search_tree_and_heap_tree

J'ai posé la même question aujourd'hui pour mon examen et j'ai bien compris. sourire ... :) 

Insérer tous les n éléments d’un tableau dans BST prend O (n logn). n éléments d'un tableau peuvent être insérés dans un segment de mémoire dans O(n). Ce qui donne un avantage certain au tas 

1
AMR

Heap garantit simplement que les éléments des niveaux supérieurs sont supérieurs (pour max-tas) ou plus petits (pour min-tas) que les éléments des niveaux inférieurs

J'aime la réponse ci-dessus et mettre mon commentaire juste plus spécifique à mon besoin et à mon utilisation. Je devais obtenir la liste des n emplacements afin de trouver la distance entre chaque emplacement et un point spécifique, par exemple (0,0), puis de renvoyer les emplacements ad m ayant une distance inférieure. J'ai utilisé la file d'attente prioritaire qui est Heap. Pour trouver les distances et les mettre dans le tas, il m'a fallu n(log(n)) n-emplacements log (n) à chaque insertion. Ensuite, pour obtenir m avec les distances les plus courtes, il a fallu m(log(n)) m-emplacements log (n) suppressions d’empilement. 

Si je devais faire cela avec BST, cela m'aurait pris n(n) dans le pire des cas. seul ou à gauche enfant dans le cas de plus en plus petit. Le min aurait pris O(1) temps mais encore une fois je devais équilibrer . Donc de ma situation et toutes les réponses ci-dessus réponses ce que j'ai obtenu est quand vous seulement après que les valeurs avec la priorité min ou max ont été choisies pour le tas.

0
Sahib Khan