QCM : Graphes et programmation dynamique (58 questions)

Questions et réponses du QCM

1. Une chaîne Python doit contenir un retour à la ligne réel dans son texte ; quelle délimitation permet de l’écrire sur plusieurs lignes ?

Des apostrophes simples ordinaires
Des triples guillemets ou des triples apostrophes
Des guillemets doubles ordinaires
Un guillemet suivi de la séquence \n

Des triples guillemets ou des triples apostrophes

Explication

Les triples guillemets ou triples apostrophes permettent notamment d’écrire une chaîne sur plusieurs lignes. Les guillemets ordinaires délimitent une chaîne simple, tandis que \n représente un retour à la ligne dans la chaîne sans remplacer cette délimitation.

2. Après avoir créé la chaîne `mot = "lune"`, une personne tente de remplacer son premier caractère avec `mot[0] = "L"` ; quel résultat faut-il attendre ?

L’affectation échoue, car les chaînes sont immuables
L’affectation échoue, car les caractères ne sont pas indexables
L’affectation crée une nouvelle chaîne « Lune » dans `mot`
L’affectation remplace le caractère et donne « Lune »

L’affectation échoue, car les chaînes sont immuables

Explication

Une chaîne est immuable : on ne peut pas remplacer directement un caractère par une affectation à un indice. Les listes, contrairement aux chaînes, acceptent la modification d’un élément ; l’indexation d’une chaîne reste possible en lecture.

3. Dans `False and calculer()`, Python peut déterminer le résultat dès l’évaluation du premier opérande ; quel comportement suit-il ?

Il lance `calculer()` puis combine les deux valeurs
Il s’arrête seulement si `calculer()` renvoie False
Il lance `calculer()` et inverse son résultat
Il s’arrête et ne lance pas `calculer()`

Il s’arrête et ne lance pas `calculer()`

Explication

Les opérateurs booléens évaluent de gauche à droite et `and` s’arrête dès qu’un opérande faux détermine le résultat. Évaluer `calculer()` systématiquement ignore le court-circuit, tandis que l’inversion relève de `not`.

4. Une boucle parcourt `range(2, 11, 3)` ; dans quel ordre la variable de boucle prend-elle ses valeurs ?

2, 5, 8
2, 5, 8, 11
2, 3, 4, 5, 6, 7, 8, 9, 10
3, 6, 9

2, 5, 8

Explication

`range(a, b, pas)` produit les termes `a + k·pas` strictement inférieurs à `b` : ici, 2, 5 et 8. Inclure 11 oublie que la borne supérieure est exclue, et compter de un en un néglige le pas de 3.

5. Une fonction Python reçoit deux paramètres et calcule un résultat sans instruction `return` ; quelle affirmation décrit correctement sa définition et son comportement ?

Elle doit renvoyer une valeur du même type que ses paramètres
Elle peut recevoir plusieurs paramètres et ne pas renvoyer de valeur
Elle doit renvoyer une valeur dès qu’elle reçoit plusieurs paramètres
Elle ne peut recevoir qu’un paramètre si elle ne renvoie rien

Elle peut recevoir plusieurs paramètres et ne pas renvoyer de valeur

Explication

Une fonction définie avec `def` peut prendre plusieurs paramètres et l’instruction `return` n’est pas obligatoire. Imposer une valeur renvoyée confond fonction et procédure, et le nombre ou le type des paramètres n’impose pas ces contraintes.

6. Une fonction contient `a = 3`, alors qu’une variable `a` vaut déjà 1 à l’extérieur ; après l’appel, quelle valeur conserve la variable extérieure, en l’absence de déclaration `global` ?

1, car la fonction ne peut affecter aucune variable
3, car une affectation remplace la variable extérieure de même nom
1, car l’affectation dans la fonction crée une variable locale
3, car les variables locales sont conservées après la fonction

1, car l’affectation dans la fonction crée une variable locale

Explication

Sans déclaration `global`, une variable à laquelle la fonction affecte une valeur est locale ; l’affectation de 3 ne modifie donc pas la variable extérieure, qui reste à 1. Une déclaration `global` serait nécessaire pour viser cette variable globale.

7. Quelle structure de données Python correspond à une séquence ordonnée, définie entre crochets, dont les éléments peuvent être de types différents et être modifiés par accès à leurs positions ?

Une liste
Un dictionnaire
Un ensemble
Un tuple

Une liste

Explication

Une liste est ordonnée, peut contenir des éléments de types différents et permet de modifier ses éléments. Le tuple est non modifiable, l’ensemble n’est pas une séquence ordonnée par indice et le dictionnaire associe des clés à des valeurs.

8. On exécute `l = [4, 5]`, puis `l + [8]` sans affecter le résultat, et ensuite `l.append(9)`. Quel est le contenu de `l` à la fin ?

[4, 5, 8, 9]
[4, 5, 8]
[4, 5, 9]
[4, 5]

[4, 5, 9]

Explication

L’expression `l + [8]` produit une nouvelle liste sans changer `l`, tandis que `append(9)` modifie directement la liste. Inclure 8 revient à croire que la concaténation agit en place; ne pas inclure 9 revient à traiter `append` comme une opération non modificatrice.

9. Une fonction renvoie deux valeurs séparées par une virgule, reçues dans la variable `result`. Quel comportement faut-il attendre si l’on tente de modifier un de ses éléments ?

