Professional Documents
Culture Documents
Chap4 Applications Ajouté
Chap4 Applications Ajouté
YOUSSOU DIENG
PROBLÈME : LE TRI D’UNE SUITE DE N NOMBRES
03/11/2023
ANALYSE DU PROBLÈME
03/11/2023
COMMENT OBTENIR CE RÉSULTAT ? (TRAITEMENT)
03/11/2023
COMMENT OBTENIR CE RÉSULTAT ? (TRAITEMENT)
INSPIRATION …
¡ Méthode diviser-pour-régner
03/11/2023
COMMENT OBTENIR CE RÉSULTAT ? (TRAITEMENT)
ANALYSE DE LA MÉTHODE DIVISER POUR RÉGNER
¡ Combiner/Fusionner
les deux sous-suites
triées pour produire la
réponse triée.
5 2 4 7 1 3 2 6
¡ Combiner/Fusionner
les deux sous-suites
triées pour produire la 2 5 4 7 1 3 2 6
réponse triée.
5 2 4 7 1 3 2 6
2 4 5 7 1 2 3 6
¡ Combiner/Fusionner
les deux sous-suites
triées pour produire la 2 5 4 7 1 3 2 6
réponse triée.
5 2 4 7 1 3 2 6
2 4 5 7 1 2 3 6
¡ Combiner/Fusionner
les deux sous-suites
triées pour produire la 2 5 4 7 1 3 2 6
réponse triée.
5 2 4 7 1 3 2 6
¡ Problème :
Combiner/Fusionner 2 4 5 7 1 2 3 6
03/11/2023
piles R
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 0 0 0 0 0 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 0 0 0 0 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 0 0 0 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 0 0 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 0 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 4 0 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 4 5 0 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 4 5 6 0 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 4 5 6 7 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
épuisement de l’une des piles A et
B.
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMMENT FAIRE LA FUSION ? (TRAITEMENT)
COMMENT UTILISER CETTE MÉTHODE POUR LA FUSION?
1 2 3 4 5 6 7 8
¡ Choisir la plus faible des deux cartes R … 1 2 2 3 4 5 6 7 …
occupant les sommets respectifs des k
deux piles A et B :
1 2 3 4 1 2 3 4
¡ Retirer la carte de sa pile, puis +∞
A 2 4 5 7 B 1 2 3 6
placer la à l’envers sur la pile
i j
résultat R.
¡ Répéter cette étape jusqu’à
Comment implémenter une Pile vide?
épuisement de l’une des piles A et
B. Placer en bas de chaque pile une carte sentinelle
(une valeur spéciale) pour ne pas vérifier à
¡ Il suffit alors de prendre la pile qui
reste (A ou B ) et de la placer à chaque fois si l’une des piles est vide.
l’envers sur la pile résultat R.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
COMPLEXITÉ
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié . » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
¡ ligne 1 : calcule la longueur n1 du sous-tableau A[p..q]
2. n2 ← 𝑟 − 𝑞
¡ Ligne 2: calcule la longueur n2 du sous-tableau A[q + 1..r]
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1]
¡ ligne 3 : crée des tableaux L et R de longueurs n1 + 1 et n2 + 1, 4. Pour i ← 1 à n1
respectivement 5. Faire L[i] ← A[p + i - 1]
¡ lignes 4–5 : La boucle pour copie le sous-tableau A[p . . q] 6. Pour j ← 1 à n2
dans L[1 . . n1] 7. Faire R[j] ← A[p + j]
¡ lignes 6–7 : La boucle pour copie le sous-tableau A[q + 1. . r] 8. L[n1 + 1] ← +∞
dans R[1 . . n2]. 9. L[n2 + 1] ← +∞
¡ lignes 8–9 : placent les sentinelles aux extrémités des tableaux 10. i ← 1
L et R. 11. j ← 1
12. Pour k ← p à r
¡ lignes 10–17 : effectuent les r − p + 1 étapes en conservant
l’invariant de boucle que voici : « Au début de chaque itération 13. Faire si L[i] ≤ R[j]
de la boucle pour des lignes 12–17, le sous-tableau A[p . . k − 14. alors 𝐴 𝑘 ← L[i]
1] contient les k − p plus petits éléments de L[1 . . n 1 + 1] et 15. i←𝑖+1
R[1 . . n 2 + 1], en ordre trié. » 16. sinon 𝐴 𝑘 ← R[j]
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
Fusion ( A, p, q, r)
1. n1 ← 𝑝 − 𝑞 + 1
Correction
2. n2 ← 𝑟 − 𝑞
3. Créer tableaux L[1, …, n1] et R[1, …, n2+1] • Initialisation : Montrer que
4. Pour i ← 1 à n1 l’invariant est vrai avant la première
5. Faire L[i] ← A[p + i - 1]
itération de la boucle pour (lignes
6. Pour j ← 1 à n2
12–17).
7. Faire R[j] ← A[p + j]
8. L[n1 + 1] ← +∞
• Conservation : Montrer que chaque
9. L[n2 + 1] ← +∞
itération de la boucle conserve
10. i ← 1 l’invariant.
11. j ← 1 • Terminaison : Montrer que
12. Pour k ← p à r l’invariant fournit une propriété utile
13. Faire si L[i] ≤ R[j]
pour prouver la conformité de la
alors 𝐴 𝑘 ← L[i]
14.
procédure quand la boucle se
15. i←𝑖+1
16. sinon 𝐴 𝑘 ← R[j]
termine.
YOUSSOU DIENG (YDIENG@UNIV-ZIG.SN)
17. j ← j +1
¡ Initialisation:
¡ Avant la première itération de la boucle, on a k = p, et le sous-tableau A[p . . k − 1]
est vide. Il contient les k − p = 0 plus petits éléments de L et R ; et, comme i = j =
1, L[i] et R[j] sont les plus petits éléments de leurs tableaux à ne pas avoir été
copiés dans A.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 2 4 5 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
8 9 10 11 12 13 14 15 16 17
A… 2 4 5 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
¡ Si on supposons que L[i] ≤ R[j] alors L[i] est le plus petit élément qui n’a pas encore été
copié dans A. Comme A[p . . k−1] contient les k−p plus petits éléments, alors après que la
ligne 14 a copié L[i] dans A[k], le sous-tableau A[p . . k] contient les k−p+1 plus petits
éléments. Incrémenter k, dans l’actualisation de la boucle pour et i (en ligne 15) recrée
l’invariant pour l’itération suivante. Si l’on a L[i] > R[j], alors les lignes 16–17 font l’action idoine
pour conserver l’invariant.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 1 2 5 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
¡ Si on supposons que L[i] ≤ R[j] alors L[i] est le plus petit élément qui n’a pas encore été
copié dans A. Comme A[p . . k−1] contient les k−p plus petits éléments, alors après que la
ligne 14 a copié L[i] dans A[k], le sous-tableau A[p . . k] contient les k−p+1 plus petits
éléments. Incrémenter k, dans l’actualisation de la boucle pour et i (en ligne 15) recrée
l’invariant pour l’itération suivante. Si l’on a L[i] > R[j], alors les lignes 16–17 font l’action idoine
pour conserver l’invariant.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 1 2 5 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
¡ Si on supposons que L[i] ≤ R[j] alors L[i] est le plus petit élément qui n’a pas encore été
copié dans A. Comme A[p . . k−1] contient les k−p plus petits éléments, alors après que la
ligne 14 a copié L[i] dans A[k], le sous-tableau A[p . . k] contient les k−p+1 plus petits
éléments. Incrémenter k, dans l’actualisation de la boucle pour et i (en ligne 15) recrée
l’invariant pour l’itération suivante. Si l’on a L[i] > R[j], alors les lignes 16–17 font l’action idoine
pour conserver l’invariant.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 1 2 2 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
¡ Si on supposons que L[i] ≤ R[j] alors L[i] est le plus petit élément qui n’a pas encore été
copié dans A. Comme A[p . . k−1] contient les k−p plus petits éléments, alors après que la
ligne 14 a copié L[i] dans A[k], le sous-tableau A[p . . k] contient les k−p+1 plus petits
éléments. Incrémenter k, dans l’actualisation de la boucle pour et i (en ligne 15) recrée
l’invariant pour l’itération suivante. Si l’on a L[i] > R[j], alors les lignes 16–17 font l’action idoine
pour conserver l’invariant.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 1 2 2 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
¡ Si on supposons que L[i] ≤ R[j] alors L[i] est le plus petit élément qui n’a pas encore été
copié dans A. Comme A[p . . k−1] contient les k−p plus petits éléments, alors après que la
ligne 14 a copié L[i] dans A[k], le sous-tableau A[p . . k] contient les k−p+1 plus petits
éléments. Incrémenter k, dans l’actualisation de la boucle pour et i (en ligne 15) recrée
l’invariant pour l’itération suivante. Si l’on a L[i] > R[j], alors les lignes 16–17 font l’action idoine
pour conserver l’invariant.
𝑞
𝑝 𝑟
8 9 10 11 12 13 14 15 16 17
A… 2 4 5 7 1 2 3 6 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
8 9 10 11 12 13 14 15 16 17
A… 1 2 2 3 4 5 6 7 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
8 9 10 11 12 13 14 15 16 17
A… 1 2 2 3 4 5 6 7 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
8 9 10 11 12 13 14 15 16 17
A… 1 2 2 3 4 5 6 7 …
k
1 2 3 4 5 1 2 3 4 5
L 2 4 5 7 ∞ R 1 2 3 6 ∞
i j
Tri-Fusion ( A, p, r)
1. Si p < 𝑟
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q)
4. Tri-Fusion (A, q+1, r)
5. Fusion (A, p, q, r)
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q)
4. Tri-Fusion (A, q+1, r)
5. Fusion (A, p, q, r)
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q)
4. Tri-Fusion (A, q+1, r)
5. Fusion (A, p, q, r)
2. Alors q ← (𝑝 + 𝑟)/2
𝑟1 = 𝑞0
3. Tri-Fusion (A, p, q) 𝑝1 = 𝑞 + 1
2. Alors q ← (𝑝 + 𝑟)/2
𝑟1 = 𝑞0
3. Tri-Fusion (A, p, q) 𝑝1 = 𝑞 + 1
2. Alors q ← (𝑝 + 𝑟)/2
𝑟1 = 𝑞0
3. Tri-Fusion (A, p, q) 𝑝1 = 𝑞 + 1
𝑞1 = 2
4. Tri-Fusion (A, q+1, r)
5. Fusion (A, p, q, r)
2. Alors q ← (𝑝 + 𝑟)/2
𝑟1 = 𝑞0
3. Tri-Fusion (A, p, q) 𝑝1 = 𝑞 + 1
𝑞1 = 2
4. Tri-Fusion (A, q+1, r)
5. Fusion (A, p, q, r)
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 5 2 4 7 1 3 2 6
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 5 2 4 7 1 3 2 6
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 5 2 4 7 1 3 2 6
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 5 2 4 7 1 3 2 6
Tri-Fusion ( A, p, r)
1. Si p < 𝑟
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q)
4. Tri-Fusion (A, q+1, r)
5 2 4 7 1 3 2 6
5. Fusion (A, p, q, r)
Tri-Fusion ( A, p, r)
1. Si p < 𝑟
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 2 5
Tri-Fusion ( A, p, r)
1. Si p < 𝑟
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 2 5 4 7 1 3 2 6
Tri-Fusion ( A, p, r)
1. Si p < 𝑟 2 4 5 7 1 2 3 6
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 2 5 4 7 1 3 2 6
2. Alors q ← (𝑝 + 𝑟)/2
3. Tri-Fusion (A, p, q) 2 5 4 7 1 3 2 6
Comme
¡ le temps d’exécution tri par fusion est T(n)= Θ (nlog2 n) et que
¡ le tri par insertion a un temps d’exécution qui vaut Θ (n2),
on dira que tri par fusion est meilleur que le tri par
insertion.
03/11/2023
FEUILLE DE TD 3
¡ 2.2.3 On considère une fois de plus la recherche linéaire (voir exercice 2.1.3). Combien d’éléments de la séquence
d’entrée doit-on tester en moyenne, si l’on suppose que l’élément recherché a une probabilité égale d’être l’un
quelconque des éléments du tableau ? Et dans le cas le plus défavorable ? Quels sont les temps d’exécution du cas
moyen et du cas le plus défavorable, exprimés avec la notation Θ? Justifier les réponses.
¡ 2.2.4 Comment modifier la plupart des algorithmes pour qu’ils aient un bon temps d’exécution dans le cas le plus
favorable ?
03/11/2023
2.3.1 EN S’INSPIRANT DE LA FIGURE SUIVANTE, ILLUSTRER LE FONCTIONNEMENT DU TRI PAR
FUSION SUR LE TABLEAU A = « 3, 41, 52, 26, 38, 57, 9, 49 ».
03/11/2023
¡ 2.3.2 Réécrire la procédure FUSION de telle sorte qu’elle n’emploie
pas de sentinelles mais qu’à la place elle s’arrête quand l’un des deux
tableaux L et R a eu tous ses éléments copiés dans A, en copiant alors
le reste de l’autre tableau dans A.
03/11/2023
¡ Pour k := p à r faire
¡ Si i ≤ 𝑛1 𝑒𝑡 𝑗 ≤ 𝑛2 alors
¡ si L[i] ≤ R[j] alors
¡ A[k]:= L[i]
¡ i := i+1
¡ sinon A[k]:= R[j]
¡ j:=j+1
¡ FINSI
¡ Sinon si i ≤ 𝑛1 alors
¡ A[k]:= L[i]
¡ i := i+1
Sinon si 𝑗 ≤ 𝑛2 alors
¡ A[k]:= R[j]
¡ j:=j+1
¡ Finsi
¡ Finsi
¡ Finsi
¡ Fin 03/11/2023
¡ 2.3.5 En reprenant le problème de la recherche (voir Algorithme Recherche_Dichotomique (v: entier, A: Tableau d’entier, q, r : entier)
exercice 2.1.3), observez que, si la séquence A est j : entier
triée, on peut comparer le milieu de la séquence avec v Debut
et supprimer la moitié de la séquence pour la suite des Si q < 𝒓 alors
opérations. retouner NIL
Sinon si q = r et A[r] = v alors
La recherche dichotomique est un algorithme qui répète
retourner r
cette procédure, en divisant par deux à chaque fois la taille
sinon si q = r et A[r] ≠ v alors
de la partie restante de la séquence.
retourer NIL
1. Écrire le pseudo code, itératif ou récursif, de la sinon
recherche dichotomique. j:= (r-q+1)/2
si A[j] = v alors
2. Expliquer pourquoi le temps d’exécution de la
retourner j
recherche dichotomique, dans le cas le plus
Sinon si A[j] < v alors
défavorable, est Θ (lg n).
Recherche_Dichotomique (v, A, j+1, r)
Sinon
Recherche_Dichotomique (v, A, q, j-1)
Finsi
Finsi
Finsi
FIN
03/11/2023