Structures de données : questions d’entraînement avec explications
Questions à choix multiples gratuites sur Structures de données, avec indices et explications, à trois niveaux : termes et faits clés, appliquer les notions, cas et analyse.
Une structure de données est une manière d’organiser les données en mémoire pour que certaines opérations soient rapides : trouver un élément, en ajouter un, en supprimer un.
Aucune structure n’est rapide pour tout. Choisir une structure, c’est choisir quelles opérations doivent être peu coûteuses. Leurs coûts s’écrivent en notation grand O, avec n le nombre d’éléments.
Les deux briques de base sont le tableau et la liste chaînée.
Un tableau range ses éléments dans un seul bloc de mémoire, les uns après les autres. L’ordinateur peut calculer où se trouve l’élément i, donc lire a[i] coûte O(1). Insérer au début oblige à décaler tous les éléments : O(n).
Une liste chaînée range chaque élément dans un nœud muni d’un pointeur vers le nœud suivant. Le dernier pointeur est nul. Insérer en tête (h) ne modifie qu’un seul pointeur : O(1). Mais pour atteindre l’élément i, il faut suivre i pointeurs : O(n).
Une liste doublement chaînée possède aussi un pointeur vers le nœud précédent, ce qui permet de la parcourir dans les deux sens.
Auto-évaluation Quelle opération est en O(1) pour un tableau mais en O(n) pour une liste simplement chaînée ?
Compter les éléments un par un
Insérer un nouvel élément au début
Lire l’élément d’indice i
Visiter chaque élément une fois
Réponse: Lire l’élément d’indice i. Un tableau calcule directement l’adresse de l’élément i. Une liste chaînée doit suivre i pointeurs depuis la tête. L’insertion au début est le cas inverse : peu coûteuse pour une liste, coûteuse pour un tableau.
2Piles et files
Une pile ressemble à une pile d’assiettes : on n’ajoute et on ne retire qu’au sommet. Le dernier élément entré est le premier sorti : LIFO.
push (empiler) place un élément au sommet, pop (dépiler) retire l’élément du sommet, peek lit le sommet sans le retirer. Toutes ces opérations sont en O(1).
Utilisations : la fonction d’annulation d’un éditeur, la pile d’appels d’un programme, la vérification de l’équilibre des parenthèses, le parcours en profondeur.
Une file ressemble à la queue devant une caisse : on se place à l’arrière et on part par l’avant. Le premier élément entré est le premier sorti : FIFO.
enqueue (enfiler) ajoute à l’arrière, dequeue (défiler) retire à l’avant. Les deux sont en O(1).
Utilisations : les travaux d’impression, les messages en attente de traitement, le parcours en largeur.
Une deque (file à double extrémité) permet d’ajouter et de retirer aux deux extrémités. Une file de priorité retire toujours en premier l’élément de plus haute priorité ; elle est généralement construite sous forme de tas.
Auto-évaluation Quelle structure de données convient le mieux au bouton « annuler » d’un éditeur de texte ?
Un graphe
Une file
Une pile
Une table de hachage
Réponse: Une pile. L’annulation doit défaire d’abord l’action la plus récente : dernier entré, premier sorti. Une file annulerait d’abord l’action la plus ancienne.
3Arbres, tas, tables de hachage et graphes
Un arbre possède un nœud supérieur, la racine. Tous les autres nœuds ont exactement un parent. Les nœuds sans enfant sont des feuilles. Un arbre de n nœuds a n − 1 arêtes.
Dans un arbre binaire, chaque nœud a au plus deux enfants. Un arbre binaire de recherche (ABR) ajoute une règle : les clés du sous-arbre gauche sont plus petites que le nœud, celles du sous-arbre droit sont plus grandes.
La recherche dans un ABR suit un seul chemin vers le bas, donc elle coûte O(hauteur). Un arbre équilibré (AVL, rouge-noir) maintient la hauteur proche de log₂ n. Des clés insérées dans l’ordre croissant forment une chaîne de hauteur n.
Un tas est un arbre binaire dans lequel chaque parent est plus petit que ses enfants (tas min) ou plus grand (tas max). Le minimum ou le maximum se trouve à la racine, et l’insertion et la suppression coûtent O(log n).
Une table de hachage stocke des paires clé–valeur. Une fonction de hachage transforme la clé en indice, donc l’insertion et la recherche sont en O(1) en moyenne. Deux clés ayant le même indice forment une collision, résolue par chaînage (une liste par case) ou par adressage ouvert (essayer une autre case).
Un graphe possède des sommets reliés par des arêtes, qui peuvent avoir une direction ou un poids. Il est stocké sous forme de matrice d’adjacence, avec une mémoire en O(V²), ou de listes d’adjacence, en O(V + E).
Auto-évaluation Les clés 50, 30, 70, 20 et 40 sont insérées dans cet ordre dans un arbre binaire de recherche vide. Quel est l’enfant gauche de 30 ?
20
40
70
Il n’a pas d’enfant gauche
Réponse: 20. 20 est plus petit que 50, il va donc à gauche vers 30. Il est aussi plus petit que 30, il va donc encore à gauche. 40 est plus grand que 30 et devient son enfant droit.
4La méthode pas à pas
Les questions décrivent souvent une tâche et demandent quelle structure convient, ou demandent à quoi ressemble une structure après quelques opérations.
Repérez l’opération qui doit être rapide : accès par position, par clé, l’élément le plus récent, le plus ancien, le plus petit, ou une plage.
Associez-la à une structure : indice → tableau, clé → table de hachage, le plus récent → pile, le plus ancien → file, le plus petit ou le plus grand → tas, ordre trié ou plages → arbre de recherche équilibré.
Vérifiez le coût, en notation grand O, des autres opérations dont la tâche a besoin.
Pour une question de simulation, effectuez les opérations une par une et notez l’état après chacune.
Comparez l’état final avec la règle de la structure : LIFO, FIFO, l’ordre de l’ABR ou l’ordre du tas.
5Un exemple détaillé
Suivez chaque étape. Essayez de deviner la suivante avant de l’ouvrir.
Exemple détaillé
Les clés 50, 30, 70, 20, 40 et 60 sont insérées dans cet ordre dans un arbre binaire de recherche vide. Quel est le parcours infixe, et combien de comparaisons faut-il pour chercher 60 ?
1
Insérer la racine
La première clé, 50, devient la racine.
2
Insérer 30 et 70
30 est plus petit que 50, il va donc à gauche. 70 est plus grand que 50, il va donc à droite.
3
Insérer 20, 40 et 60
20 : plus petit que 50, plus petit que 30, donc à gauche de 30. 40 : plus petit que 50, plus grand que 30, donc à droite de 30. 60 : plus grand que 50, plus petit que 70, donc à gauche de 70.
4
Parcourir en ordre infixe
Un parcours infixe visite le sous-arbre gauche, puis le nœud, puis le sous-arbre droit.
On obtient 20, 30, 40, 50, 60, 70 : les clés dans l’ordre trié, comme toujours pour un ABR.
5
Chercher 60
Comparer avec 50 : plus grand, aller à droite. Comparer avec 70 : plus petit, aller à gauche. Comparer avec 60 : trouvé.
La recherche nécessite 3 comparaisons, une par niveau.
Réponse
Ordre infixe : 20, 30, 40, 50, 60, 70. La recherche de 60 nécessite 3 comparaisons.
6Erreurs fréquentes
Confondre LIFO et FIFO. Une pile renvoie l’élément le plus récent, une file le plus ancien.
Croire qu’une liste chaînée donne un accès rapide par indice. Elle doit parcourir depuis la tête.
Supposer qu’un ABR est toujours en O(log n). Seul un arbre équilibré l’est ; des insertions triées donnent O(n).
Oublier les collisions dans une table de hachage. O(1) est la moyenne, pas le pire cas.
Confondre les parcours. Préfixe : le nœud d’abord. Infixe : le nœud au milieu. Postfixe : le nœud en dernier.
Utiliser une matrice d’adjacence pour un grand graphe peu dense. Elle gaspille une mémoire en O(V²).
Auto-évaluation Vous enfilez 1, 2 et 3 dans une file vide, dans cet ordre. Quel élément le premier défilement renvoie-t-il ?
1, 2 et 3 ensemble
1
2
3
Réponse: 1. Une file est premier entré, premier sorti, donc 1 sort en premier. 3 serait la réponse pour une pile (pop), qui renvoie l’élément le plus récent.
7À quoi ressemblent les questions d’examen
Facile : termes clés et faits. LIFO et FIFO, ce qu’est un nœud, une racine ou une feuille, la règle de l’ABR, ce que fait une fonction de hachage.
Moyen : application des notions. Quelle structure convient à une tâche, résultat de push et pop ou d’insertions dans un ABR, parcours d’arbres, table de hachage avec sondage linéaire, coûts en notation grand O.
Difficile : cas et analyse. Arbres équilibrés, tas dans des tableaux, B-arbres, tries, union-find, filtres de Bloom et conceptions telles qu’un cache LRU.
Pour un tas stocké dans un tableau à partir de l’indice 0, les enfants de l’indice i se trouvent en 2i + 1 et 2i + 2, et son parent en ⌊(i − 1) / 2⌋.
Quelle est la principale différence entre un tableau statique et un tableau dynamique ?
AUn tableau statique offre un accès par indice plus lent
BUn tableau dynamique peut grandir en passant à un bloc de mémoire plus grand
CUn tableau dynamique stocke ses éléments dans des nœuds chaînés, ce qui lui permet de grandir un élément à la fois
DUn tableau statique ne peut stocker que des nombres
Afficher les indices
Les listes Python et les ArrayList Java sont des exemples de l'un des deux.
Deux mauvaises réponses sont maintenant barrées. L'une des deux restantes est juste.
Afficher la réponse et l’explication
Pourquoi c'est la réponse
Un tableau statique a une taille fixe ; un tableau dynamique alloue un tableau plus grand et y copie les éléments lorsqu'il est plein.
Réponse
B · Un tableau dynamique peut grandir en passant à un bloc de mémoire plus grand
Exemple 2Moyen
Comment fonctionne l'extraction du minimum (extract-min) dans un tas binaire min ?
AOn retire le dernier élément du tableau
BOn déplace le dernier élément à la racine et on le fait descendre
COn retire la racine et on décale tous les éléments d'une case vers la gauche
DOn cherche le nouveau minimum parmi toutes les feuilles
Afficher les indices
Gardez l'arbre complet, puis corrigez l'ordre.
Deux mauvaises réponses sont maintenant barrées. L'une des deux restantes est juste.
Afficher la réponse et l’explication
Pourquoi c'est la réponse
Le dernier élément comble le trou à la racine et est échangé avec son plus petit enfant jusqu'à ce que la propriété de tas soit respectée, en O(log n).
Réponse
B · On déplace le dernier élément à la racine et on le fait descendre
Exemple 3Difficile
Sans union par rang ni compression de chemin, quel est le coût dans le pire cas d'une seule opération find dans une structure union-find à n éléments ?
AO(1)
BO(α(n))
CO(log n)
DO(n)
Afficher les indices
Les arbres peuvent dégénérer.
Deux mauvaises réponses sont maintenant barrées. L'une des deux restantes est juste.
Afficher la réponse et l’explication
Pourquoi c'est la réponse
Des unions naïves peuvent relier les arbres en une longue chaîne, donc find peut suivre n − 1 pointeurs vers le parent ; les deux heuristiques le rendent presque constant.
Réponse
D · O(n)
Questions et réponses
Structures de données : de quoi s’agit-il ?
Une structure de données est une manière d’organiser les données en mémoire pour que certaines opérations soient rapides : trouver un élément, en ajouter un, en supprimer un.
Aucune structure n’est rapide pour tout. Choisir une structure, c’est choisir quelles opérations doivent être peu coûteuses. Leurs coûts s’écrivent en notation grand O, avec n le nombre d’éléments.
Structures de données : comment l’apprendre étape par étape ?
Ce qu’est une structure de données
Piles et files
Arbres, tas, tables de hachage et graphes
La méthode pas à pas
Un exemple détaillé
Erreurs fréquentes
À quoi ressemblent les questions d’examen
Structures de données : que couvrent les exercices ?
Facile: termes et faits clés
Moyen: appliquer les notions
Difficile: cas et analyse
Chaque question propose quatre réponses, et une seule est juste. Bloqué ? Ouvrez d’abord un petit indice, et l’explication complète seulement si vous en avez besoin.
Comment fonctionne l’entraînement
Chaque question propose quatre réponses, et une seule est juste.
Bloqué ? Ouvrez d’abord un petit indice, et l’explication complète seulement si vous en avez besoin.
Votre progression, vos erreurs et vos exercices enregistrés sont conservés pour que vous puissiez réviser avant l’examen.