QCM : Introduction aux structures de données et algorithmes — 24 questions

Questions et réponses du QCM

1. Quelle description correspond le mieux à une structure de données ?

Un programme qui exécute automatiquement des tests d’exemples
Une façon d’organiser et de stocker des informations avec des opérations de manipulation
Une suite d’instructions qui gère une erreur d’exécution
Une méthode de parcours des graphes par niveaux

Une façon d’organiser et de stocker des informations avec des opérations de manipulation

Explication

Une structure de données organise et stocke des informations en précisant les valeurs possibles et les opérations associées. Les autres propositions décrivent d’autres notions du cours.

2. Dans un dictionnaire tableau associatif, quelle opération fait partie de l’interface de base ?

Accéder à une valeur à partir d’une clé
Appeler récursivement une fonction sur un sous-problème
Supprimer systématiquement les doublons d’un résultat
Parcourir les sommets niveau par niveau

Accéder à une valeur à partir d’une clé

Explication

Un dictionnaire associe des clés à des valeurs et permet notamment la recherche, l’insertion, la modification et la suppression via une clé. Le parcours en largeur et la récursivité appartiennent à d’autres thèmes.

3. Quel est le rôle principal de l’instruction assert ?

Trier les résultats d’une requête SQL
Attraper une exception pour continuer l’exécution
Exécuter automatiquement des exemples d’une docstring
Vérifier une condition et déclencher une erreur si elle est fausse

Vérifier une condition et déclencher une erreur si elle est fausse

Explication

Un assert vérifie une expression booléenne et produit une erreur si la condition n’est pas satisfaite. Il ne sert pas à gérer les exceptions ni à exécuter des doctests.

4. Dans le développement piloté par les tests, quelle étape vient en premier ?

Optimiser le programme avant de définir les spécifications
Écrire tout le code puis ajouter les tests ensuite
Écrire un test censé échouer avant d’implémenter le code
Corriger les erreurs après exécution sans écrire de test

Écrire un test censé échouer avant d’implémenter le code

Explication

En TDD, on commence par écrire un test qui échoue, puis on implémente le minimum pour le faire réussir. Cela distingue cette méthode d’une écriture du code avant les tests.

5. Quelle propriété caractérise une pile ?

Le dernier élément ajouté est le premier retiré
Les éléments sont toujours triés par valeur
Le premier élément ajouté est le premier retiré
Les éléments sont accessibles directement par clé

Le dernier élément ajouté est le premier retiré

Explication

Une pile suit le principe LIFO : le dernier entré est le premier sorti. La propriété FIFO correspond à une file, pas à une pile.

6. Quel couple d’opérations correspond à l’usage classique d’une pile ?

Filtrer puis trier
Empiler puis dépiler
Insérer en queue puis retirer en tête
Rechercher puis modifier

Empiler puis dépiler

Explication

Une pile se manipule en ajoutant au sommet et en retirant au sommet. Insérer en queue et retirer en tête décrit une file FIFO.

7. Quelle affirmation décrit le mieux la programmation orientée objet ?

Elle consiste uniquement à écrire des requêtes de base de données
Elle organise un programme autour d’objets qui regroupent données et comportements
Elle interdit toute forme d’abstraction
Elle impose de n’utiliser que des tableaux indicés de taille fixe

Elle organise un programme autour d’objets qui regroupent données et comportements

Explication

La programmation orientée objet structure le code autour d’objets qui combinent des données et des méthodes. Les autres propositions ne correspondent pas à ce paradigme.

8. Quel concept permet de masquer les détails internes d’un objet et de ne montrer qu’une interface d’utilisation ?

Le tri croissant
La composition de requêtes
La récursivité
L’encapsulation

L’encapsulation

Explication

L’encapsulation vise à protéger l’état interne et à exposer une interface claire pour interagir avec l’objet. La récursivité et le tri concernent d’autres mécanismes du cours.

9. Quelle caractéristique définit un arbre libre ?

Un graphe orienté avec un sommet racine
Un graphe non orienté connexe sans cycle
Une collection de couples clé:valeur
Une structure linéaire dynamique

Un graphe non orienté connexe sans cycle

Explication

Un arbre libre est un graphe non orienté, connexe et sans cycle. Cette définition le distingue des structures linéaires et des dictionnaires.

10. Dans un arbre enraciné, comment sont orientées implicitement les arêtes ?

Elles convergent vers la racine, du fils vers le père
Elles s’éloignent de la racine, du père vers le fils
Elles n’ont aucune direction
Elles sont toujours orientées dans les deux sens

Elles s’éloignent de la racine, du père vers le fils

Explication

