NSI Terminale • Programme français, lycées de Montréal

Fiche de révision : piles, files, arbres et graphes en NSI Terminale

Les structures de données sont le chapitre où l'on connaît les définitions et où l'on perd pourtant des points sur des questions de déroulé : quel élément sort en premier, quelle hauteur pour cet arbre, dans quel ordre le parcours visite. Rien ne se démontre ici, tout se déroule, et un déroulé faux ne se rattrape jamais.

Cette fiche liste les neuf erreurs qui reviennent dans les copies, avec la phrase exacte à écrire à la place et ce que chacune coûte au barème.

Le fil du chapitre

Une structure de données est un CONTRAT sur l'ordre de sortie : remplacer une pile par une file ne casse aucun programme, cela en change silencieusement le résultat.

Ce chapitre fait partie de NSI en Terminale

Avant ce chapitre

Cette fiche suppose ces notions acquises. Si une méthode ci-dessous reste opaque, c'est presque toujours l'une d'elles qui manque, pas la fiche.

Remonter plus loin : la chaîne complète (4 chapitres) ↓

Le chemin de remédiation, du plus ancien au plus proche. Un élève qui reprend ce chapitre de zéro le reprend dans cet ordre.

  1. 1Algorithmique et PythonSeconde, Mathématiques
  2. 2Python : types, contrôle, fonctions et tableauxPremière
  3. 3Algorithmique : preuve, terminaison et coûtPremière
  4. 4Algorithmique : recherche, tris, récursivité et complexité

L'essentiel

Pile et file : deux contrats, un seul mot différent

  • Pile : dernier entré, premier sorti. On empile et on dépile du même côté, le sommet.
  • File : premier entré, premier sorti. On enfile d'un côté, on défile de l'autre.
  • Les deux structures offrent les mêmes opérations : ajouter, retirer, tester si c'est vide. Seul l'ORDRE de sortie les distingue.
  • Un algorithme écrit avec une pile devient un autre algorithme si on met une file à la place : le parcours en profondeur devient un parcours en largeur.
pile : LIFOentrée et sortie123on sort 3, 2, 1file : FIFO123entréesortieon sort 1, 2, 3
Les trois mêmes valeurs entrées dans le même ordre, et deux sorties opposées : la pile rend 3, 2, 1, la file rend 1, 2, 3.

Dans une question de déroulé, dessiner l'état de la structure après chaque opération vaut toujours mieux que de suivre de tête : c'est aussi ce que le barème demande.

Les coûts qui décident du choix

  • Liste chaînée : insertion en tête à coût constant, accès au kk-ième élément proportionnel à kk.
  • Tableau : accès au kk-ième à coût constant, insertion en tête proportionnelle à la longueur.
  • File construite avec deux piles : chaque élément subit au plus quatre opérations dans sa vie, d'où un coût AMORTI constant, même si une opération isolée peut coûter cher.
  • Le coût amorti se dit sur une SUITE d'opérations, jamais sur une opération prise seule.

Arbres : les définitions qui se confondent

  • Taille : nombre de noeuds. Hauteur : nombre d'ARÊTES du plus long chemin depuis la racine.
  • Arbre vide : taille 00, hauteur 1-1. Arbre réduit à sa racine : taille 11, hauteur 00.
  • Un arbre binaire de taille nn a une hauteur comprise entre log2n\lfloor \log_{2} n \rfloor et n1n - 1 : équilibré d'un côté, en peigne de l'autre.
  • Arbre complet de hauteur hh : taille 2h+112^{h+1} - 1. Pour h=2h = 2, sept noeuds.

Écrire la convention retenue en tête de copie, « hauteur comptée en arêtes », évite de perdre un point quand le sujet compte en niveaux.

