Informatiquemp2i9 min de lectureLecture libre

Structures de données : piles, files, arbres, tas, dictionnaires

Les structures de données du programme MP2I avec leurs invariants, leurs implémentations et leurs complexités : tableaux dynamiques, listes, piles, files, arbres binaires, ABR, tas, tables de hachage, union-find.

Une structure de données est le couple d'une organisation en mémoire et des opérations qu'elle rend efficaces. Le programme MP2I distingue le type abstrait (ce que l'on peut faire, spécifié par une signature et des propriétés) de son implémentation (comment c'est fait). Pour chaque structure, il faut connaître l'invariant qui la définit et le coût de ses opérations.

📋

Structures séquentielles

Tableau dynamique

Un tableau de capacité qui contient éléments. Quand il est plein, on alloue un tableau de capacité et on recopie. L'ajout en fin coûte O(n) au pire mais O(1) amorti : pour atteindre éléments, les recopies coûtent .

Piège : agrandir d'une constante (par exemple +10 cases) donne un coût amorti O(n) par ajout, car on recopie fois des tableaux de taille croissante.

Liste chaînée

Maillons alloués séparément, chacun pointant vers le suivant. Insertion et suppression en tête en O(1), accès au i-ème élément en O(i), recherche en O(n). En OCaml, les listes sont des listes chaînées immuables : x :: l partage l sans la copier.

Pile (LIFO) et file (FIFO)

StructureOpérationsImplémentationCoût
Pileempiler, dépiler, sommet, est_videliste chaînée (tête = sommet) ou tableau dynamiqueO(1)
Fileenfiler (arrière), défiler (avant)tableau circulaire (indices tete, taille modulo la capacité) ou deux pilesO(1), O(1) amorti avec deux piles
Usages : la pile sert au parenthésage, à l'évaluation postfixe, au parcours en profondeur et modélise la pile d'appels ; la file sert au parcours en largeur et aux tampons. Avec deux piles, on enfile sur la première et on défile depuis la seconde, que l'on remplit en renversant la première quand elle est vide : chaque élément est déplacé au plus une fois.
📋

Arbres binaires

Un arbre binaire est vide ou formé d'une racine et de deux sous-arbres (gauche, droit). En OCaml : type 'a arbre = Vide | Noeud of 'a arbre 'a 'a arbre.

  • Taille : nombre de nœuds. Hauteur : nombre de nœuds de la plus longue branche (arbre vide : 0). Certains ouvrages comptent les arêtes : préciser la convention.
  • Encadrement : , donc . Un arbre équilibré a une hauteur O(log n), un arbre filiforme une hauteur .
  • Nombre de feuilles = nombre de nœuds à deux fils + 1 (arbre non vide).

Parcours

ParcoursOrdreOutil
Préfixeracine, gauche, droiterécursion ou pile
Infixegauche, racine, droiterécursion
Postfixegauche, droite, racinerécursion
Largeurniveau par niveaufile
Tous visitent chaque nœud une fois : O(n).

Méthode : toute fonction sur un arbre s'écrit par induction structurelle : un cas Vide, un cas Noeud (g, x, d) qui combine les résultats sur g et d. Taille, hauteur, somme, appartenance, parcours suivent ce schéma.

Arbre binaire de recherche (ABR)

Invariant : pour tout nœud de clé , toutes les clés du sous-arbre gauche sont inférieures à et toutes celles du sous-arbre droit supérieures. Le parcours infixe produit les clés triées.

  • Recherche et insertion : descendre à gauche ou à droite selon la comparaison, O(h).
  • Suppression d'un nœud à deux fils : le remplacer par son successeur (minimum du sous-arbre droit) puis supprimer celui-ci, O(h).
  • vaut O(log n) si l'arbre est équilibré, mais si les clés arrivent triées. Les arbres AVL ou rouge-noir maintiennent (principe à connaître, pas les rotations).
📋

Tas binaire et file de priorité

Un tas max est un arbre binaire presque complet (niveaux pleins sauf le dernier, rempli de gauche à droite) où chaque nœud est supérieur ou égal à ses fils. Il se range dans un tableau sans pointeurs : racine en 0, fils de en et , père en .

  • Insertion : placer en fin, faire remonter en échangeant avec le père tant que nécessaire : O(log n).
  • Extraction du max : remplacer la racine par le dernier élément, le faire descendre vers le plus grand fils : O(log n).
  • Accès au max : O(1).

Le tas implémente la file de priorité (Dijkstra, Huffman, ordonnancement). Le tri par tas construit un tas puis extrait fois le maximum : O(n log n) dans tous les cas, en place.

Piège : un tas n'est pas un ABR : rien n'ordonne le fils gauche par rapport au fils droit. On ne peut pas y chercher efficacement une clé quelconque.

📋

Dictionnaires et tables de hachage

Un dictionnaire associe des clés uniques à des valeurs : ajouter, chercher, supprimer. Implémentations : liste d'association (O(n)), ABR équilibré (O(log n), clés ordonnées), table de hachage (O(1) en moyenne).

Une fonction de hachage envoie chaque clé sur un indice d'un tableau de alvéoles. Les collisions sont traitées par chaînage (liste par alvéole) ou adressage ouvert (sondage d'autres alvéoles). Avec une bonne répartition et un facteur de charge borné (on redimensionne au-delà), les opérations coûtent O(1) en moyenne ; le pire cas reste O(n). Une fonction de hachage doit être déterministe, rapide et cohérente avec l'égalité des clés.

En OCaml : Hashtbl.create, Hashtbl.add, Hashtbl.find (lève Not_found), Hashtbl.find_opt, Hashtbl.replace, Hashtbl.mem. En C, on écrit soi-même le tableau de listes chaînées.

📋

Union-find (structure de partition)

Maintient une partition en classes disjointes avec find x (représentant) et union x y. Représentation par forêt : chaque élément pointe vers un père, la racine est le représentant. Avec union par rang et compression de chemin, le coût amorti est quasi constant. Application phare : Kruskal (arbre couvrant minimal) et la détection de cycles.

📋

Tableau récapitulatif des coûts

StructureInsertionRechercheSuppressionRemarque
Tableau triéO(n)O(log n)O(n)dichotomie
Liste chaînéeO(1) en têteO(n)O(n)pas d'accès direct
Pile / fileO(1)—O(1)accès restreint
ABR équilibréO(log n)O(log n)O(log n)parcours trié
Tas binaireO(log n)—O(log n) pour le maxmax en O(1)
Table de hachageO(1) moyenO(1) moyenO(1) moyenO(n) pire cas
## Méthodes de concours
  1. 1Énoncer l'invariant de la structure avant d'écrire une opération (ordre du tas, propriété d'ABR, remplissage du tableau circulaire) et vérifier qu'il est conservé.
  2. 2Justifier chaque complexité par la hauteur (arbres, tas) ou par un argument amorti (tableau dynamique, deux piles).
  3. 3Choisir la structure selon les opérations demandées : extraction du min répétée → tas ; recherche par clé → table de hachage ; parcours trié → ABR ; dernier arrivé → pile.
  4. 4Savoir coder en OCaml les fonctions récursives sur les arbres et en C les listes chaînées avec malloc/free.
  5. 5Connaître les cas dégénérés : ABR filiforme, table de hachage avec collisions systématiques, pile d'appels trop profonde.

Révise cette fiche avec les flashcards et le quiz du chapitre

Crée un compte gratuit pour retrouver cette fiche dans l'application, mémoriser les points clés avec les flashcards et te tester avec le quiz.

Réviser cette fiche gratuitement

Gratuit, sans carte bancaire.

Toutes les fiches de Informatique