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.

Exercice gratuitFacile

Qu'est-ce que la propriété de tas max ?

Exercice suivant →

Ce que vous travaillez

  1. Faciletermes et faits clés
  2. Moyenappliquer les notions
  3. Difficilecas et analyse

Apprendre Structures de données depuis zéro

Avant cela : Algorithmes et complexité

1Ce qu’est une structure de données

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.

a7[0]3[1]9[2]4[3]7394∅h

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 ?
  1. Compter les éléments un par un
  2. Insérer un nouvel élément au début
  3. Lire l’élément d’indice i
  4. 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 ?
  1. Un graphe
  2. Une file
  3. Une pile
  4. 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 ?
  1. 20
  2. 40
  3. 70
  4. 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.

  1. 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.
  2. 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é.
  3. Vérifiez le coût, en notation grand O, des autres opérations dont la tâche a besoin.
  4. Pour une question de simulation, effectuez les opérations une par une et notez l’état après chacune.
  5. 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.

503070
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.

503070204060
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é.

503070204060

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. 1, 2 et 3 ensemble
  2. 1
  3. 2
  4. 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⌋.

Apprenez pas à pas dans l’applicationApprenez pas à pas dans l’application

Exemples de questions

Exemple 1Facile

Quelle est la principale différence entre un tableau statique et un tableau dynamique ?

  1. AUn tableau statique offre un accès par indice plus lent
  2. BUn tableau dynamique peut grandir en passant à un bloc de mémoire plus grand
  3. 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
  4. DUn tableau statique ne peut stocker que des nombres
Afficher les indices
  1. Les listes Python et les ArrayList Java sont des exemples de l'un des deux.
  2. 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 ?

  1. AOn retire le dernier élément du tableau
  2. BOn déplace le dernier élément à la racine et on le fait descendre
  3. COn retire la racine et on décale tous les éléments d'une case vers la gauche
  4. DOn cherche le nouveau minimum parmi toutes les feuilles
Afficher les indices
  1. Gardez l'arbre complet, puis corrigez l'ordre.
  2. 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 ?

  1. AO(1)
  2. BO(α(n))
  3. CO(log n)
  4. DO(n)
Afficher les indices
  1. Les arbres peuvent dégénérer.
  2. 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 ?
  1. Ce qu’est une structure de données
  2. Piles et files
  3. Arbres, tas, tables de hachage et graphes
  4. La méthode pas à pas
  5. Un exemple détaillé
  6. Erreurs fréquentes
  7. À 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.

Thèmes avant et après celui-ci

À voir d’abord

Cours qui contiennent ce thème

Autres thèmes en Informatique

Fiche d’exercices imprimable