Structures de données et algorithmes

Tutoriel sur la structure des données de tas

Tutoriel sur la structure des données de tas
Les données sont un ensemble de valeurs. Les données peuvent être collectées et mises en ligne, ou dans une colonne, ou dans un tableau ou sous la forme d'un arbre. La structure des données n'est pas seulement le placement des données sous l'une de ces formes. En informatique, la structure de données est l'un de ces formats, plus la relation entre les valeurs, plus les opérations (fonctions) effectuées sur les valeurs. Vous devriez déjà avoir des connaissances de base sur la structure des données arborescentes avant de venir ici, car les concepts là-bas seront utilisés ici avec peu ou pas d'explication. Si vous n'avez pas ces connaissances, lisez le didacticiel intitulé Tutoriel sur la structure des données arborescentes pour les débutants, sur le lien https://linuxhint.com/tree_data_structure_tutorial_beginners/. Après cela, continuez à lire ce tutoriel.Une structure de données de tas est un arbre binaire complet ou presque complet, où l'enfant de chaque nœud est égal ou inférieur en valeur à la valeur de son parent. Alternativement, c'est un tel arbre où la valeur d'un parent est égale ou inférieure à la valeur de l'un de ses enfants. La valeur (donnée) d'un arbre est aussi appelée la clé.

Illustration des structures de données de tas

Il existe deux types de tas : un tas max et un tas min. Une structure de tas max est l'endroit où la valeur maximale est la racine et les valeurs diminuent au fur et à mesure que l'arbre descend ; tout parent est égal ou supérieur en valeur à l'un de ses enfants immédiats. Une structure min-heap est l'endroit où la valeur minimale est la racine, et les valeurs augmentent au fur et à mesure que l'arbre descend ; tout parent est égal ou inférieur en valeur à l'un de ses enfants immédiats. Dans les diagrammes suivants, le premier est un tas max et le second est un tas min :

Pour les deux tas, notez que pour une paire d'enfants, peu importe que celui de gauche soit la plus grande valeur. Une ligne dans un niveau de l'arbre, ne doit pas nécessairement être remplie du minimum au maximum, par la gauche ; il n'est pas aussi forcément rempli du maximum au minimum, de la gauche.

Représenter un tas dans un tableau

Pour que le logiciel utilise facilement un tas, le tas doit être représenté dans un tableau. Le tas max ci-dessus, représenté dans un tableau est :

89,  85,  87,  84,  82,  79, 73,  80,  81,    ,    ,  65,  69

Ceci est fait en commençant par la valeur racine comme première valeur du tableau. Les valeurs sont placées en continu en lisant l'arbre de gauche à droite, de haut en bas. Si un élément est absent, sa position dans le tableau est ignorée. Chaque nœud a deux enfants. Si un nœud est à l'index (position) n, son premier enfant dans le tableau est à l'index 2n+1, et son prochain enfant est à l'index 2n+2. 89 est à l'indice 0 ; son premier enfant, 85 est à l'index 2(0)+1=1 tandis que son deuxième enfant est à l'index 2(0)+2=2. 85 est à l'indice 1 ; son premier enfant, 84, est à l'index 2(1)+1=3 tandis que son deuxième enfant, 82 est à l'index 2(1)+2=4. 79 est à l'indice 5; son premier enfant, 65 ans est à l'indice 2(5)+1=11 tandis que son deuxième enfant est à l'indice 2(5)+2=12. Les formules sont appliquées au reste des éléments du tableau.

Un tel tableau, où la signification d'un élément et la relation entre les éléments, est impliquée par la position de l'élément, est appelé une structure de données implicite.

La structure de données implicite pour le min-heap ci-dessus est :

65,  68,  70,  73,  71,  83,  84,    ,    ,  79,  80,   ,    ,  85,  89

Le tas max ci-dessus est un arbre binaire complet mais pas un arbre binaire complet. C'est pourquoi certains emplacements (positions) sont vides dans le tableau. Pour un arbre binaire complet, aucun emplacement ne sera vide dans le tableau.

Maintenant, si le tas était un arbre presque complet, par exemple, si la valeur 82 manquait, alors le tableau serait :

89,  85,  87,  84,    ,  79, 73,  80,  81,    ,    ,  65,  69

Dans cette situation, trois emplacements sont vides. Cependant, les formules sont toujours applicables.

Opérations