La modification échoue, car le résultat est un tuple non modifiable
La modification réussit si les valeurs sont de types identiques
La modification réussit, car le résultat est une liste modifiable
La modification remplace le tuple par une liste de mêmes éléments

La modification échoue, car le résultat est un tuple non modifiable

Explication

Plusieurs valeurs renvoyées séparées par des virgules forment un tuple, dont les éléments ne sont pas modifiables. Le traiter comme une liste confond les deux structures; l’affectation à `result` ne change pas la nature du tuple.

10. Après `a = [1, 2]` puis `b = a`, on exécute `a = [7, 8]`. Que désigne alors `b` ?

La liste initiale [1, 2]
Une liste vide créée par la réaffectation
La nouvelle liste [7, 8]
Une copie indépendante de [7, 8]

La liste initiale [1, 2]

Explication

`b` reste un alias de l’objet initial `[1, 2]` : réaffecter `a` fait pointer cette variable vers un autre objet, sans modifier l’objet initial. Croire que `b` suit la nouvelle valeur confond réaffectation et modification en place.

11. Dans un script, on veut appeler `sqrt` après avoir importé `math` sous l’alias `m`, sans importer directement cette fonction. Quelle écriture convient ?

`sqrt(25)`
`m.math.sqrt(25)`
`m.sqrt(25)`
`math.sqrt(25)`

`m.sqrt(25)`

Explication

Avec `import math as m`, l’accès aux objets du module se fait au moyen de son alias, donc `m.sqrt(25)`. Appeler `sqrt` sans préfixe suppose une importation directe, tandis que `math` n’est pas le nom utilisé après l’alias.

12. Un programme doit ajouter une ligne à un fichier existant tout en conservant son contenu, et créer le fichier s’il est absent. Quel mode d’ouverture faut-il choisir ?

Le mode « r »
Le mode « a »
Le mode « x »
Le mode « w »

Le mode « a »

Explication

Le mode « a » ajoute à la fin du fichier existant et crée le fichier s’il n’existe pas. Le mode « w » vide le fichier à l’ouverture, tandis que le mode « r » sert à lire.

13. Un fichier CSV possède une première ligne de noms de colonnes et l’on souhaite obtenir chaque ligne de données sous forme de dictionnaire associé à ces noms. Quel outil du module `csv` convient ?

`fieldnames`
`open`
`DictReader`
`reader`

`DictReader`

Explication

`DictReader` produit des dictionnaires dont les clés proviennent de la première ligne ou des `fieldnames`. `reader` renvoie des lignes sous forme de listes; `fieldnames` fournit les noms de champs mais n’est pas le lecteur CSV.

14. Dans une fonction, que se passe-t-il lorsqu’une condition vérifiée par une instruction `assert` est fausse ?

La fonction renvoie `False` sans déclencher d’exception.
Une exception `TypeError` est déclenchée.
Une exception `AssertionError` est déclenchée.
Le programme poursuit son exécution comme si la condition était vraie.

Une exception `AssertionError` est déclenchée.

Explication

Une assertion contrôle une condition et déclenche `AssertionError` si celle-ci est fausse. Renvoyer `False` confond contrôle et résultat booléen, `TypeError` attribue le mauvais type d’exception, et poursuivre l’exécution ignore l’échec du contrôle.

15. Pour tester une fonction qui accepte des nombres entre 10 et 20, une équipe choisit 14 comme entrée représentative d’une classe et teste aussi 9, 10, 20 et 21. Quelle caractérisation distingue ces deux choix ?

14 et 20 relèvent des tests aux limites; 9, 10 et 21 relèvent du partitionnement.
14 et 10 relèvent du partitionnement; 9, 20 et 21 relèvent des tests aux limites.
14 relève du partitionnement; 9, 10, 20 et 21 relèvent des tests aux limites.
14 relève des tests aux limites; 9, 10, 20 et 21 relèvent du partitionnement.

14 relève du partitionnement; 9, 10, 20 et 21 relèvent des tests aux limites.

Explication

Le partitionnement teste une valeur représentative d’un sous-ensemble, tandis que les tests aux limites vérifient les bornes et les valeurs juste au-delà. Traiter 14 comme une frontière confond représentativité et borne; classer les frontières comme partitionnement inverse les méthodes, et isoler certaines valeurs limite n’en change pas la nature.

16. Une liste est parcourue de gauche à droite pour rechercher une valeur. Quelle réponse faut-il produire si une égalité est trouvée, puis si le parcours s’achève sans égalité ?

Continuer jusqu’à la fin après l’égalité, puis renvoyer `True` ou `False`.
Renvoyer `False` dès l’égalité, puis `True` si le parcours finit sans résultat.
Renvoyer `True` dès l’égalité, puis `False` si le parcours finit sans résultat.
Renvoyer l’indice de l’égalité, puis `-1` si le parcours finit sans résultat.

Renvoyer `True` dès l’égalité, puis `False` si le parcours finit sans résultat.

Explication

Le test d’appartenance renvoie `True` dès qu’un élément égal est trouvé, et `False` si tout le parcours s’achève sans résultat. Renvoyer un indice correspond à une recherche de position, inverser les booléens inverse le résultat, et poursuivre après la découverte oublie l’arrêt immédiat.

17. On cherche 17 par dichotomie dans une liste triée; l’indice milieu contient 12. Quelle mise à jour conserve la partie pertinente de la recherche ?