Dans un arbre enraciné, l’orientation implicite va de la racine vers les descendants, donc du père vers le fils. Cela correspond à la représentation adoptée dans le cours.

11. Dans un arbre libre, quelle propriété caractérise un couple de sommets quelconques ?

Ils ne peuvent pas toujours être reliés
Ils sont reliés par au moins deux chemins
Ils sont reliés par exactement un chemin
Ils sont reliés uniquement s’ils sont voisins

Ils sont reliés par exactement un chemin

Explication

Dans un arbre libre, il existe un chemin unique entre deux sommets quelconques. C’est une propriété équivalente au fait d’être connexe et sans cycle.

12. Que représente la relation |E| = |V| - 1 dans un arbre libre ?

Le nombre d’arêtes dépend uniquement de la racine
Le nombre d’arêtes vaut le double du nombre de sommets
Le nombre d’arêtes est toujours inférieur d’une unité au nombre de sommets
Le nombre d’arêtes est égal au nombre de sommets

Le nombre d’arêtes est toujours inférieur d’une unité au nombre de sommets

Explication

Dans un arbre libre, on a bien |E| = |V| - 1. Cette relation découle de la structure connexe sans cycle de l’arbre.

13. Qu’est-ce qu’un cas de base dans une définition récursive ?

Le premier appel effectué par la fonction
La valeur finale renvoyée par toute fonction récursive
La condition d’arrêt qui empêche la récursion de continuer indéfiniment
La partie du calcul qui se répète sur chaque sous-problème

La condition d’arrêt qui empêche la récursion de continuer indéfiniment

Explication

Le cas de base est la condition d’arrêt de la récursion. Sans lui, les appels pourraient s’enchaîner sans fin.

14. Pourquoi la détection d’un cycle par parcours en profondeur repose-t-elle sur un sommet déjà visité ?

Parce qu’un sommet gris indique qu’il est rencontré à nouveau pendant l’exploration
Parce qu’un sommet déjà visité garantit qu’il n’y a pas de cycle
Parce qu’un sommet noir correspond toujours à une arête de retour
Parce qu’un sommet blanc prouve l’existence d’un cycle

Parce qu’un sommet gris indique qu’il est rencontré à nouveau pendant l’exploration

Explication

Pendant un DFS, rencontrer un sommet déjà visité, en particulier gris, signale une arête de retour et donc un cycle. Le marquage sert précisément à éviter de re-parcourir les mêmes sommets.

15. Dans un algorithme de diviser pour régner, quelle étape correspond à la résolution des sous-problèmes ?

Résoudre récursivement les parties plus petites du problème
Parcourir tous les cas possibles sans découpage
Conserver uniquement le résultat final sans calcul intermédiaire
Trier les données sans séparation préalable

Résoudre récursivement les parties plus petites du problème

Explication

Diviser pour régner consiste à découper le problème, résoudre récursivement les sous-problèmes, puis combiner leurs résultats. La résolution récursive des sous-parties est donc l’étape centrale.

16. Pourquoi le tri fusion a-t-il une complexité en O(n log2 n) ?

Parce qu’il ne fait qu’un seul passage sur le tableau
Parce qu’il effectue une fusion linéaire à chaque niveau sur log2 n niveaux
Parce qu’il utilise une structure de file FIFO pour trier
Parce qu’il compare chaque paire d’éléments exactement une fois

Parce qu’il effectue une fusion linéaire à chaque niveau sur log2 n niveaux

Explication

Le tri fusion découpe le tableau en deux jusqu’à des sous-problèmes de taille unitaire, ce qui crée environ log2 n niveaux, puis fusionne linéairement à chaque niveau. Cela conduit à O(n log2 n).

17. Dans une file FIFO, quel élément est supprimé en premier lors d’une opération de retrait ?

L’élément ajouté en dernier
L’élément choisi au hasard
L’élément situé au milieu de la file
L’élément placé en tête depuis le plus longtemps

L’élément placé en tête depuis le plus longtemps

Explication

Une file FIFO respecte l’ordre d’arrivée : on retire d’abord l’élément en tête, celui qui est arrivé le plus tôt. L’insertion se fait en fin de file.

18. Quel énoncé décrit correctement le parcours en largeur BFS ?

Il suit uniquement les arêtes d’un arbre enraciné
Il descend d’abord jusqu’au plus profond avant de remonter
Il explore un graphe niveau par niveau à partir d’un sommet de départ
Il ignore les sommets déjà découverts sans les marquer

Il explore un graphe niveau par niveau à partir d’un sommet de départ

Explication

Le BFS explore les sommets par distance croissante à partir du sommet de départ, donc niveau par niveau. Il s’appuie sur une file pour traiter d’abord les sommets découverts le plus tôt.

