Correction du sujet 0 de NSI
Exercice 1
Question 1
La pile Q va contenir :
Question 2
1. def hauteur_pile(P):
Q = creer_pile_vide() n = 0
while not(est_vide(P)):
n = n + 1 x = depiler(P) empiler(Q, x)
while not(est_vide(Q)):
x = depiler(Q) empiler(P, x) return n
2. Puisqu’on a empilé au moins i entiers, on peut dépiler i fois sans crainte.
def max_pile(P, i):
Q = creer_pile_vide() x = depiler(P)
empiler(Q, x) j = 1
maxi = x
for k in range(i-1):
x = depiler(P) empiler(Q, x) if x > maxi:
j = k + 2 # en effet k = 0 correspond au deuxième élément maxi = x
while not est_vide(Q):
x = depiler(Q) empiler(P, x) return j
Remarque : ma fonction ne fonctionne pas avec i = 0, mais l’énoncé ne précise pas ce qui est attendu dans ce cas. On peut rajouter if i ==0 : return en début de fonction pour éviter les plantages.
8 5 2 4
Question 3
def retourner(P, j):
Q = creer_pile_vide() R = creer_pile_vide() for i in range(j):
empiler(Q, depiler(P)) for i in range(j):
empiler(R, depiler(Q)) for i in range(j):
empiler(P, depiler(R)) Question 4
def tri_crepes(P):
n = hauteur_pile(P) for i in range(n, 1, -1):
j = max_pile(P, i) retourner(P, j) retourner(P, i)
Exercice 2
Question 1
1. Un tel chemin comprend 2 déplacements vers le bas.
2. Tous les chemins allant de (0, 0) à (2, 3) comprennent 5 déplacements (3 vers la droite, 2 vers le bas), donc 6 cases (la case initiale et une nouvelle case après chaque déplacement). Ils sont donc de longueur 6.
Question 2
Chemins possibles : 4 1 1 3 1 1 → 11 4 1 1 2 1 1 → 10 4 1 1 2 5 1 → 14 4 1 0 2 1 1 → 9 4 1 0 2 5 1 → 13 4 1 0 1 5 1 → 12 4 2 0 2 1 1 → 10 4 2 0 2 5 1 → 14 4 2 0 1 5 1 → 13 4 2 3 1 5 1 → 16
Le chemin qui permet d’obtenir la somme maximale est 4 2 3 1 5 1. Cette somme est égale à 16.
Question 3 1.
2. Pour atteindre la case (0, j) du tableau T, on vient forcément de la case (0, j-1).
Donc T’[0][j] = T[0][j] + T’[0][j-1].
Question 4
Pour atteindre la case (i, j) du tableau T, on vient soit de la case (i-1, j), soit de la case (i, j-1).
4 5 6 9 6 6 8 10 9 10 15 16
Ainsi, la somme maximale allant de (0, 0) à (i, j) s’obtient soit en passant par (i-1, j), auquel cas elle est égale à T[i][j] + T’[i-1][j], soit en passant par (i, j-1), auquel cas elle est égale à T[i][j] + T’[i][j-1].
D’où, T’[i][j] = max(T[i][j] + T’[i-1][j], T[i][j] + T’[i][j-1]) = T[i][j] + max(T’[i-1][j], T’[i][j-1]).
Question 5
1. Le cas de base est le cas : i==0 et j==0. Il renvoie T[0][0].
2. def somme_max(T, i, j):
if i==0 and j==0:
return T[0][0]
elif i==0:
return T[0][j] + somme_max(T, 0, j-1) elif j==0:
return T[i][0] + somme_max(T, i-1, 0) else:
return T[i][j] + max(somme_max(T, i-1, j), somme_max(T, i, j-1)) 3. Pour résoudre le problème initial, on appelle somme_max(T, 2, 3).
Exercice 3
Question 1
La taille de l’arbre est 9 (nombre de nœuds), sa hauteur est 4.
Puisque le sujet définit la hauteur d’un arbre avec un seul nœud comme égale à 1, on prend comme définition de la hauteur le nombre de niveaux. Ce n’est pas la définition la plus courante.
Question 2
1. D est associé à 101 et G à 1010.
2. 13 = 8 + 4 + 1 = (1101)2 C’est le numéro du nœud I.
3. Avec un niveau, les nœuds les plus bas sont numérotés sur 1 bit (un seul nœud).
Avec deux niveaux, sur deux bits, trois niveaux sur trois bits…
Avec h niveaux, ce qui correspond à un arbre de hauteur h en utilisant la convention du sujet, les nœuds les plus bas sont numérotés sur h bits.
4. Au minimum, l’arbre a un nœud par niveau (arbre filiforme), h ≤ n.
Les nœuds sont numérotés en binaire. Le nombre maximal de nœuds n correspond au plus grand numéro possible sur h bits. Il est égal à (11…1)2 = 2h – 1.
D’où h ≤ n ≤ 2h – 1.
Question 3
1. 15 A B C D E F G H I J K L M N O
2. Un nœud d’indice i a pour père le nœud d’indice j tel que i = 2 × j ou i = 2 × j + 1.
Si i est pair, on a j = i/2 et si i est impair, j = (i – 1)/2.
Dans les deux cas, l’indice du père du nœud d’indice i est i//2.
Question 4
Il me semble évident qu’on attende une recherche utilisant les spécificités de l’ABR plutôt qu’un simple parcours du tableau du type :
def recherche(arbre, element):
return element in arbre[1:]
Solution attendue :
def recherche(arbre, element):
n = arbre[0]
i = 1
while i <= n:
if arbre[i] == element:
return True
elif element < arbre[i]:
i = 2*i else:
i = 2*i + 1 return False
Exercice 4
Erreur dans l’énoncé : il est écrit que num_eleve est un entier alors que num_eleve comporte des lettres dans le tableau.
Question 1
1. num_eleve est une clé primaire et permet d’identifier chaque enregistrement de la table de manière unique.
2. INSERT INTO seconde
VALUES('133310FE', 'anglais', 'espagnol', NULL, '2A') 3. UPDATE seconde SET langue1 = 'allemand'
WHERE num_eleve = '156929JJ' Question 2
1. Cette requête renvoie la première colonne de la figure 1.
2. Le résultat renvoyé est 30 (nombre de lignes).
3. SELECT COUNT(*) FROM seconde
WHERE langue1 = 'allemand' OR langue2 = 'allemand' Question 3
1. num_eleve, clé primaire de la table eleve, est une clé étrangère de la table seconde. Cela signifie que :
• on ne pourra pas entrer dans la table seconde un identifiant num_eleve qui n’est pas dans la table eleve
• on ne pourra pas effacer un élève de la table eleve s’il apparait dans la table seconde 2. SELECT nom, prenom, datenaissance FROM eleve
JOIN seconde USING (num_eleve) WHERE classe = '2A'
Question 4
Les attributs sont des chaines de caractères (CHAR), y compris le code postal car un type entier ne mémoriserait pas le 0 dans 02800 par exemple.
La jointure s’effectue avec les autres tables en utilisant la clé primaire num_eleve.
coordonnees
num_eleve (clé primaire) adresse
code_postal ville
adresse_mail
Exercice 5
Question 1
1. D’après la table de routage du routeur A, le paquet doit être d’abord envoyé au routeur C. La table de routage du routeur C indique qu’il faut l’envoyer au routeur F. Le routeur F envoie directement le paquet au routeur G. D’où le trajet : A – C – F – G.
2. On commence par compléter les destinations accessibles en un saut (deux dernières lignes), puis en deux sauts, … Pour les destinations A et C, on peut passer indifféremment par E ou F.
Table de routage du routeur G Destination Routeur suivant Distance
A F 3
B E 3
C F 2
D E 2
E E 1
F F 1
Question 2
Même démarche qu’à la question précédente.
Table de routage du routeur A Destination Routeur suivant Distance
B B 1
D D 1
E D 2
F D 4
G D 3
Question 3 1. 10×10108 9= 0,01
Le coût de la liaison entre les routeurs A et B est bien égal à 0,01.
2. 5 =10𝑑𝑑8 donne 𝑑𝑑 =1058 = 20 × 106
Le débit de la liaison entre B et D est de 20 Mb/s.
Question 4
On calcule les coûts de toutes les liaisons et on les reporte sur le graphe du réseau.
Ensuite, on peut voir rapidement que le chemin le moins couteux est : A – D – E – G avec un coût de 1,011.
A B
C D
F E
G
0,01 0,01 5
0,001 10
1
1 1
2
En effet, si on passe par C au départ de A, le coût est déjà de 10.
On passe donc par D. La liaison directe est moins couteuse que la liaison via B.
Depuis D, on rejoint inévitablement E.
Ensuite, on vérifie que la liaison E – G est moins couteuse que E – C – F – G.
Autre méthode : algorithme de Dijkstra.
Étape
précédente A B C D E F G
0 ∞ ∞ ∞ ∞ ∞ ∞
A(0) 0,01 10 0,01 ∞ ∞ ∞
B(0,01) 10 0,01 ∞ ∞ ∞
D(0,01) 10 0,011 ∞ ∞
E(0,011) 2,011 ∞ 1,011
G(1,011)
(inutile de continuer)