Conserver le milieu comme nouvelle borne gauche.
Recommencer le parcours séquentiellement depuis le début.
Déplacer la borne gauche à l’indice juste après le milieu.
Déplacer la borne droite à l’indice juste avant le milieu.

Déplacer la borne gauche à l’indice juste après le milieu.

Explication

Comme 17 est supérieur à la valeur 12 au milieu, la recherche dichotomique conserve la moitié droite et exclut le milieu en plaçant la borne gauche à l’indice suivant. Reculer la borne droite choisit la mauvaise moitié, garder le milieu ne l’exclut pas, et un parcours séquentiel n’est pas la mise à jour dichotomique.

18. Pour repérer un mot dans une chaîne, quelle démarche permet de trouver une occurrence sans manquer une position possible ?

Tester uniquement les positions où le premier caractère du mot est identique au dernier caractère de la chaîne.
Continuer à tester des départs même lorsque la chaîne restante est trop courte pour contenir le mot.
Comparer la chaîne entière au mot, puis recommencer après chaque caractère identique.
Tester les positions de départ possibles et comparer les caractères successifs jusqu’à trouver le mot ou atteindre la fin possible.

Tester les positions de départ possibles et comparer les caractères successifs jusqu’à trouver le mot ou atteindre la fin possible.

Explication

La recherche teste les positions de départ possibles et compare les caractères du mot successivement; elle s’arrête lorsqu’une correspondance est trouvée ou qu’il ne reste pas assez de chaîne. Limiter la recherche au début manque des occurrences, comparer les chaînes entières n’effectue pas la comparaison caractère par caractère, et poursuivre après la dernière position possible dépasse les départs valides.

19. Dans la chaîne « bananana », on compte les occurrences de « nana ». Quelle différence de parcours sépare le comptage avec chevauchement du comptage sans chevauchement ?

Avec chevauchement, examiner les départs pairs; sans chevauchement, examiner les départs impairs.
Avec chevauchement, avancer de la longueur du mot; sans chevauchement, avancer d’un caractère.
Avec chevauchement, reprendre après l’occurrence; sans chevauchement, examiner chaque départ successif.
Avec chevauchement, examiner chaque départ successif; sans chevauchement, reprendre après l’occurrence trouvée.

Avec chevauchement, examiner chaque départ successif; sans chevauchement, reprendre après l’occurrence trouvée.

Explication

Le comptage avec chevauchement examine chaque position de départ successive; le comptage sans chevauchement reprend à la position située après le mot trouvé. Inverser ces déplacements échange les deux méthodes, avancer de la longueur du mot dans les deux cas ne respecte pas le parcours successif avec chevauchement, et séparer les départs pairs et impairs n’est pas la règle.

20. Pour comparer deux algorithmes, une équipe veut mesurer le temps de calcul en fonction de la taille des entrées, et non la mémoire occupée. Quel type de complexité doit-elle étudier ?

La complexité temporelle
La complexité spatiale
La complexité asymptotique
La complexité maximale

La complexité temporelle

Explication

La complexité temporelle mesure le temps de calcul en fonction des données d’entrée, alors que la complexité spatiale concerne la mémoire utilisée. La complexité maximale désigne un cas de coût parmi les entrées, et la complexité asymptotique décrit une croissance.

21. Deux algorithmes ont des coûts comportant des constantes multiplicatives et des termes de moindre ordre. Pour comparer leur comportement lorsque la taille des entrées devient très grande, quelle notion faut-il utiliser ?

La complexité spatiale
Le coût exact d’exécution
La complexité asymptotique
La complexité moyenne

La complexité asymptotique

Explication

La complexité asymptotique décrit l’ordre de croissance du coût pour de grandes tailles d’entrée en ignorant les constantes multiplicatives et les termes de moindre ordre. Le coût exact conserve les constantes, la complexité spatiale porte sur la mémoire et la complexité moyenne pondère les coûts par les probabilités des entrées.

22. Pour un algorithme, on établit que, pour de grandes entrées, son coût est à la fois au moins et au plus égal à une constante positive multipliée par n2n^2, avec éventuellement des constantes différentes. Quelle notation décrit cet encadrement ?

Θ(n2)\Theta(n^2)
O(n2)O(n^2)
C(n)=n2C(n)=n^2
Ω(n2)\Omega(n^2)

$$\Theta(n^2)$$

Explication

La notation Θ(n2)\Theta(n^2) indique que le coût est encadré asymptotiquement par des constantes multiples de n2n^2. O(n2)O(n^2) ne fournit qu’une majoration, Ω(n2)\Omega(n^2) qu’une minoration, et l’égalité exacte ne découle pas de cet encadrement.

23. Une boucle while s’arrête lorsque son compteur atteint zéro. Quelle démarche permet de démontrer rigoureusement sa correction ?

Établir un invariant, montrer la terminaison par un variant entier décroissant, puis vérifier la sortie
Montrer que le variant décroît, puis conclure sans examiner le résultat retourné
Vérifier que le résultat retourné est correct, sans établir que la boucle termine
Établir un invariant et supposer que la boucle termine dès que le compteur change

Établir un invariant, montrer la terminaison par un variant entier décroissant, puis vérifier la sortie

Explication

La preuve d’une boucle établit un invariant, prouve la terminaison — notamment avec un variant entier strictement décroissant pour une boucle while — puis vérifie que la sortie correspond au résultat attendu. Montrer seulement la terminaison ou seulement l’invariant ne suffit pas à démontrer la correction complète.