19. Dans l’arbre de récursion de fib(n), pourquoi certaines valeurs comme fib(4) apparaissent-elles plusieurs fois ?

Parce que l’arbre de récursion supprime automatiquement les doublons
Parce que les sous-problèmes se recoupent et sont recalculés dans plusieurs branches
Parce que chaque appel récursif modifie la définition de la suite
Parce que les feuilles de l’arbre ne correspondent pas aux cas de base

Parce que les sous-problèmes se recoupent et sont recalculés dans plusieurs branches

Explication

Pour Fibonacci, différents appels demandent les mêmes sous-problèmes, ce qui crée des branches redondantes dans l’arbre de récursion. C’est précisément ce recoupement qui motive la mémorisation.

20. Quel est l’effet principal de la mémorisation dans un calcul récursif avec sous-problèmes qui se recoupent ?

Rendre inutile le stockage des résultats intermédiaires
Éviter de recalculer plusieurs fois les mêmes valeurs déjà obtenues
Transformer automatiquement toute récursion en parcours en largeur
Supprimer la nécessité d’un cas de base

Éviter de recalculer plusieurs fois les mêmes valeurs déjà obtenues

Explication

La mémorisation stocke les résultats déjà calculés pour les réutiliser ensuite. Elle évite ainsi les recomputations coûteuses lorsque les sous-problèmes se recoupent.

21. Dans un parcours en largeur, quelle structure permet de traiter d’abord les sommets découverts le plus tôt ?

Une pile LIFO
Une file FIFO
Un arbre binaire
Un dictionnaire associatif

Une file FIFO

Explication

Le parcours en largeur utilise une file FIFO : on retire les éléments par la tête et on ajoute les nouveaux en queue. Une pile LIFO correspondrait au parcours en profondeur, pas au BFS.

22. Quelle affirmation décrit correctement le parcours en largeur sur un graphe non orienté ?

Il calcule directement le plus court chemin sans mémoriser les couleurs
Il explore les sommets niveau par niveau à partir d’un sommet de départ
Il suit un seul chemin jusqu’au bout avant de revenir en arrière
Il trie les sommets selon leur degré décroissant

Il explore les sommets niveau par niveau à partir d’un sommet de départ

Explication

Le BFS explore par distance croissante, donc niveau par niveau à partir du sommet de départ. Les couleurs servent justement à éviter de revisiter les sommets déjà découverts.

23. Dans le problème du rendu de monnaie, que représente la valeur N_b(X) ?

Le nombre de sous-problèmes déjà résolus pour X
Le nombre minimum de pièces nécessaires pour rendre la somme X
La plus grande pièce inférieure ou égale à X
Le nombre total de solutions possibles pour rendre X

Le nombre minimum de pièces nécessaires pour rendre la somme X

Explication

N_b(X) désigne le nombre minimum de pièces pour obtenir la somme X, et vaut infini si la somme est impossible à rendre. Ce n’est pas un simple comptage de solutions, mais bien une optimisation.

24. Quelle récurrence correspond au calcul du nombre minimum de pièces pour rendre une somme X ?

N_b(0)=1, N_b(X)=0 si X<0, et pour X>0 : N_b(X)=min N_b(X-p_i)
N_b(0)=0, N_b(X)=∞ si X<0, et pour X>0 : N_b(X)=1+min N_b(X-p_i)
N_b(0)=0, N_b(X)=∞ si X>0, et pour X<0 : N_b(X)=1+min N_b(X-p_i)
N_b(0)=1, N_b(X)=∞ si X<0, et pour X>0 : N_b(X)=1+max N_b(X-p_i)

N_b(0)=0, N_b(X)=∞ si X<0, et pour X>0 : N_b(X)=1+min N_b(X-p_i)

Explication

La récurrence donnée fixe bien N_b(0)=0, renvoie infini pour les sommes négatives, puis ajoute 1 à la meilleure solution parmi les sous-problèmes restants. Le minimum est essentiel, car on cherche le plus petit nombre de pièces.

Révisez avec les flashcards

Mémorisez les réponses avec 24 flashcards sur Introduction aux structures de données et algorithmes.

Structure de données — définition ?

Organisation et stockage d’informations.

Type de données abstrait — rôle ?

Décrit l’interface et les opérations.

Ensemble dynamique — caractéristique ?

Permet insertion et suppression en cours d’exécution.

Voir les flashcards →

Approfondir avec la fiche

Consultez la fiche de révision complète sur Introduction aux structures de données et algorithmes.

Voir la fiche →

Cours similaires

Crée tes propres QCM

Importe ton cours et l'IA génère des QCM avec corrections en 30 secondes.

Générateur de QCM