Une structure de données est un format de données (e.g. un arbre), plus la relation entre les valeurs, plus les opérations (fonctions) effectuées sur les valeurs. Pour un tas, la relation qui traverse tout le tas est que le parent doit avoir une valeur égale ou supérieure à celle des enfants, pour un tas max ; et le parent doit avoir une valeur égale ou inférieure à celle des enfants, pour un min-heap. Cette relation est appelée la propriété de tas. Les opérations d'un tas sont regroupées sous les rubriques Création, De base, Interne et Inspection. Voici un résumé des opérations du tas :

Résumé des opérations de tas

Certaines opérations logicielles sont courantes avec les tas, comme suit :

Création d'un tas

create_heap : créer un tas signifie former un objet qui représente le tas. Dans le langage C, vous pouvez créer un tas avec le type d'objet struct. L'un des membres de la structure sera le tableau de tas. Le reste des membres sera des fonctions (opérations) pour le tas. Create_heap signifie créer un tas vide.

Heapify : le tableau de tas est un tableau partiellement trié (ordonné). Heapify signifie, fournir un tableau de tas à partir d'un tableau non trié - voir les détails ci-dessous.

Fusionner :  Cela signifie former un tas d'union à partir de deux tas différents - voir les détails ci-dessous. Les deux tas doivent tous les deux être max-heap ou les deux min-heap. Le nouveau tas est conforme à la propriété du tas, tandis que les tas d'origine sont conservés (non effacés).

Fusionner :  Cela signifie joindre deux tas du même type pour en former un nouveau, en conservant les doublons - voir les détails ci-dessous. Le nouveau tas est conforme à la propriété du tas, tandis que les tas d'origine sont détruits (effacés). La principale différence entre la fusion et la fusion est que pour la fusion, un arbre s'adapte en tant que sous-arbre à la racine de l'autre arbre, permettant des valeurs en double dans le nouvel arbre, tandis que pour la fusion, un nouvel arbre de tas est formé, supprimant les doublons. Il n'est pas nécessaire de maintenir les deux tas d'origine avec fusion.

Opérations de base sur le tas

find_max (find_min): localisez la valeur maximale dans le tableau max-heap et retournez une copie, ou localisez la valeur minimale dans le tableau min-heap et retournez une copie.

Insérer : ajoutez un nouvel élément au tableau de tas et réorganisez le tableau de sorte que la propriété de tas du diagramme soit conservée.

extract_max (extract_min): localisez la valeur maximale dans le tableau max-heap, supprimez-la et renvoyez-la ; ou localisez la valeur minimale dans le tableau min-heap, supprimez-la et renvoyez-la.

delete_max (delete_min) : localise le nœud racine d'un max-heap, qui est le premier élément du tableau max-heap, supprime-le sans nécessairement le retourner ; ou localiser le nœud racine d'un min-heap, qui est le premier élément du tableau min-heap, le supprimer sans nécessairement le retourner ;

Remplacer : localisez le nœud racine de l'un ou l'autre des tas, supprimez-le et remplacez-le par un nouveau. Peu importe que l'ancienne racine soit renvoyée.

Opérations de tas internes

augmentation_key (decrease_key) : augmentez la valeur de n'importe quel nœud pour un tas max et réorganisez afin que la propriété du tas soit conservée, ou diminuez la valeur de n'importe quel nœud pour un tas min et réorganisez afin que la propriété du tas soit conservée.

Supprimer : supprimez n'importe quel nœud, puis réorganisez-le, de sorte que la propriété de tas soit conservée pour le tas max ou un tas min.

shift_up : déplacer un nœud vers le haut dans un tas max ou min aussi longtemps que nécessaire, en le réorganisant pour maintenir la propriété du tas.

shift_down : déplacez un nœud vers le bas dans un tas max ou min aussi longtemps que nécessaire, en le réorganisant pour conserver la propriété du tas.

Inspection d'un tas

Taille: Cela renvoie le nombre de clés (valeurs) dans un tas ; il n'inclut pas les emplacements vides du tableau de tas. Un tas peut être représenté par du code, comme dans le diagramme, ou avec un tableau.

est vide: Cela renvoie un booléen vrai s'il n'y a pas de nœud dans un tas, ou un booléen faux si le tas a au moins un nœud.

Tamiser dans un tas

Il y a un tamisage vers le haut et un tamisage vers le bas :

Tamiser : Cela signifie échanger un nœud avec son parent. Si la propriété du tas n'est pas satisfaite, échangez le parent avec son propre parent. Continuez ainsi dans le chemin jusqu'à ce que la propriété du tas soit satisfaite. La procédure peut atteindre la racine.

Tamiser vers le bas : Cela signifie échanger un nœud de grande valeur avec le plus petit de ses deux enfants (ou un enfant pour un tas presque complet). Si la propriété de tas n'est pas satisfaite, permutez le nœud inférieur avec le nœud plus petit de ses deux enfants. Continuez ainsi dans le chemin jusqu'à ce que la propriété du tas soit satisfaite. La procédure pourrait atteindre une feuille.