24. Un programme doit stocker une collection dont le nombre d’éléments peut augmenter ou diminuer pendant son exécution. Quelle structure correspond à ce besoin ?

Un tableau d’adresses de capacité fixe
Une liste dynamique
Un tableau homogène contigu
Un tableau à taille fixe

Une liste dynamique

Explication

Une liste dynamique peut varier en nombre d’éléments, tandis qu’un tableau a une taille fixe. Le caractère homogène ou contigu concerne les éléments et leur organisation mémoire, pas une capacité variable.

25. Un tableau homogène contigu commence à l’adresse 1000 et chaque élément occupe 8 unités d’adresse. Quelle adresse faut-il calculer pour accéder à l’élément en position 5, les positions commençant à 0 ?

1005
1008
1040
1048

1040

Explication

L’adresse se calcule par debut+k×tailledebut + k \times taille, donc 1000+5×8=10401000 + 5 \times 8 = 1040. La valeur 1005 ajoute la position sans tenir compte de la taille, 1008 ne tient compte que d’un élément et 1048 applique une position de 6.

26. Dans une liste simplement chaînée, une opération doit supprimer l’élément situé à la position 6, en partant du début. Quelle contrainte structurelle s’applique ?

Calculer directement l’adresse à partir de l’indice
Renoncer à la suppression, même après avoir atteint la position
Remonter depuis l’élément suivant grâce au lien précédent
Parcourir les éléments précédents pour atteindre la position

Parcourir les éléments précédents pour atteindre la position

Explication

Une liste simplement chaînée donne facilement accès à son début, mais il faut parcourir les éléments précédents pour atteindre une position donnée. Le calcul direct d’adresse correspond au tableau contigu, le lien précédent à la liste doublement chaînée, et la suppression devient possible une fois la position atteinte.

27. Lorsqu’un programme Python ajoute un élément à la fin d’une liste avec `append`, quelle caractéristique de son implémentation explique le coût amorti constant de cette opération ?

Un tableau contigu qui décale les éléments après chaque ajout en fin
Une structure de taille fixe qui ne peut pas accueillir d’éléments supplémentaires
Une chaîne de nœuds reliés par des pointeurs vers le suivant
Un tableau d’adresses dont la capacité peut être augmentée par réserve

Un tableau d’adresses dont la capacité peut être augmentée par réserve

Explication

Le type `list` de Python utilise un tableau d’adresses et réserve de la capacité afin que les ajouts en fin soient en temps amorti constant. Une chaîne de nœuds décrit une liste chaînée, le décalage concerne la suppression ou l’insertion intermédiaire, et une taille fixe empêcherait l’agrandissement.

28. On empile successivement les objets X, Y et Z, puis on récupère et supprime un objet. Lequel est retiré en premier ?

Z
Aucun objet avant d’avoir vidé toute la pile
X
Y

Z

Explication

Une pile fonctionne selon le principe LIFO : le dernier objet ajouté est le premier récupéré et supprimé. X correspondrait à une file FIFO, tandis que Y confond l’ordre d’accès avec l’ordre d’insertion.

29. Dans une file d’attente, trois personnes arrivent dans l’ordre Lina, Marc, puis Noé. Qui est servi en premier ?

Lina
Marc
La personne qui attend le moins longtemps, quel que soit son ordre d’arrivée
Noé

Lina

Explication

Une file suit le principe FIFO : le premier arrivé est le premier récupéré et supprimé, donc Lina est servie en premier. Noé serait choisi en appliquant LIFO, et Marc en privilégiant à tort la position intermédiaire.

30. Dans un réseau, une relation entre U et V va de U vers V. Quelle différence permet de distinguer cette relation dans un graphe orienté et dans un graphe non orienté ?

L’arc est l’ensemble {U, V}, tandis que l’arête est le couple ordonné (U, V).
L’arc et l’arête sont des couples ordonnés, mais seul l’arc relie deux sommets distincts.
L’arc et l’arête sont des ensembles sans ordre, mais seul l’arc indique une pondération.
L’arc est le couple ordonné (U, V), tandis que l’arête est l’ensemble {U, V}.

L’arc est le couple ordonné (U, V), tandis que l’arête est l’ensemble {U, V}.

Explication

Dans un graphe orienté, un arc est un couple ordonné, de sorte que l’ordre de U et V compte; dans un graphe non orienté, une arête est un ensemble où l’ordre ne compte pas. L’ensemble pour l’arc inverse ces notions, et une arête n’acquiert pas d’orientation.

31. Un technicien veut explorer un réseau depuis le sommet R et déterminer, pour chaque sommet, sa distance minimale depuis R ainsi qu’un prédécesseur permettant de reconstruire un chemin. Quelle méthode convient ?

Un calcul des degrés, qui compte les arcs incidents à chaque sommet.
Une matrice d’adjacence, qui donne directement un prédécesseur pour chaque chemin.
Un parcours en largeur, qui traite les sommets par niveaux.
Un parcours en profondeur, qui suit une branche avant d’en explorer une autre.

Un parcours en largeur, qui traite les sommets par niveaux.

Explication

Le parcours en largeur explore par niveaux et permet d’obtenir les distances minimales depuis le sommet de départ ainsi qu’un prédécesseur pour reconstruire un chemin. Le parcours en profondeur n’est pas la méthode décrite pour cette détermination par niveaux; les degrés comptent des arcs et la matrice représente les liens.

