Quel est le point de make_heap?
Quelqu'un peut-il me dire le point de la STL tas de modèles de fonction comme std::make_heap
? Pourquoi serait-on jamais les utiliser? Est-il pratique à l'usage?
- Je tiens à vous voir faire un tas de tri sans fonction make_heap 😛
Vous devez vous connecter pour publier un commentaire.
Si vous voulez faire un file d'attente de priorité arrière à partir d'une liste, eh bien, vous pouvez utiliser make_heap:
vector
changements simake_heap
est appliqué comme le jeûne de récupération doit être pris en charge par elle? Comment est-il différent de trier le vecteur?make_heap
seulement crypte vos données de vecteur, c'est tout. Le tri d'un élément peut être une option aussi, mais l'insertion et la suppression nécessitent linéaire le temps au lieu de temps logarithmique (vous avez besoin pour faire de la place pour le nouvel élément lorsque vous ajoutez, et qui a besoin d'un temps linéaire, par exemple).Votre question directe serait bien répondu par une classe d'algorithmes et structures de données. Des tas sont utilisés partout dans les algorithmes en informatique. Pour citer le make_heap fonction en lien ci-dessous, "un tas est un arbre où chaque nœud de liens vers des valeurs qui ne sont pas plus grand que sa propre valeur." Alors qu'il y a beaucoup de demandes pour un segment, celui que j'utilise le plus souvent est à la recherche des problèmes lorsque vous souhaitez garder une trace d'une liste triée de N valeurs de manière efficace.
J'ai eu une confusion similaire à la vôtre quand je l'ai rencontré pour la première fois la STL tas de fonctions. Ma question était un peu différent. Je me suis demandé "Pourquoi n'est-ce pas la STL tas dans la même classe de structures de données comme std::vector?" J'ai pensé que cela devrait fonctionner comme ceci:
L'idée derrière la STL tas de fonctions, c'est qu'ils vous permettent de faire un tas de structure de données à partir de plusieurs sous-jacents différents conteneurs STL, y compris les std::vector. Cela peut être très utile si vous voulez passer dans le conteneur pour l'utiliser ailleurs dans vos programmes. C'est aussi un peu belle, parce que vous pouvez choisir le conteneur sous-jacent de votre tas, si vous choisissez d'utiliser une autre chose que std::vector. Tous vous avez vraiment besoin sont les suivantes:
Cela signifie que vous pouvez faire beaucoup de différents conteneurs dans un tas comparateur est aussi disponible en option dans la signature de la méthode, vous pouvez en savoir plus sur les différentes choses que vous pouvez essayer à la STL pages pour la fonction make_heap.
Liens:
std::priority_queue
, de sorte que vous n'avez pas besoin d'utiliserstd::make_heap
pour construire des tas.Vous êtes supposé utiliser
std::make_heap()
avecstd::push_heap()
etstd::pop_heap()
de maintenir un tas binaire sur le dessus d'un vecteur ou d'une matrice; les deux dernières fonctions de maintenir le tas invariant. Vous pouvez également utiliserstd::heap_sort()
pour trier un tel segment. S'il est vrai que vous pourriez utiliserstd::priority_queue
pour une file d'attente de priorité, il ne permet pas de recevoir à l'intérieur d'elle, peut-être que vous voulez faire. Aussi,std::make_heap()
etstd::heap_sort()
, ensemble, une façon très simple de faire heapsort en C++.std::make_heap
ne devrait jamais être utilisée dans la pratique. S'il est vrai que des tas sont utiles pour les files d'attente de priorité, cela n'explique pas pourquoi vous voulez maintenir manuellement la structure.std::priority_queue
a beaucoup plus utile de l'interface si vous avez besoin d'une file d'attente de priorité.Si vous utilisez
make_heap
et de ses frères et sœurs directement, vous devez vous assurer de les utiliser chaque fois que vous effectuez un changement pour le conteneur sous-jacent. Je les ai vu utilisé deux ou trois fois et à chaque fois ils ont été utilisés de manière incorrecte.J'ai utilisé uniquement le segment des opérations directement une fois moi-même, parce que j'avais besoin d'utiliser un vecteur comme une priorité de la file d'attente pour un certain temps et puis les trier. Vous aurez probablement jamais besoin
std::make_heap
.Si vous avez besoin d'une file d'attente de priorité avec la possibilité de changer des éléments, vous pouvez utiliser
std::set
. Vous pouvez obtenir le plus petit ou le plus grand élément avec*s.begin()
ou*s.rbegin()
, respectivement, et de mettre à jour un élément en supprimant l'ancienne valeur et de l'insertion de la nouvelle.std::priority_queue
est utile si jamais vous avez besoin est un tas, mais si vos besoins sont plus complexes que cela, de faire le gros du travail vous-même [qui les tas de fonctions très facile] peut être très bénéfique.make_heap
est utilisé pour faire un tas n'est pas une réponse utile, surtout depuis qu'il est rare que vous souhaitez utiliser si vous le que besoin d'un tas.std::make_heap
est utile lorsque vous ajoutez plusieurs choses à la fois dans votre tas et refaire une seule fois.Il y a essentiellement deux façons de construire une [binaire] tas: créer un vide tas et l'insertion de chaque élément un à un, ou de prendre une série de valeurs et heapify eux.
Chaque opération push sur un tas prend O(logn) de temps, donc si vous appuyez sur N points sur un segment de mémoire il faudra O(NlogN) de temps. Toutefois, afin de construire un tas binaire à partir d'un tableau de valeurs prend seulement O(N) fois.
Donc il est plus logique de l'insertion de chaque élément dans un tableau (ou autre contenant qui prend en charge des itérateurs à accès aléatoire) et ensuite appeler make_heap() sur le tableau qu'il fait pour maintenir le segment de la structure lors de l'insertion.
En plus de ce qui précède, la STL algorithme de tri est introsort, qui est un mélange de quicksort et heapsort (il bascule de quicksort à heapsort si l'ancien est en train de faire mal). make_heap crée un tas de structure, ce qui est nécessaire pour l'exécution de heapsort, ce qui est nécessaire pour introsort.
Ils sont utilisés pour construire et maintenir la Tas de structure de données