Encombrant

Heapify signifie trier un tableau non trié pour que la propriété de tas soit satisfaite pour max-heap ou min-heap. Cela signifie qu'il peut y avoir des emplacements vides dans le nouveau tableau. L'algorithme de base pour entasser un tas max ou min est le suivant :

- si le nœud racine est plus extrême que l'un ou l'autre de ses nœuds enfants, alors échangez la racine avec le nœud enfant moins extrême.

- Répétez cette étape avec les nœuds enfants dans un schéma de parcours d'arborescence de pré-commande.

L'arbre final est un arbre de tas satisfaisant la propriété de tas. Un tas peut être représenté sous forme d'arborescence ou dans un tableau. Le tas résultant est un arbre partiellement trié, je.e. un tableau partiellement trié.

Détails de l'opération de tas

Cette section de l'article donne les détails des opérations de tas.

Création d'un tas Détails

create_heap

Voir au dessus!

s'entasser

Voir au dessus

fusionner

Si les tableaux de tas,

89,  85,  87,  84,  82,  79, 73,  80,  81,    ,    ,  65,  69

et

89,  85,  84,  73,  79,  80,  83,  65,  68,  70,  71

sont fusionnés, le résultat sans doublons peut être,

89,  85,  87,  84,  82,  83,  81,  80,  79,    ,    73,  68,  65,  69,  70,  71

Après un certain tamisage. Notez que dans le premier tableau, 82 n'a pas d'enfant. Dans le tableau résultant, il est à l'index 4 ; et ses emplacements à l'indice 2(4)+1=9 et 2(4)+2=10 sont vacants. Cela signifie qu'il n'a pas non plus d'enfants dans le nouveau diagramme d'arbre. Les deux tas d'origine ne doivent pas être supprimés car leurs informations ne sont pas vraiment dans le nouveau tas (nouveau tableau). L'algorithme de base pour fusionner des tas du même type est le suivant :

- Joindre un tableau au bas de l'autre tableau.

- Heapify élimine les doublons, en veillant à ce que les nœuds qui n'avaient pas d'enfants dans les tas d'origine n'aient toujours pas d'enfants dans le nouveau tas.

fusionner

L'algorithme pour fusionner deux tas du même type (soit deux max- ou deux min-) est le suivant :

- Comparez les deux nœuds racine.

- Faire de la racine la moins extrême et du reste de son arbre (sous-arbre), le deuxième enfant de la racine extrême.

- Tamiser l'enfant égaré de la racine de maintenant le sous-arbre extrême, vers le bas dans le sous-arbre extrême.

Le tas résultant est toujours conforme à la propriété du tas, tandis que les tas d'origine sont détruits (effacés). Les tas d'origine peuvent être détruits car toutes les informations qu'ils possédaient sont toujours dans le nouveau tas.

Opérations de base sur le tas

find_max (trouver_min)

Cela signifie localiser la valeur maximale dans le tableau max-heap et renvoyer une copie, ou localiser la valeur minimale dans le tableau min-heap et renvoyer une copie. Un tableau de tas par définition satisfait déjà la propriété de tas. Donc, retournez simplement une copie du premier élément du tableau.

insérer

Cela signifie ajouter un nouvel élément au tableau de tas et réorganiser le tableau de sorte que la propriété de tas du diagramme soit conservée (satisfaite). L'algorithme permettant de le faire pour les deux types de tas est le suivant :

- Supposons un arbre binaire complet. Cela signifie que le tableau doit être rempli à la fin avec des emplacements vides si nécessaire. Le nombre total de nœuds d'un tas complet est 1, ou 3 ou 7 ou 15 ou 31, etc.; continuez à doubler et à ajouter 1.

- Placez le nœud à l'emplacement vide le plus approprié en termes de magnitude, vers la fin du tas (vers la fin du tableau de tas). S'il n'y a pas d'emplacement vide, commencez une nouvelle ligne en bas à gauche.

- Tamisez si nécessaire, jusqu'à ce que la propriété du tas soit satisfaite.

extract_max (extract_min)

Localisez la valeur maximale dans le tableau max-heap, supprimez-la et renvoyez-la ; ou localisez la valeur minimale dans le tableau min-heap, supprimez-la et renvoyez-la. L'algorithme pour extract_max (extract_min) est le suivant :

- Supprimer le nœud racine.

- Prenez (enlevez) le nœud le plus à droite en bas (dernier nœud du tableau) et placez-le à la racine.

