web-dev-qa-db-fra.com

Quand voudrais-je utiliser un tas?

Outre la réponse évidente d'une file d'attente prioritaire, quand un tas serait-il utile dans mes aventures de programmation?

80
Mithrax

Utilisez-le chaque fois que vous avez besoin d'un accès rapide à l'élément le plus grand (ou le plus petit), car cet élément sera toujours le premier élément du tableau ou à la racine de l'arborescence.

Cependant, le reste de la matrice n'est pas trié. Ainsi, l'accès instantané n'est possible qu'au plus grand (le plus petit) élément. Les insertions sont rapides, c'est donc un bon moyen de gérer les événements ou les données entrants et d'avoir toujours accès au plus tôt/au plus grand.

Utile pour les files d'attente prioritaires, les planificateurs (où l'élément le plus ancien est souhaité), etc ...

Un segment de mémoire est un arbre dans lequel la valeur d'un nœud parent est supérieure à celle de l'un de ses nœuds descendants.

Si vous pensez à un tas comme à un arbre binaire stocké dans un ordre linéaire par profondeur, avec le nœud racine en premier (puis les enfants de ce nœud ensuite, puis les enfants de ces nœuds ensuite); alors les enfants d'un nœud à l'indice N sont à 2N + 1 et 2N + 2. Cette propriété permet un accès rapide par index. Et comme les tas sont manipulés en échangeant des nœuds, cela permet un tri sur place.

110
Joe Koberg

Les tas sont des structures destinées à permettre un accès rapide au min ou au max.

Mais pourquoi voudriez-vous cela? Vous pouvez simplement vérifier chaque entrée sur ajouter pour voir si c'est la plus petite ou la plus grande. De cette façon, vous avez toujours le plus petit ou le plus grand en temps constant O(1).

La réponse est parce que les tas vous permettent de tirer le plus petit ou le plus grand et de connaître rapidement le NEXT le plus petit ou le plus grand. C'est pourquoi cela s'appelle une file d'attente prioritaire.

Exemple du monde réel (mais pas très juste, cependant):

Supposons que vous ayez un hôpital dans lequel les patients sont traités en fonction de leur âge. Les plus âgés sont toujours les premiers à assister, peu importe quand il/elle est entré dans la file d'attente.

Vous ne pouvez pas simplement garder une trace du plus ancien car si vous le retirez, vous ne connaissez pas le plus ancien suivant. Afin de résoudre ce problème d'hôpital, vous implémentez un tas max. Ce tas est, par définition, partiellement ordonné. Cela signifie que vous ne pouvez pas trier les patients selon leur âge, mais vous savez que les plus anciens sont toujours en haut, vous pouvez donc retirer un patient en temps constant O(1) et rééquilibrer le tas en temps de journal O(log N).

Exemple plus sophistiqué:

Supposons que vous ayez une séquence d'entiers et que vous souhaitiez garder une trace de median. La médiane est le nombre qui se trouve au milieu d'un tableau ordonné.

Exemple:

[1, 2, 5, 7, 23, 27, 31]

Dans le cas ci-dessus, 7 est la médiane car le tableau contenant les plus petits nombres [1, 2, 5] est de la même taille que celui contenant les plus grands nombres [23, 27, 31]. Normalement, si le tableau a un nombre pair d'éléments, la médiane est la moyenne arithmétique des 2 éléments du milieu, par exemple (5 + 7)/2.

Maintenant, comment gardez-vous une trace de la médiane? En ayant 2 tas, un tas min contenant les nombres plus petits que la médiane actuelle et un tas max contenant les nombres plus grands que la médiane actuelle. Maintenant, si ces tas sont toujours équilibrés, les 2 tas contiendront le même nombre d'éléments ou l'un aura 1 élément de plus que l'autre, le plus.

Lorsque vous ajoutez un nouvel élément à la séquence, si le nombre est inférieur à la médiane actuelle, vous l'ajoutez au segment min, sinon, vous l'ajoutez au segment max. Maintenant, si les tas sont déséquilibrés (un tas a plus d'un élément de plus que l'autre), vous tirez un élément du plus grand tas et ajoutez au plus petit. Maintenant, ils sont équilibrés.

41
André Pena

La caractéristique d'un tas est qu'il s'agit d'une structure qui maintient des données semi-ordonnées; ainsi, c'est un bon compromis entre le coût du maintien d'un ordre complet et le coût de la recherche par chaos aléatoire. Cette caractéristique est utilisée sur de nombreux algorithmes, tels que la sélection, la commande ou la classification.

Une autre caractéristique utile d'un tas est qu'il peut être créé sur place à partir d'un tableau!

12
AticusFinch

Aussi bon pour les algorithmes de sélection (trouver le min ou max)

3
Dan

à tout moment lorsque vous triez une liste temporaire, vous devez envisager des tas.

3
Javier

Vous pouvez utiliser un tas min ou un tas max lorsque vous souhaitez accéder respectivement aux éléments les plus petits et les plus grands.

0
QuadBiker