Les quatre parcours, et la structure qu'ils exigent

  • Préfixe, infixe, suffixe : mêmes appels récursifs, seule la POSITION du traitement de la racine change.
  • Le parcours infixe d'un arbre binaire de RECHERCHE donne les valeurs triées. Sur un arbre binaire quelconque, il ne donne rien de particulier.
  • Le parcours en largeur n'est pas récursif : il exige une FILE, et une file explicite dans le code.
  • Un parcours en profondeur itératif s'écrit avec une PILE : c'est le seul changement par rapport au parcours en largeur.

Graphes : deux représentations, deux coûts

  • Matrice d'adjacence : n2n^{2} cases, quelle que soit la densité. Test d'arête à coût constant.
  • Listes d'adjacence : n+2mn + 2m entrées pour un graphe non orienté. Parcours des voisins à coût proportionnel au degré.
  • Sur un graphe creux, l'écart est énorme : n=1000n = 1\,000 et m=3000m = 3\,000 donnent un million de cases contre sept mille entrées.
  • Coût d'un parcours complet : O(n+m)O(n + m) avec des listes, O(n2)O(n^{2}) avec une matrice.

Les pièges qui coûtent des points

Les erreurs ci-dessous sont celles que je corrige le plus souvent en séance. Chacune coûte des points sur une copie, même quand le raisonnement est juste.

1. Inverser les opérandes en notation postfixée

2 points, et l'erreur ne se voit jamais sur une addition

Ce qu'il ne faut pas écrire

« Je dépile 3 puis 5, donc j'écris 35=23 - 5 = -2. »

Ce qu'il faut écrire

« Le PREMIER dépilé est le SECOND opérande : je dépile 3 puis 5, et je calcule 53=25 - 3 = 2. »

premier dépilé MOINS second531er dépilé : 32e dépilé : 53 - 5 = -2, fauxsecond dépilé MOINS premier531er dépilé : 32e dépilé : 55 - 3 = 2, juste
La même pile, deux conventions de lecture : seule celle de droite, où le premier dépilé devient le second opérande, donne le résultat attendu.

Pourquoi : Une pile rend les éléments dans l'ordre inverse de leur arrivée, donc le sommet est l'opérande de droite. L'erreur reste invisible sur ++ et ×\times, puis fausse tout dès la première soustraction ou division.

2. Confondre la taille et la hauteur d'un arbre

1 point, et toute question de complexité fondée sur la hauteur

Ce qu'il ne faut pas écrire

« Cet arbre a 5 noeuds, donc sa hauteur est 5. »

Ce qu'il faut écrire

« La taille est 5 et la hauteur est le nombre d'ARÊTES du plus long chemin : elle vaut 2 pour cet arbre équilibré, 4 s'il est en peigne. »

taille 5, hauteur 2taille 5, hauteur 4
Deux arbres de même taille et de hauteurs différentes : le nombre de noeuds ne dit rien de la hauteur, seule la forme la décide.

Pourquoi : Taille et hauteur ne sont liées que par un ENCADREMENT : entre log2n\lfloor \log_{2} n \rfloor et n1n-1. Deux arbres de même taille peuvent avoir des hauteurs très différentes, et c'est justement ce que mesure l'équilibre.

3. Oublier que l'arbre vide a une hauteur de moins un

1 point, et la fonction récursive de hauteur renvoie un résultat décalé de 1

Ce qu'il ne faut pas écrire

« Un arbre vide a une hauteur de 0, comme un arbre réduit à sa racine. »

Ce qu'il faut écrire

« L'arbre vide a une hauteur de 1-1 et une taille de 00 ; l'arbre réduit à sa racine a une hauteur de 00 et une taille de 11. »

Pourquoi : C'est la convention qui rend juste la formule h=1+max(hg,hd)h = 1 + \max(h_{g}, h_{d}) : sans le 1-1, une feuille se verrait attribuer une hauteur de 1.

4. Croire qu'un arbre binaire de recherche est équilibré

2 points sur la question de complexité, celle qui est vraiment notée

Ce qu'il ne faut pas écrire