32. Lors d’un parcours en largeur depuis A, quelle distance est attribuée au sommet I ?

2
1
3
0

2

Explication

Dans ce parcours en largeur, I se trouve à distance 2 de A; les sommets B et H sont à distance 1, tandis qu'E, F et G sont à distance 3. Attribuer 0 à I confond sa distance avec celle du sommet de départ.

33. Quelle notation définit un graphe orienté à partir de ses sommets et de ses arcs ?

G=(S,w)G=(S,w), où SS est l’ensemble des sommets et ww une fonction attribuant un poids aux arcs.
G=(A,S)G=(A,S), où AA est l’ensemble des sommets et SS celui des couples ordonnés appelés arcs.
G=(S,A)G=(S,A), où SS est l’ensemble des sommets et AA celui des ensembles non ordonnés appelés arcs.
G=(S,A)G=(S,A), où SS est l’ensemble des sommets et AA celui des couples ordonnés appelés arcs.

$$G=(S,A)$$, où $$S$$ est l’ensemble des sommets et $$A$$ celui des couples ordonnés appelés arcs.

Explication

Un graphe orienté est défini par G=(S,A)G=(S,A) : SS rassemble les sommets et AA les couples ordonnés de sommets appelés arcs. Inverser S et A échange leurs rôles, tandis que des ensembles non ordonnés décrivent des arêtes non orientées.

34. Lorsqu’un parcours en profondeur explore un graphe depuis un sommet, comment progresse-t-il avant de revenir sur ses pas ?

Il choisit d’abord le sommet ayant le plus de voisins.
Il visite d’abord tous les sommets situés à une même distance.
Il avance aussi loin que possible avant de revenir explorer d’autres branches.
Il s’arrête dès qu’il revient au sommet de départ.

Il avance aussi loin que possible avant de revenir explorer d’autres branches.

Explication

Le parcours en profondeur poursuit une branche aussi loin que possible avant de revenir sur ses pas. Visiter les sommets par distance évoque le parcours en largeur, tandis que le nombre de voisins et le retour au départ ne définissent pas sa progression.

35. Dans un parcours en profondeur, le sommet courant possède plusieurs voisins non vus. Quelle action l’algorithme effectue-t-il à cette étape ?

Ajoute tous les voisins à la pile et efface leur prédécesseur.
Marque tous les voisins comme épuisés et retire le sommet courant.
Prend le premier voisin non vu, mémorise son prédécesseur et l’empile.
Prend le voisin non vu le plus éloigné et le place au bas de la pile.

Prend le premier voisin non vu, mémorise son prédécesseur et l’empile.

Explication

Le parcours choisit le premier voisin non vu, l’ajoute aux successeurs du sommet courant, mémorise son prédécesseur et l’empile. Choisir le plus éloigné confond l’ordre prescrit avec un critère de distance; épuiser tous les voisins ou les empiler ensemble ne correspond pas à cette étape.

36. Un graphe pondéré contient une arête de poids négatif, et l’on veut calculer les plus courtes distances depuis un sommet vers les autres sommets connexes. La condition d’application de Dijkstra est-elle satisfaite ?

Non, car Dijkstra ne s’applique qu’aux graphes non orientés.
Non, car Dijkstra requiert des poids positifs ou nuls.
Oui, car un poids négatif équivaut à un poids nul.
Oui, dès lors que tous les sommets sont connexes.

Non, car Dijkstra requiert des poids positifs ou nuls.

Explication

Dijkstra calcule les plus courtes distances lorsque tous les poids sont positifs ou nuls; une arête négative ne respecte pas cette condition. Un poids négatif n’est pas un poids nul, la connexité ne supprime pas cette contrainte et l’algorithme peut traiter des graphes orientés ou non.

37. Dans une exécution de Dijkstra, un sommet non exploré a une distance provisoire de 6 et un autre une distance de 9. Quel sommet faut-il explorer en premier ?

Celui dont la distance provisoire est 6.
Celui qui semble le plus proche de la destination.
Celui qui possède le plus de voisins non marqués.
Celui dont la distance provisoire est 9.

Celui dont la distance provisoire est 6.

Explication

À chaque tour, Dijkstra choisit le sommet non exploré de distance provisoire minimale, donc celui associé à 6. Choisir la distance maximale inverse le critère; le nombre de voisins et la proximité estimée de la destination ne déterminent pas ce choix.

38. Deux sommets non explorés ont la même distance calculée depuis l’origine, mais des estimations différentes de leur distance à la destination. Quel critère distingue leur priorité dans A* ?

La seule estimation de distance jusqu’à la destination.
Le coût combinant la distance parcourue et l’estimation jusqu’à la destination.
Le nombre de voisins non explorés du sommet.
La seule distance calculée depuis l’origine.

Le coût combinant la distance parcourue et l’estimation jusqu’à la destination.

Explication

A* évalue les sommets selon un coût qui combine la distance déjà parcourue depuis l’origine et une heuristique vers la destination. Utiliser la distance seule correspond au critère de Dijkstra, tandis que l’heuristique seule ou le nombre de voisins ne constitue pas le critère décrit.

39. Pour un sommet S, la distance calculée depuis l’origine vaut 8 et l’heuristique jusqu’à la destination vaut 3. Quel coût A* lui attribue-t-il ?

