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)
| Structure | Opérations | Implémentation | Coût |
|---|---|---|---|
| Pile | empiler, dépiler, sommet, est_vide | liste chaînée (tête = sommet) ou tableau dynamique | O(1) |
| File | enfiler (arrière), défiler (avant) | tableau circulaire (indices tete, taille modulo la capacité) ou deux piles | O(1), O(1) amorti avec deux piles |
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
| Parcours | Ordre | Outil |
|---|---|---|
| Préfixe | racine, gauche, droite | récursion ou pile |
| Infixe | gauche, racine, droite | récursion |
| Postfixe | gauche, droite, racine | récursion |
| Largeur | niveau par niveau | file |
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
| Structure | Insertion | Recherche | Suppression | Remarque |
|---|---|---|---|---|
| Tableau trié | O(n) | O(log n) | O(n) | dichotomie |
| Liste chaînée | O(1) en tête | O(n) | O(n) | pas d'accès direct |
| Pile / file | O(1) | — | O(1) | accès restreint |
| ABR équilibré | O(log n) | O(log n) | O(log n) | parcours trié |
| Tas binaire | O(log n) | — | O(log n) pour le max | max en O(1) |
| Table de hachage | O(1) moyen | O(1) moyen | O(1) moyen | O(n) pire cas |
- 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é.
- 2Justifier chaque complexité par la hauteur (arbres, tas) ou par un argument amorti (tableau dynamique, deux piles).
- 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.
- 4Savoir coder en OCaml les fonctions récursives sur les arbres et en C les listes chaînées avec
malloc/free. - 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 gratuitementGratuit, sans carte bancaire.