« Une recherche dans un arbre binaire de recherche coûte log2n\log_{2} n. »

Ce qu'il faut écrire

« Elle coûte la HAUTEUR, qui vaut log2n\log_{2} n seulement si l'arbre est équilibré. Insérées dans l'ordre croissant, nn valeurs donnent un peigne de hauteur n1n-1. »

Pourquoi : La structure ne s'équilibre pas toute seule : l'ordre d'insertion décide de la forme. C'est pour cela qu'existent les arbres équilibrés, hors programme mais souvent évoqués en fin de sujet.

5. Croire que le parcours infixe trie n'importe quel arbre

1 point, et la justification demandée à la question suivante

Ce qu'il ne faut pas écrire

« Le parcours infixe donne toujours les valeurs dans l'ordre croissant. »

Ce qu'il faut écrire

« Seulement dans un arbre binaire de RECHERCHE, où tout le sous-arbre gauche est inférieur à la racine. Sur un arbre quelconque, l'infixe ne trie rien. »

Pourquoi : C'est la propriété de l'arbre qui fait le tri, pas le parcours. L'infixe se contente de visiter gauche, racine, droite : c'est l'invariant de l'arbre de recherche qui rend cette suite croissante.

6. Utiliser une pile pour un parcours en largeur

toute la question du plus court chemin, souvent 4 points

Ce qu'il ne faut pas écrire

« Je mets les voisins dans une pile et je les traite un par un : c'est le parcours en largeur. »

Ce qu'il faut écrire

« Le parcours en largeur exige une FILE. Avec une pile, on obtient un parcours en profondeur, et le chemin trouvé n'est plus le plus court. »

Pourquoi : La file garantit qu'on traite tous les sommets à distance dd avant ceux à distance d+1d+1 : c'est exactement ce qui rend le premier chemin trouvé minimal. Une pile détruit cette garantie.

7. Marquer un sommet après l'avoir sorti au lieu de l'ajouter

1 point, et un déroulé qui ne correspond plus au corrigé

Ce qu'il ne faut pas écrire

« Je défile un sommet, je le marque, puis j'ajoute ses voisins non marqués. »

Ce qu'il faut écrire

« Je marque un sommet au moment où je l'AJOUTE : sinon un même sommet est ajouté plusieurs fois avant d'être traité, et le parcours enfle. »

Pourquoi : Entre l'ajout et le traitement, un sommet reste non marqué et peut être atteint par un autre voisin. Marquer à l'ajout est ce qui borne le nombre d'entrées dans la file par le nombre de sommets.

8. Croire l'accès au k-ième élément gratuit dans une liste chaînée

2 points sur la question de comparaison des structures

Ce qu'il ne faut pas écrire

« Une liste chaînée est plus efficace qu'un tableau, donc lire le millième élément y est rapide. »

Ce qu'il faut écrire

« Il faut suivre mille maillons : l'accès au kk-ième coûte kk. La liste chaînée est plus efficace pour INSÉRER en tête, pas pour accéder. »

Pourquoi : Aucune structure n'est meilleure en tout : chaque choix échange un coût contre un autre. Le tableau paie l'insertion, la liste chaînée paie l'accès.

9. Choisir une matrice d'adjacence pour un graphe creux

2 points sur la question de représentation, celle qui demande de justifier

Ce qu'il ne faut pas écrire

« La matrice est plus simple, et de toute façon un graphe de mille sommets tient en mémoire. »

Ce qu'il faut écrire

« Avec n=1000n = 1\,000 et m=3000m = 3\,000, la matrice occupe 10000001\,000\,000 de cases contre 70007\,000 entrées pour les listes, et le parcours passe de O(n2)O(n^{2}) à O(n+m)O(n + m). »

Pourquoi : La matrice ne dépend que du nombre de sommets : elle réserve la place de toutes les arêtes possibles. Sur un graphe creux, la quasi-totalité de cette place est occupée par des zéros.