2424
33
55
1313

$$13$$

Explication

A* calcule le coût par cout⁡(S)=d(S)+h(S)\operatorname{cout}(S)=d(S)+h(S); ici, 8+3=138+3=13. La valeur 5 provient d’une soustraction, 3 ignore la distance parcourue et 24 résulte d’une multiplication.

40. Dans un problème où plusieurs calculs intermédiaires réapparaissent, quel principe caractérise la programmation dynamique ?

Choisir à chaque étape la solution locale la plus avantageuse
Énumérer toutes les solutions possibles sans conserver les calculs intermédiaires
Décomposer le problème en sous-problèmes indépendants et résoudre chacun une fois
Décomposer le problème en sous-problèmes liés et réutiliser les résultats déjà calculés

Décomposer le problème en sous-problèmes liés et réutiliser les résultats déjà calculés

Explication

La programmation dynamique exploite le chevauchement des sous-problèmes en conservant leurs résultats pour éviter de les recalculer. L’indépendance caractérise plutôt le diviser pour régner, le choix local relève du glouton et l’énumération sans mémorisation ne réutilise pas les calculs.

41. Pour rendre 8 avec des pièces de valeurs 1, 4 et 6, un algorithme glouton choisit à chaque étape la plus grande pièce possible. Quelle conclusion décrit correctement cet algorithme ?

Il prend 6 puis 1 et 1, soit trois pièces, sans garantir le minimum
Il prend 4 puis 4, soit deux pièces, en garantissant le minimum
Il prend 1 huit fois, soit huit pièces, sans garantir le minimum
Il compare toutes les combinaisons et retient deux pièces, soit le minimum

Il prend 6 puis 1 et 1, soit trois pièces, sans garantir le minimum

Explication

Le glouton choisit 6, puis deux pièces de 1 : il utilise trois pièces alors que 4 + 4 en demande deux. La garantie d’optimalité est l’erreur associée à l’idée que le choix glouton suffit, la programmation dynamique compare les sous-problèmes et le choix répété de la pièce de 1 ne suit pas la règle gloutonne.

42. Avec des pièces de valeurs 1, 3 et 4, le minimum pour former 0 vaut t0=0t_0=0. Quelle récurrence permet de calculer le nombre minimal de pièces pour former un montant positif nn ?

tn=1+min⁡c∈{1,3,4}, c≤ntn−ct_n=1+\min_{c\in\{1,3,4\},\ c\le n}t_{n-c}
tn=min⁡c∈{1,3,4}, c≤ntn−ct_n=\min_{c\in\{1,3,4\},\ c\le n}t_{n-c}
tn=1+max⁡c∈{1,3,4}, c≤ntn−ct_n=1+\max_{c\in\{1,3,4\},\ c\le n}t_{n-c}
tn=1+min⁡c∈{1,3,4}tn−ct_n=1+\min_{c\in\{1,3,4\}}t_{n-c}

$$t_n=1+\min_{c\in\{1,3,4\},\ c\le n}t_{n-c}$$

Explication

Pour chaque pièce admissible, on ajoute une pièce au meilleur résultat pour le montant restant, puis on choisit le minimum. Omettre le terme 1 oublie la pièce utilisée, le maximum inverse l’objectif, et inclure une pièce supérieure à nn crée un montant restant non admissible.

43. Un trajet dans un tableau avance vers le haut ou vers la droite et doit atteindre une case de valeur positive ai,ja_{i,j}. Si les meilleurs gains des cases accessibles juste avant sont ti−1,j=7t_{i-1,j}=7 et ti,j−1=10t_{i,j-1}=10, quelle valeur faut-il retenir pour le gain maximal en arrivant en (i,j)(i,j) ?

ai,j+17a_{i,j}+17
ai,j+7a_{i,j}+7
ai,j+10a_{i,j}+10
1010

$$a_{i,j}+10$$

Explication

Le meilleur trajet vient du prédécesseur ayant le gain maximal, auquel on ajoute la valeur de la case : ai,j+max⁡(7,10)=ai,j+10a_{i,j}+\max(7,10)=a_{i,j}+10. Le minimum choisit le mauvais prédécesseur, la somme cumule deux trajets incompatibles et le gain 10 omet la case d’arrivée.

44. Une liste d’entiers positifs doit être séparée en deux sous-listes. Quelle propriété définit une partition équilibrée ?

Les éléments sont répartis alternativement dans leur ordre initial
Les sommes des deux sous-listes sont aussi proches que possible
Les deux sous-listes contiennent le même nombre d’éléments
La somme de l’une des sous-listes est aussi grande que possible

Les sommes des deux sous-listes sont aussi proches que possible

Explication

Une partition équilibrée vise à rapprocher autant que possible les sommes des deux sous-listes. Avoir le même nombre d’éléments ne garantit pas des sommes proches, maximiser une somme ne minimise pas leur écart, et l’alternance n’est pas le critère d’équilibre.

45. Pour la liste [2,5,6][2,5,6], les sommes atteignables avec les deux premiers termes sont 0,2,5,70,2,5,7. Après l’ajout du terme 6, quelle méthode donne les sommes atteignables nécessaires pour équilibrer la partition ?

Remplacer les anciennes sommes par 6,7,8,116,7,8,11
Retenir seulement 1313, la somme maximale atteignable
Ne retenir que 6,8,11,136,8,11,13, obtenues avec le nouveau terme
Conserver 0,2,5,70,2,5,7 et y ajouter 6,8,11,136,8,11,13