- Tamisez le cas échéant, jusqu'à ce que la propriété du tas soit satisfaite.

delete_max (delete_min)

Localisez le nœud racine d'un max-heap, qui est le premier élément du tableau max-heap, supprimez-le sans nécessairement le retourner ; ou localiser le nœud racine d'un min-heap, qui est le premier élément du tableau min-heap, le supprimer sans nécessairement le retourner. L'algorithme pour supprimer le nœud racine est le suivant :

- Supprimer le nœud racine.

- Prendre (supprimer) le nœud inférieur le plus à droite (dernier nœud du tableau) et le placer à la racine.

- Tamisez le cas échéant, jusqu'à ce que la propriété du tas soit satisfaite.

remplacer

Localisez le nœud racine de l'un ou l'autre des tas, supprimez-le et remplacez-le par le nouveau. Peu importe que l'ancienne racine soit renvoyée. Tamisez le cas échéant, jusqu'à ce que la propriété du tas soit satisfaite.

Opérations de tas internes

augmenter_clé (decrease_key)

Augmentez la valeur de n'importe quel nœud pour un tas max et réorganisez afin que la propriété du tas soit conservée, ou diminuez la valeur de n'importe quel nœud pour un tas min et réorganisez de sorte que la propriété du tas soit conservée. Tamisez vers le haut ou vers le bas selon le cas, jusqu'à ce que la propriété du tas soit satisfaite.

effacer

Supprimez le nœud d'intérêt, puis réorganisez-le, de sorte que la propriété de tas soit conservée pour le tas max ou un tas min. L'algorithme pour supprimer un nœud est le suivant :

- Supprimer le nœud d'intérêt.

- Prendre (supprimer) le nœud en bas à droite (dernier nœud du tableau) et le placer à l'index du nœud supprimé. Si le nœud supprimé se trouve à la dernière ligne, cela peut ne pas être nécessaire.

- Tamisez vers le haut ou vers le bas selon le cas, jusqu'à ce que la propriété du tas soit satisfaite.

décale vers le haut

Déplacer un nœud vers le haut dans un tas max ou min-heap aussi longtemps que nécessaire, en le réorganisant pour maintenir la propriété de tas - tamiser.

rétrograder

Déplacez un nœud vers le bas dans un tas max ou min aussi longtemps que nécessaire, en le réorganisant pour maintenir la propriété de tas - tamiser vers le bas.

Inspection d'un tas

Taille

Voir au dessus!

est vide

Voir au dessus!

Autres classes de tas

Le tas décrit dans cet article peut être considéré comme le tas principal (général). Il existe d'autres classes de tas. Cependant, les deux que vous devez connaître au-delà de cela sont le tas binaire et le tas d-aire.

tas binaire

Le tas binaire est similaire à ce tas principal, mais avec plus de contraintes. En particulier, le tas binaire doit être un arbre complet. Ne pas confondre entre un arbre complet et un arbre complet.

tas d-aire

Un tas binaire est un tas 2-aire. Un tas où chaque nœud a 3 enfants est un tas 3-aire. Un tas où chaque nœud a 4 enfants est un tas 4-aire, et ainsi de suite. Un tas d-aire a d'autres contraintes.

Conclusion

Un tas est un arbre binaire complet ou presque complet, qui satisfait la propriété du tas. La propriété heap a 2 alternatives : pour un max-heap, un parent doit être égal ou supérieur en valeur aux enfants immédiats ; pour un min-heap, un parent doit avoir une valeur égale ou inférieure à celle des enfants immédiats. Un tas peut être représenté comme un arbre ou dans un tableau. Lorsqu'il est représenté dans un tableau, le nœud racine est le premier nœud du tableau ; et si un nœud est à l'index n, son premier enfant dans le tableau est à l'index 2n+1 et son prochain enfant est à l'index 2n+2. Un tas a certaines opérations qui sont effectuées sur le tableau.

Chrys

Meilleurs jeux à jouer avec le suivi des mains
Oculus Quest a récemment introduit l'idée géniale du suivi manuel sans contrôleurs. Avec un nombre toujours croissant de jeux et d'activités qui exécu...
Comment afficher la superposition OSD dans les applications et jeux Linux en plein écran
Jouer à des jeux en plein écran ou utiliser des applications en mode plein écran sans distraction peut vous couper des informations système pertinente...
Top 5 des cartes de capture de jeu
Nous avons tous vu et aimé des gameplays en streaming sur YouTube. PewDiePie, Jakesepticye et Markiplier ne sont que quelques-uns des meilleurs joueur...