10. Juger la file à deux piles inefficace sur une opération isolée

2 points sur la question de coût amorti, où la rédaction compte autant que le résultat

Ce qu'il ne faut pas écrire

« Défiler oblige parfois à transvaser toute la pile, donc cette file coûte nn par opération. »

Ce qu'il faut écrire

« Chaque élément est empilé et dépilé au plus deux fois dans sa vie, soit quatre opérations : le coût AMORTI par opération est constant. »

Pourquoi : Le coût amorti se raisonne sur la vie d'un élément, pas sur le pire cas d'une opération. Un transvasement coûteux ne se produit qu'après autant d'opérations bon marché.

Quelle méthode choisir

Quelle structure, selon le mot de l'énoncé

  • Si « le dernier arrivé doit repartir en premier » pile

    Exemple : vérifier un parenthésage, annuler une action

  • Si « dans l'ordre d'arrivée », « le plus court chemin » file

    Exemple : parcours en largeur, file d'attente

  • Si « insérer souvent en tête », « la taille varie beaucoup » liste chaînée

    Exemple : un journal d'événements

  • Si « accéder au kk-ième », « parcourir par indice » tableau

    Exemple : un relevé indexé par le numéro de capteur

  • Si « retrouver vite par une clé » dictionnaire, ou arbre binaire de recherche si l'ordre compte

    Exemple : l'annuaire d'un réseau

    l'arbre garde l'ordre, le dictionnaire est plus rapide

Si l'énoncé impose le plus court chemin, la réponse est la file, sans discussion : c'est la seule structure qui donne cette garantie.

Quel parcours, selon ce qu'on cherche

  • Si « les valeurs dans l'ordre croissant » parcours infixe, et seulement dans un arbre de recherche

    Exemple : lister un annuaire trié

  • Si « recopier ou sérialiser l'arbre » parcours préfixe

    Exemple : écrire l'arbre dans un fichier

    la racine d'abord permet de reconstruire en lisant

  • Si « évaluer une expression », « libérer la mémoire » parcours suffixe

    Exemple : calculer la valeur d'un arbre d'expression

  • Si « le plus court chemin », « le nombre minimal d'étapes » parcours en largeur, avec une FILE

    Exemple : sortir d'un labyrinthe

  • Si « existe-t-il un chemin », « toutes les configurations » parcours en profondeur, avec une pile ou par récursivité

    Exemple : tester la connexité

Si aucune branche ne s'applique, dérouler le parcours en largeur : c'est celui qui répond au plus grand nombre de questions de sujet.

La rédaction attendue

Le correcteur coche des étapes. Les voici dans l'ordre, avec la phrase de conclusion qu'il attend mot pour mot.

Dérouler un parcours de graphe

Quand l'utiliser : L'énoncé demande l'ordre de visite, ou le plus court chemin dans un graphe donné.

  1. 1 Annoncer la structure et la convention : « parcours en largeur, file, voisins pris dans l'ordre alphabétique ».
  2. 2 Dresser un tableau à trois colonnes : sommet traité, contenu de la file après traitement, sommets marqués.
  3. 3 Une ligne par sommet DÉFILÉ, jamais une ligne par ajout : c'est ce que le corrigé attend.
  4. 4 Marquer chaque sommet au moment où il entre dans la file, et l'écrire.
  5. 5 Conclure par l'ordre de visite complet, et par la distance demandée si le sujet la réclame.

Phrase de conclusion

« Le parcours en largeur depuis A visite A, B, C, D, E, F. Le sommet F est atteint à la distance 3, et ce chemin est minimal car le parcours en largeur traite tous les sommets à distance dd avant ceux à distance d+1d+1. »

Le piège : Ne pas préciser l'ordre dans lequel les voisins sont pris : le déroulé devient alors indéfendable dès qu'il diffère du corrigé.

Barème : 1 point pour la structure annoncée, 2 points pour le tableau, 1 point pour la justification de minimalité.