Conserver $$0,2,5,7$$ et y ajouter $$6,8,11,13$$

Explication

À chaque étape, les sommes possibles comprennent celles déjà atteintes et celles obtenues en ajoutant le nouvel élément, ici 66. Ne garder que les nouvelles sommes oublie les sous-listes sans le 6, tandis que sélectionner directement la somme maximale ne suit pas la construction des sommes atteignables.

46. Une liste d’entiers positifs a une somme totale de 31. Pour trouver une partition dont les deux sommes sont aussi proches que possible, quelle cible faut-il utiliser pour choisir une sous-liste ?

La somme atteignable la plus proche de 31
La somme atteignable la plus proche de 7,75
La somme atteignable la plus proche de 15,5
La somme atteignable la plus proche de 16, en privilégiant une valeur supérieure

La somme atteignable la plus proche de 15,5

Explication

L’écart entre les deux groupes est minimisé en recherchant une sous-liste dont la somme est aussi proche que possible de la moitié du total, soit 31/2=15,531/2=15{,}5. Viser 31 ne partage pas le total, privilégier le dépassement ignore la recherche de la somme atteignable inférieure ou égale à la moitié, et le quart correspond à une autre répartition.

47. Dans la chaîne « abxcdy », laquelle des suites suivantes est une sous-séquence ?

« abq »
« bcdyx »
« acdy »
« xabc »

« acdy »

Explication

Une sous-séquence conserve l’ordre des caractères de la chaîne, mais ceux-ci n’ont pas besoin d’être consécutifs. « xabc » inverse l’ordre, « bcdyx » aussi, tandis que « abq » contient un caractère absent.

48. Pour les chaînes « bateau » et « bureau », que désigne leur plus longue sous-séquence commune ?

Une suite présente dans les deux chaînes, de longueur maximale
Une suite présente dans les deux chaînes, de longueur minimale
Une suite contiguë identique dans les deux chaînes, de longueur maximale
Une suite de longueur maximale présente dans l’une des deux chaînes

Une suite présente dans les deux chaînes, de longueur maximale

Explication

La plus longue sous-séquence commune doit apparaître dans les deux chaînes en respectant l’ordre et avoir une longueur maximale. Une sous-chaîne contiguë impose une contrainte supplémentaire, et une suite commune quelconque n’est pas nécessairement la plus longue.

49. Un programme calcule plusieurs fois les plus longues sous-séquences communes de mêmes préfixes lors de recherches sur des préfixes plus grands. Quelle propriété justifie de mémoriser ces résultats ?

Les caractères doivent être consécutifs, ce qui motive la programmation dynamique
Les chaînes doivent être triées, ce qui motive la programmation dynamique
Les sous-problèmes ne se recouvrent pas, ce qui motive la programmation dynamique
Les mêmes sous-problèmes se répètent, ce qui motive la programmation dynamique

Les mêmes sous-problèmes se répètent, ce qui motive la programmation dynamique

Explication

Le calcul des plus longues sous-séquences communes de préfixes est réutilisé pour des préfixes plus grands : ce chevauchement des sous-problèmes motive la programmation dynamique. L’absence de recouvrement, la contiguïté et le tri ne sont pas les raisons invoquées.

50. Un nouvel objet est comparé à des objets de référence étiquetés ; parmi ses cinq voisins les plus proches, trois appartiennent à la catégorie A et deux à la catégorie B. Quelle catégorie lui attribue KNN ?

La catégorie A, majoritaire parmi les cinq voisins
La catégorie majoritaire dans toutes les données de référence
La catégorie du voisin de référence le plus proche
La catégorie B, minoritaire parmi les cinq voisins

La catégorie A, majoritaire parmi les cinq voisins

Explication

KNN attribue au nouvel objet la catégorie dominante parmi ses k voisins de référence les plus proches ; ici, A compte trois voisins sur cinq. Se fier au seul voisin le plus proche ou à la majorité de toute la base ne correspond pas à cette règle.

51. Pour classer un nouveau point, une équipe applique KNN. Quelle suite d’opérations correspond à l’algorithme ?

Déterminer la catégorie dominante de toute la base, puis calculer les distances et renvoyer cette catégorie
Calculer les distances, retenir les k indices les plus proches, puis renvoyer la catégorie dominante
Calculer les distances, retenir le voisin le plus proche, puis renvoyer sa catégorie
Calculer les distances, retenir les k indices les plus éloignés, puis renvoyer leur catégorie dominante

Calculer les distances, retenir les k indices les plus proches, puis renvoyer la catégorie dominante

Explication

KNN calcule les distances au nouveau point, conserve les indices des k points les plus proches, puis renvoie la catégorie dominante parmi eux. La majorité de toute la base, le choix des points les plus éloignés ou l’utilisation d’un seul voisin modifie cette procédure.

52. Dans une matrice de confusion construite à partir de données de test, que représentent les lignes et les colonnes ?

Les distances calculées en lignes et les catégories réelles en colonnes
Les catégories réelles en lignes et les catégories détectées en colonnes
Les effectifs détectés en lignes et les effectifs réels en colonnes
Les catégories détectées en lignes et les catégories réelles en colonnes

Les catégories détectées en lignes et les catégories réelles en colonnes

Explication

