Tas vs Binaires un Arbre de Recherche (BST)
Quelle est la différence entre un segment et de la BST?
Quand utiliser un tas et quand utiliser un BST?
Si vous voulez obtenir les éléments triés de la mode, est cest mieux au fil du tas?
- Cette question semble être hors-sujet, car il est sur l'ordinateur de la science et de la devraient être posées sur cs.stackexchange.com
- il a été demandé il y à: cs.stackexchange.com/questions/27860/...
- Je me sens comme il se rapporte à la fois de la pile d'échange et de dépassement de pile. Donc, avoir ici est très bien
Vous devez vous connecter pour publier un commentaire.
Résumé
Tous les temps moyens sur ce tableau sont les mêmes que leurs pires moments, sauf pour les Insérer.
*
: partout dans cette réponse, BST == Équilibré de la STB, depuis déséquilibrée suce asymptotiquement**
: à l'aide d'un trivial modification expliqué dans cette réponse***
:log(n)
de pointeur arbre tas,n
pour tableau dynamique tasAvantages des tas binaire sur un BST
temps moyen d'insertion dans un tas binaire est
O(1)
, pour la STB estO(log(n))
. Ce est la killer feature de des tas.Il y a aussi des tas d'autres qui atteignent
O(1)
amorti (plus fort) comme le Tas De Fibonacci, et même le pire des cas, comme le Brodal file d'attente, même si elles peuvent ne pas être pratique en raison de la non-performance asymptotique: Sont les tas de Fibonacci ou Brodal files d'attente utilisé dans la pratique de n'importe où?binaire tas peuvent être efficacement mises en œuvre sur le dessus de les tableaux dynamiques ou pointeur basées sur les arbres, BST seulement pointeur basées sur les arbres. Donc, pour la masse, on peut choisir le plus efficace de l'espace de la matrice de mise en œuvre, si nous pouvons nous permettre occasionnel redimensionner les latences.
tas binaire création est
O(n)
pire des cas,O(n log(n))
pour BST.Avantage de la BST sur tas binaire
de recherche pour arbitraire des éléments est
O(log(n))
. Ce est la killer feature de techniciennes se chargent.Pour les tas, c'est
O(n)
en général, sauf pour le plus grand élément de qui estO(1)
."False" l'avantage de tas plus de BST
tas est
O(1)
pour trouver max, BSTO(log(n))
.C'est une idée fausse commune, parce que c'est facile à modifier un BST pour garder une trace de l'élément le plus large et le mettre à jour à chaque fois que cet élément puisse être changé: à l'insertion d'un plus grand échange, sur la suppression de trouver la deuxième plus grande. Peut-on utiliser les binaires de recherche arbres pour simuler des tas de fonctionnement? (mentionné par Yeo).
En fait, c'est un limitation de segments par rapport à techniciennes se chargent: le seulement l'efficacité de la recherche est que, pour le plus grand élément.
Moyenne tas binaire insert est
O(1)
Sources:
L'argument intuitif:
Dans un tas binaire, l'augmentation de la valeur à un index donné est également
O(1)
pour la même raison. Mais si vous voulez le faire, il est probable que vous aurez envie de garder un supplément d'index à jour sur les opérations segment Comment mettre en œuvre O(logn) diminution de la touche de fonctionnement pour min-tas en fonction de la Priorité de la File d'attente? par exemple pour Dijkstra. Possible sans supplément de coût.GCC C++ standard library insérer un repère de référence sur le matériel réel
Je comparés le C++
std::set
(Rouge-noir arbre de la STB) etstd::priority_queue
(tableau dynamique tas) insert pour voir si j'avais raison à propos de l'insérer fois, et c'est ce que j'ai:Clairement:
tas insérez le temps est essentiellement constante.
Nous pouvons clairement voir tableau dynamique redimensionner points. Puisque nous sommes en moyenne tous les 10k insère pour être en mesure de voir quoi que ce soit au-dessus de bruit du système, ces pics sont en fait d'environ 10k fois plus grand que le montre!
L'agrandissement du graphique exclut essentiellement que le tableau redimensionner points, et montre que presque tous les inserts chute de moins de 25 nanosecondes.
BST est logarithmique. Tous les inserts sont beaucoup plus lents que la moyenne des tas insérer.
BST vs hashmap analyse détaillée à: Quelle structure de données est à l'intérieur de std::map en C++?
GCC C++ standard library insérer une référence sur gem5
gem5 est un système complet simulateur, et fournit donc une infiniment précis de l'horloge avec
m5 dumpstats
. J'ai donc essayé de l'utiliser pour estimer les horaires pour personne insère.Interprétation:
tas est toujours constante, mais nous voyons maintenant plus en détail qu'il y a quelques lignes, et chaque ligne plus importante est plus clairsemée.
Cela doit correspondre à la mémoire de la latence d'accès sont fait de plus en plus élevés des inserts.
TODO je ne peux pas vraiment interpréter le BST pleinement, comme il n'a pas l'air si logarithmique et un peu plus constant.
Avec cela plus en détail, mais nous pouvons voir pouvez également voir quelques lignes distinctes, mais je ne suis pas sûr de ce qu'ils représentent: je pense à la ligne de fond pour être plus mince, puisque nous insérer en haut en bas?
Comparés avec ce Le programme d'installation de Buildroot sur un aarch64 HPI CPU.
BST ne peuvent pas être efficacement mis en œuvre sur un tableau
Opérations segment seulement besoin de la bulle vers le haut ou vers le bas d'une simple branche d'arbre, de sorte
O(log(n))
pire des cas, des swaps, desO(1)
moyenne.En gardant un BST équilibrée nécessite l'arbre de rotation, ce qui peut modifier le premier élément à un autre, et serait d'exiger le déplacement de l'ensemble de la matrice autour de (
O(n)
).Tas peuvent être efficacement mis en œuvre sur un tableau
Parent et les enfants indices peuvent être calculés à partir de l'indice actuel comme illustré ici.
Il n'y a pas d'équilibrage des opérations comme la BST.
Supprimer min est la plus préoccupante de l'opération, car il doit être de haut en bas. Mais il peut toujours être fait par la "percolation vers le bas" une branche de la tas comme expliqué ici. Cela conduit à un O(log(n)) le pire des cas, puisque le tas est toujours bien équilibré.
Si vous êtes l'insertion d'un nœud unique pour chacun de vous retirer, vous perdez l'avantage de l'asymptotique O(1) moyenne insérer que des tas de fournir les supprimer dominer, et vous pourriez aussi bien utiliser un BST. Dijkstra cependant mises à jour des nœuds plusieurs fois pour chaque retrait, de sorte que nous sommes bien.
Tableau dynamique des tas vs pointeur arbre des tas
Tas peuvent être efficacement mises en œuvre sur le dessus de pointeur tas: Est-il possible de rendre efficace pointeur de base tas binaire implémentations?
La dynamique de la matrice de mise en œuvre plus efficace de l'espace. Supposons que chaque élément de tas contient un pointeur vers un
struct
:l'arbre de la mise en œuvre doit stocker trois pointeurs pour chaque élément: parent, à gauche de l'enfant et de droit de l'enfant. Donc, l'utilisation de la mémoire est toujours
4n
(3 arbre pointeurs + 1struct
pointeur).Arbre techniciennes se chargent aussi besoin de plus d'équilibrer l'information, par exemple noir-rouge-ness.
la dynamique de la matrice de mise en œuvre peuvent être de taille
2n
juste après un doublement. Donc en moyenne, il va être1.5n
.D'autre part, l'arbre tas est mieux pire des cas insert, parce que la copie de la sauvegarde de tableau dynamique à double de sa taille
O(n)
pire des cas, tandis que l'arbre tas juste fait de nouvelles petites allocations pour chaque nœud.Encore, le soutien de la matrice de doublement est
O(1)
amorti, de sorte qu'il se résume à un maximum de latence considération. Mentionné ici.Philosophie
Techniciennes se chargent de maintenir une propriété globale entre un parent et tous les descendants (à gauche plus petit, de droite plus).
Le nœud supérieur de la STB est le milieu de l'élément, ce qui nécessite la connaissance globale de maintenir (sachant combien les petits et les grands éléments sont là).
Cette propriété est plus cher à l'entretien (log n insert), mais donne plus de moteur de recherche puissant (n log de recherche).
Des tas de maintenir une propriété locale entre les parents et les enfants directs (parents > les enfants).
La note de tête d'un segment est le grand élément, qui ne nécessite que des connaissances locales pour maintenir (en sachant que votre parent).
Doublement lié liste
Une liste doublement chaînée peut être vu comme sous-ensemble de la masse, où le premier élément est plus grande priorité, donc, nous allons comparer ici:
O(1)
pire des cas, puisque nous avons des pointeurs vers les objets, et la mise à jour est vraiment simpleO(1)
moyenne, donc pire que la liste liée. Compromis pour avoir plus générale, en position d'insertion.O(n)
pour les deuxUn cas d'utilisation de ce est quand la clé de la tas est le timestamp actuel: dans ce cas, les nouvelles entrées seront toujours d'aller au début de la liste. Donc, on peut même oublier l'horodatage exact tout à fait, et il suffit de garder la position dans la liste, comme la priorité.
Ceci peut être utilisé pour mettre en œuvre un Cache LRU. Tout comme pour des tas d'applications comme Dijkstra, vous voulez garder un supplément de table de hachage de la clé du nœud correspondant de la liste, pour trouver le nœud de mettre à jour rapidement.
Voir aussi
Question similaire sur CS: https://cs.stackexchange.com/questions/27860/whats-the-difference-between-a-binary-search-tree-and-a-binary-heap
O(1)
.Tas juste garantit que les éléments sur les niveaux les plus élevés sont plus (pour max-heap) ou plus petite (pour min-tas) que des éléments sur les niveaux inférieurs, tandis que la BST, les garanties de commande (de "gauche" et "droite"). Si vous voulez éléments triés, aller avec BST.
[1, 5, 9, 7, 15, 10, 11]
représente un valide min-segment, mais le7
sur le niveau 3 est plus petit que9
sur le niveau 2. Pour une visualisation, voir, par exemple, la25
et19
éléments dans l'exemple de Wikipédia image pour les segments. (Notez aussi que l'inégalité des relations entre les éléments ne sont pas strictes, puisque les éléments ne sont pas nécessairement uniques.)Tas est mieux à findMin/findMax (
O(1)
), tandis que le BST est bon à tous trouve (O(logN)
). Insérer estO(logN)
pour les deux structures. Si vous ne se soucient findMin/findMax (par exemple, la priorité en matière d', aller avec le tas. Si vous voulez tout trié, aller avec BST.D'abord quelques diapositives à partir de ici expliquer les choses très clairement.
Comme mentionné par d'autres, Tas peut faire
findMin
oufindMax
en O(1) mais pas les deux dans la même structure de données. Cependant je suis en désaccord que le Segment est de mieux en findMin/findMax. En fait, avec une légère modification, le BST peut faire les deuxfindMin
etfindMax
en O(1).Dans cette modification de la STB, de garder une trace de la la min nœud et max nœud à chaque fois que vous effectuez une opération qui peut potentiellement modifier la structure de données. Par exemple, dans l'opération d'insertion, vous pouvez vérifier si la valeur min est plus grande que la nouvelle valeur insérée, puis affectez-lui la valeur min du nœud nouvellement ajouté. La même technique peut être appliquée sur la valeur de max. Par conséquent, cette BST contenir ces informations que vous pouvez les récupérer en O(1). (de même que le tas binaire)
Dans ce BST (Équilibré BST), lorsque vous
pop min
oupop max
, la prochaine valeur min pour être affecté est le successeur de la min nœud, tandis que la prochaine valeur max d'être affecté est le prédécesseur de max nœud. Ainsi, il effectue en O(1). Cependant, nous avons besoin de ré-équilibrer l'arbre, donc il va encore s'exécuter en O(log n). (de même que le tas binaire)Je serais intéressé à entendre vos pensées dans les commentaires ci-dessous. Merci 🙂
Mise à jour
Renvoi à la question similaire Peut-on utiliser les binaires de recherche arbres pour simuler des tas de fonctionnement? pour plus de discussion sur la simulation Tas à l'aide de la STB.
popMin
oupopMax
il n'est pas O(1), mais il est O(log n), car il a bien l'Équilibre de la STB qui ont besoin d'être rééquilibrer chaque opération de suppression. Donc il le même que tas binairepopMin
oupopMax
qui exécuter en O(log n)Un arbre de recherche binaire utilise la définition: pour chaque nœud,le nœud de la gauche, a une moindre valeur(key) et le nœud à la droite de celui-ci a une plus grande valeur(key).
Où, comme le tas,en cours de mise en œuvre d'un arbre binaire utilise la définition suivante:
Si A et B sont des nœuds, où B est l'enfant du nœud A,puis la valeur(key) de l'Un doit être supérieure ou égale à la valeur(key) de B. C'est,
clé(Un) ≥ touche(B).
http://wiki.answers.com/Q/Difference_between_binary_search_tree_and_heap_tree
J'ai couru dans la même question aujourd'hui pour mon examen et je l'ai eu droit. sourire ... 🙂
Une autre utilisation de la BST sur Tas; en raison d'une différence importante :
Utilisation de la BST sur un Tas: Maintenant, disons que nous utilisons une structure de données pour stocker l'heure du débarquement des vols. Nous ne pouvons pas planifier un vol à la terre en cas de différence dans l'atterrissage temps est inférieur à "d". Et d'assumer de nombreux vols ont été programmés à la terre dans une structure de données(BST ou d'un Segment).
Maintenant, nous voulons organiser un autre Vol qui va atterrir à t. Par conséquent, nous avons besoin de calculer la différence de t avec son successeur et prédécesseur (qui devrait être >d).
Ainsi, nous avons besoin d'un BST pour cela, qui est-il rapide c'est à dire en O(logn) si équilibré.
Édité:
Tri BST prend O(n) le temps d'imprimer les éléments dans l'ordre de tri (Afinde traversal), tandis que le Segment peut le faire en O(n logn) de temps.
Tas d'extraits min élément et re-heapifies le tableau, qui lui fait faire le tri en O(n logn) temps.
from unsorted to sorted sequence. O(n) time for inorder traversal of a BST, which gives sorted sequence.
Bien, à partir de séquence non triée à la BST, je ne sais pas une méthode basée sur la comparaison clé avec moins de O(n logn) le temps, qui domine la BST à la séquence de la partie. (Alors qu'il n'y est O(n) segment de la construction.). Je considérerais-il juste (si inutile) à l'état de tas en étant à proximité de unsortedness et techniciennes se chargent du tri.Insérer tous les n éléments d'un tableau à la STB prend O(n logn). n elemnts dans un tableau peut être inséré à un segment de mémoire en O(n) fois. Ce qui donne tas un avantage certain
J'adore la réponse ci-dessus et de mettre mon commentaire juste plus spécifiques à mon besoin et de l'utilisation. J'ai eu pour obtenir le n liste des emplacements trouver la distance à partir de chaque emplacement de point spécifique dire (0,0) et de revenir à l'a m emplacements ayant la plus petite distance. J'ai utilisé de la File d'attente de Priorité qui est Tas.
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) des suppressions d'accumulation.
Si je l'aurais à faire avec la STB, ça m'aurait pris n(n) le pire des cas de l'insertion.(Disons que la première valeur est très petite et tous les autres vient de façon séquentielle de plus en plus longtemps et l'arbre s'étend au droit de l'enfant seul ou à gauche de l'enfant en cas de plus en plus petits. Le min aurait pris O(1) fois, mais j'ai à nouveau l'équilibre.
Donc, à partir de ma situation et toutes les réponses ci-dessus, ce que j'ai, c'est quand vous êtes seulement après les valeurs min ou max priorité aller pour tas.