Justifier un coût amorti

Quand l'utiliser : L'énoncé demande le coût d'une suite d'opérations, ou parle explicitement de coût amorti.

  1. 1 Prendre un élément quelconque et suivre sa vie entière dans la structure.
  2. 2 Compter le nombre d'opérations élémentaires qu'il subit, du premier ajout au dernier retrait.
  3. 3 Multiplier par le nombre d'éléments pour obtenir le coût total de la suite.
  4. 4 Diviser par le nombre d'opérations pour conclure sur le coût moyen par opération.

Phrase de conclusion

« Chaque élément est empilé puis dépilé au plus deux fois, soit quatre opérations élémentaires. Une suite de nn ajouts et nn retraits coûte donc au plus 4n4n opérations, soit un coût amorti constant par opération, bien qu'un retrait isolé puisse en coûter nn. »

Le piège : Raisonner sur le pire cas d'une opération isolée : c'est vrai et hors sujet, la question porte sur la suite.

Barème : 2 points pour le suivi d'un élément, 1 point pour le total, 1 point pour la conclusion.

Vérifier avant de rendre

Cinq minutes de vérification récupèrent plus de points qu'un exercice de plus commencé à la hâte.

L'exercice type décortiqué

La sortie du labyrinthe : plus court chemin par parcours en largeur

Un labyrinthe est donné par un graphe de 12 cases et 16 passages. On cherche le nombre minimal de déplacements pour aller de la case de départ à la sortie.

Écrire l'algorithme, justifier qu'il donne bien le minimum, et donner son coût.

Étape 1

Structure : une FILE, initialisée avec la case de départ, qui est marquée immédiatement.

Pourquoi

Le choix de la file est la réponse à la question de minimalité : c'est lui qu'il faut annoncer en premier, avant même d'écrire une ligne d'algorithme.

Étape 2

Un dictionnaire distance associe 0 à la case de départ, et rien aux autres.

Pourquoi

Le dictionnaire sert à la fois de marquage et de résultat : un sommet marqué est un sommet dont la distance est déjà connue, ce qui évite d'entretenir deux structures.

Étape 3

Tant que la file n'est pas vide : défiler une case, puis pour chaque voisin NON marqué, lui donner la distance de la case plus un, le marquer, et l'enfiler.

Pourquoi

Marquer AVANT d'enfiler est ce qui garantit qu'aucune case n'entre deux fois. C'est la ligne que les copies inversent le plus souvent.

Étape 4

Arrêt dès que la sortie est défilée, ou à file vide si elle est inatteignable.

Pourquoi

Le cas inatteignable est une demi-question à lui seul : une réponse qui ne le traite pas perd le point de complétude.

Étape 5

Justification : le parcours traite tous les sommets à distance dd avant tout sommet à distance d+1d+1, donc la première atteinte d'une case est la plus courte.

Pourquoi

C'est la phrase qui vaut les points de raisonnement. Sans elle, l'algorithme peut être juste et la question reste sans réponse.

Étape 6

Coût : chaque case entre au plus une fois dans la file et chaque passage est examiné deux fois, soit O(n+m)O(n + m), ici 12+32=4412 + 32 = 44 opérations.

Pourquoi

Le chiffrage sur les données de l'énoncé transforme une formule apprise en réponse défendable, et se compare aux 144144 cases d'une matrice d'adjacence.

Conclusion rédigée

« Le parcours en largeur depuis la case de départ donne la distance minimale à la sortie, car il traite les cases par distance croissante. Son coût est O(n+m)O(n + m), soit de l'ordre de 44 opérations pour 12 cases et 16 passages, contre 144 avec une matrice d'adjacence. »

L'erreur classique sur cet exercice : Écrire le même algorithme avec une pile : il trouve un chemin, mais rien ne garantit qu'il soit le plus court, et la question de minimalité devient sans réponse.