La matrice de confusion compare les catégories détectées par l’algorithme, placées en lignes, aux catégories réelles, placées en colonnes, pour les données de test. Inverser les axes ou remplacer une catégorie par un effectif ou une distance ne respecte pas cette définition.

53. Dans une étude où aucune catégorie de référence n’est fournie, quel type d’apprentissage les k-moyennes mettent-elles en œuvre ?

Un apprentissage supervisé qui classe les points selon des étiquettes connues
Un apprentissage non supervisé qui regroupe des points proches
Un apprentissage par renforcement fondé sur des récompenses
Une régression qui prédit une valeur continue pour chaque point

Un apprentissage non supervisé qui regroupe des points proches

Explication

Les k-moyennes regroupent des points proches sans catégories de référence : c’est un apprentissage non supervisé. Les étiquettes connues relèvent du supervisé, la prédiction continue de la régression et les récompenses du renforcement.

54. Après avoir choisi au hasard trois centres pour un ensemble de points, quelle suite d’opérations permet aux k-moyennes de poursuivre le regroupement ?

Affecter chaque point au centre le plus proche, recalculer les barycentres et répéter
Recalculer les barycentres, puis affecter chaque point au centre le plus proche une seule fois
Affecter les points au centre le plus proche, conserver les centres initiaux et arrêter
Affecter chaque point au centre le plus éloigné, recalculer les barycentres et répéter

Affecter chaque point au centre le plus proche, recalculer les barycentres et répéter

Explication

Après le choix initial des centres, l’algorithme affecte chaque donnée au centre le plus proche, recalcule les barycentres, puis répète ces étapes jusqu’à stabilisation. Recalculer avant l’affectation inverse l’ordre, le centre le plus éloigné inverse le critère, et conserver les centres initiaux omet la mise à jour.

55. Dans une base contenant les tables CLIENTS et PARTENAIRES, quelle requête SQL extrait les identifiants des clients dont la ville est Toulouse ?

SELECT email FROM CLIENTS WHERE ville = 'Toulouse';
SELECT id FROM CLIENTS WHERE ville = 'Toulouse';
SELECT id FROM CLIENTS WHERE partenaire = 'Toulouse';
SELECT id FROM PARTENAIRES WHERE ville = 'Toulouse';

SELECT id FROM CLIENTS WHERE ville = 'Toulouse';

Explication

Il faut sélectionner l’attribut id dans CLIENTS et filtrer cette table avec ville = 'Toulouse'. La table PARTENAIRES ne porte pas la ville, le filtre partenaire ne correspond pas au critère demandé et email n’est pas l’identifiant.

56. Pour obtenir les adresses électroniques des clients associés au partenaire SCEI, quelle opération SQL faut-il effectuer ?

Relier CLIENTS.id à PARTENAIRES.id_client, filtrer email sur SCEI et sélectionner partenaire
Filtrer CLIENTS.ville sur SCEI et sélectionner email sans relier les tables
Relier CLIENTS.id à PARTENAIRES.id_client, filtrer partenaire sur SCEI et sélectionner email
Relier CLIENTS.id à PARTENAIRES.id, filtrer partenaire sur SCEI et sélectionner email

Relier CLIENTS.id à PARTENAIRES.id_client, filtrer partenaire sur SCEI et sélectionner email

Explication

Les clients concernés se retrouvent en reliant CLIENTS.id à PARTENAIRES.id_client, puis en filtrant partenaire sur SCEI et en sélectionnant email. Omettre la liaison ne rattache pas les partenaires aux clients, id de PARTENAIRES est un identifiant de suivi, et SCEI est une valeur de partenaire, pas de ville ni d’adresse électronique.

57. Dans la table CLIENTS, quels attributs sont des chaînes de caractères, à l’exception de l’identifiant ?

nom, prenom, ville et email
id, nom, prenom et ville
nom, prenom, partenaire et email
id, ville, email et id_client

nom, prenom, ville et email

Explication

Dans CLIENTS, nom, prenom, ville et email sont des chaînes de caractères, tandis qu'id est un entier. Inclure id méconnaît son type, partenaire et id_client appartiennent à PARTENAIRES, et id_client n’est pas un attribut de CLIENTS.

58. Dans le schéma relationnel, quel rôle joue l’attribut id_client de la table PARTENAIRES ?

Il constitue la clé primaire de PARTENAIRES
Il correspond à l’attribut id de CLIENTS
Il correspond à l’attribut id de PARTENAIRES
Il contient le nom du partenaire associé au client

Il correspond à l’attribut id de CLIENTS

Explication

PARTENAIRES.id_client reprend l’identifiant id du client dans la table CLIENTS afin d’associer le partenaire au bon client. La clé primaire de PARTENAIRES est son propre id, tandis que partenaire contient le nom du partenaire.

Révisez avec les flashcards

Mémorisez les réponses avec 96 flashcards sur Graphes et programmation dynamique.

Qu’est-ce qu’une chaîne de caractères en Python ?

Une suite de caractères délimitée par des apostrophes ou des guillemets.

Pourquoi ne peut-on pas remplacer directement un caractère d’une chaîne Python ?

Les chaînes sont immuables.

Comment les opérateurs `and` et `or` évaluent-ils leurs opérandes ?

De gauche à droite, en s’arrêtant dès que le résultat est déterminé.

Voir les flashcards →

Approfondir avec la fiche

Consultez la fiche de révision complète sur Graphes et programmation dynamique.

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