Banque X-ÉNS 2023 MP-PC-PSI Informatique B Ca-1
Banque X-ÉNS 2023 MP-PC-PSI Informatique B Ca-1
Banque X-ÉNS 2023 MP-PC-PSI Informatique B Ca-1
Question 2. La fonction distance(texte1, texte2) a une complexité linéaire c'est à dire O(len(texte1)).
Question 4. Dans la fonction différentiel(texte1, texte2), lors du parcours simultané des textes le egalcar
signale si le caractère précédent correspondait à une tranche ou pas.
Si egalcar vaut True et que les caractères dièrent, on ouvre une nouvelle tranche.
Si egalcar vaut False et que les caractères sont égaux, on ferme la tranche courante.
À la n du parcours, on ferme la dernière tranche si egalcar vaut False.
La complexité de différentiel(texte1, texte2) est bien O(len(texte1)) car il y a une seule boucle et que
chaque tour de boucle s'eectue en temps constant (au plus 6 opérations élémentaires).
1/8
MP-PC-PSI Un corrigé d'informatique B (XELSR) 2023
def copie(texte) :
textcop =[]
n = len(texte)
for i in range(n) :
textcop.append(texte[i])
return textcop
2/8
MP-PC-PSI Un corrigé d'informatique B (XELSR) 2023
Question 6.Il sut d'inverser sur chaque tranche les valeurs des clés 'avant' et 'après'.
La complexité de inverse(diff) est O(len(diff)).
def inverse(diff) :
k = len(diff)
diffs = []
for i in range(k) :
tr = diff[i]
trs = tranche(début(tr), après(tr), avant(tr))
diffs.append(trs)
return diffs
def annule(texte_versionné) :
diff = historique(texte_versionné).pop()
texte = applique(courant(texte_versionné), inverse(diff))
# texte est le nouveau texte courant
remplace_courant(texte_versionné, texte)
return texte
Premier cas : Si texte1 [i] = texte2 [j], alors on a M[i + 1][j + 1] = M[i][j]
Deuxième cas : Sinon, on a : M[i + 1][j + 1] = 1 + min (M[i][j + 1], M[i + 1][j])
Pour le premier cas, la distance d'édition ne changera pas en ajoutant une même lettre située en dernière
position. Dans le deuxième cas, +1 correspond au rajout d'une dernière lettre. En eet, on rajoute un
caractère à un des textes distinct du dernier
( de l'autre de sorte que la distance d'édition entre texte1 [ :i+1]
1 + celle entre texte1 [ :i] et texte2 [ :j+1]
et texte2 [ :j+1] est le minimum de .
1 + celle entre texte1 [ :i+1] et texte2 [ :j]
3/8
MP-PC-PSI Un corrigé d'informatique B (XELSR) 2023
Question 10. On commence par écrire une fonction qui calcule le minimum pour deux arguments entiers.
On choisit une programmation dynamique de haut en bas.
Toutefois il s'agit de ne pas oublier les cas de base (coecients non donnés par la relation de récurrence). Ces
coecients de la forme M[i][0] ou M[0][j] valent i + j . Le coecient particulier M[0][0] = 0 est calculé deux fois
par la fonction interne pour calculcoef(0,0) et calculcoef(1,1) et c'est le seul.
def mini2(a,b) :
if a <b : return a
else : return b
4/8
MP-PC-PSI Un corrigé d'informatique B (XELSR) 2023
La seconde fonction consiste à parcourir la matrice M à l'envers en partant de la position (n, m) (n =len(texte1),
m =len(texte2)), on s'arrête en (0, 0). La variable sur_tranche est un booléen signalant qu'on remplit une
tranche ; on l'utilise de façon analogue à la question 4.
Si i > 0 et j > 0 et M[i][j] ̸∈ {M[i − 1][j] + 1, M[i][j − 1] + 1}, alors M[i][j] = M[i − 1][j − 1] et on se trouve pas
sur une tranche. Lors du déplacement correspondant, le coecient ne varie pas.
Sinon, on se retrouve sur une tranche et on remplit, à l'envers une des deux listes arg_avant ou bien arg_après.
Dans ce cas, le coecient varie de 1.
Ainsi à chaque étape, si le poids du diérentiel en devenir et le coecient correspondant de la matrice varie
simultanément et la variation est identique.
Ainsi le diérentiel calculé satisfait les propriétés attendues car son poids vaut la distance de Levenshtein
entre texte1 et texte2.
Le nombre d'opérations par tour de boucle est majoré par une constante auquel il faut ajouter les tailles des
listes arg_avant et arg_après. La somme des tailles de ces listes est majorée par n + m et il en est de même
pour la liste out. Les diérentes utilisations de la fonction inverse ont au total une complexité ⩽ n + m. Ainsi
la fonction différentiel(texte1, texte2, M) a une complexité O(len(texte1) + len(texte2)).
5/8
MP-PC-PSI Un corrigé d'informatique B (XELSR) 2023
Question 12. On utilise le fait que les tranches sont rangées dans l'ordre croissant des positions.
Le nombre de tours de boucles est majoré par (len(diff1) + len(diff1)). Chaque boucle s'eectue en temps
constant. La fonction conflit(diff1, diff2) a donc bien une complexité en O(len(diff1) + len(diff1)).
On remarque que la condition de non-conit de l'énoncé est un peut strict mais elle évite les ambiguïtés si la
liste avant(tr) est vide.
Question 13. La variable trans indique de combien translater les tranches de diff2.
6/8
MP-PC-PSI Un corrigé d'informatique B (XELSR) 2023
Hérédité sur j : Soit j ∈ [[0, m − 1]] tel que (0, j) se situe à une distance de M[0][j] = j de (0, 0).
Hérédité sur i : Soit i ∈ [[0, n − 1]] tel que pour tout j ∈ [[0, m]], (i, j) est distant de M[i][j] de (0, 0).
Initialisation sur On suppose j = 0.
j :
On peut montrer comme ci-dessus (pour les (0, j)) que la distance entre les sommets (0, 0) et (i + 1, 0)
est M[i + 1][0] = i + 1.
Hérédité sur j : Soit j ∈ [[0, m − 1]] tel que la distance de (i + 1, j) à (0, 0) vaut M[i + 1][j].
Si texte1[i] = texte2[j], alors le sommet (i+1, j+1) a trois prédécesseurs qui sont (i, j+1), (i+1, j)
et (i, j). Étant donné le poids des arêtes, la distance du sommet (i+1, j+1) à (0, 0) est alors le minimum
de l'ensemble
{M[i][j], 1 + M[i + 1][j], 1 + M[i][j + 1]}
Par construction de M, il s'agit bien de M[i][j] = M[i + 1][j + 1].
Si texte1[i] ̸= texte2[j], alors cette distance est bien
min {1 + M[i + 1][j], 1 + M[i][j + 1]} = M[i + 1][j + 1]
Conclusion sur j : Ainsi pour tout j ∈ [[0, m]], la distance de (i + 1, j) à (0, 0) est M[i + 1][j].
Conclusion sur i : Ainsi pour tout (i, j) ∈ [[0, n]] × [[0, m]], la distance de (i, j) à (0, 0) est M[i][j]
Voici la fonction successeurs(texte1, texte2, sommet) :
Question 15. L'algorithme de Dijkstra permet dans un graphe orienté pondéré de calculer la distance d'un sommet
source à un sommet but.
Ici le sommet source est origine et le but est sortie. Or cette distance est M[n][m] qui la distance d'édition
entre texte1 et texte2 .
Les clés du dictionnaire dist_final renvoyé est l'ensemble des sommets visités lors de l'execution de la fonction.
Cet ensemble est inclus dans la composante connexe du sommet entrée. Les valeurs dans dist_final sont les
distances des clés au sommet entrée .
7/8
MP-PC-PSI Un corrigé d'informatique B (XELSR) 2023
On ne voit pas bien son intérêt par rapport à l'algorithme de programmation dynamique de la partie II.
Toutefois on ne calcule pas toutes les distances comme dans l'algorithme de la partie II.
Question 17. Je propose la fonction h qui a une complexité en O(1).
Le parcours de (i, j) vers (n, m) comporte au maximum min(n − i, m − j) arêtes du types (ℓ, k) → (ℓ + 1, k + 1)
de poids 0.
Il y a donc au moins (n − i + m − j − 2 min(n − i, m − j)) arêtes de poids 1 empruntés pour aller du sommet
(i, j) vers le sommet (n, m).
Ainsi h(texte1, texte2, sommet) est un minorant de la distance entre le sommet sommet et le sommet sortie
du graphe.
La fonction h proposée est bien admissible.
Par Dijkstra, dist_final renvoyé est égal
8/8