À savoir par cœur

  • Pile : dernier entré, premier sorti. File : premier entré, premier sorti. Rien d'autre ne les distingue.
  • Notation postfixée : le PREMIER dépilé est le SECOND opérande.
  • Taille = nombre de noeuds. Hauteur = nombre d'ARÊTES du plus long chemin. Arbre vide : hauteur 1-1.
  • Encadrement de la hauteur : entre log2n\lfloor \log_{2} n \rfloor et n1n - 1.
  • Arbre complet de hauteur hh : taille 2h+112^{h+1} - 1.
  • L'infixe trie les valeurs d'un arbre de RECHERCHE, et de lui seul.
  • Parcours en largeur : FILE, et plus court chemin garanti. En profondeur : pile ou récursivité.
  • Marquer un sommet à l'AJOUT, jamais au traitement.
  • Matrice : n2n^{2} cases. Listes : n+2mn + 2m entrées. Parcours : O(n2)O(n^{2}) contre O(n+m)O(n + m).

Questions fréquentes

Quelle est la différence entre une pile et une file en NSI ?

Seul l'ordre de sortie change. Une pile rend d'abord le dernier élément entré, une file rend d'abord le premier. Les deux offrent les mêmes opérations, ajouter, retirer et tester si c'est vide, si bien qu'un algorithme reste syntaxiquement correct quand on remplace l'une par l'autre : c'est son résultat qui change, sans aucun message d'erreur.

Comment calculer la hauteur d'un arbre binaire ?

On compte les arêtes du plus long chemin partant de la racine, pas les noeuds. L'arbre vide a pour hauteur moins un, un arbre réduit à sa racine a pour hauteur zéro, et la formule récursive est un plus le maximum des hauteurs des deux sous-arbres. Cette convention est celle qui rend la formule juste pour une feuille.

Pourquoi le parcours en largeur donne-t-il le plus court chemin ?

Parce que la file impose de traiter tous les sommets situés à distance d avant le moindre sommet à distance d plus un. La première fois qu'un sommet est atteint, c'est donc par un chemin de longueur minimale. Avec une pile, cette garantie disparaît : on trouve un chemin, mais rien ne dit qu'il soit le plus court.

Un arbre binaire de recherche garantit-il une recherche en log n ?

Non. La recherche coûte la hauteur de l'arbre, et cette hauteur dépend de l'ordre d'insertion. Des valeurs insérées dans l'ordre croissant produisent un peigne de hauteur n moins un, où la recherche est aussi lente que dans une liste. Le coût logarithmique n'est atteint que si l'arbre reste équilibré.

Faut-il choisir une matrice ou des listes d'adjacence ?

On compare le nombre de sommets au nombre d'arêtes. La matrice occupe le carré du nombre de sommets, quelle que soit la densité, et permet un test d'arête immédiat. Les listes occupent le nombre de sommets plus deux fois le nombre d'arêtes, et rendent le parcours proportionnel à cette somme. Sur un graphe creux, les listes l'emportent largement.

Passer à la pratique

Exercices corrigés : Structures de données : piles, files, arbres et graphes

Une méthode se prouve sur une copie, pas sur une fiche. La série du même chapitre reprend chacun de ces pièges dans un exercice, avec le corrigé rédigé étape par étape.

  • 15 exercices corrigés
  • 150 points
  • 255 minutes
Faire les exercices
Fiche précédente Algorithmique : recherche, tris, récursivité et complexité Fiche suivante Bases de données relationnelles et langage SQL

Ce chapitre resservira dans

Les chapitres qui le réclament en amont, plus tard dans l'année ou dans les années suivantes.

Voir aussi

Vous cherchez un tuteur en NSI à Montréal ?

Contactez-moi pour une première séance. On reprend les points de méthode qui font perdre des points en évaluation, puis on les met à l'épreuve sur des exercices du niveau réel de l'examen.

Site par Studio Squalli