Benjamin Wack
2020 – 2021
1 / 31
Algorithmique et Analyse d’Algorithmes
La dernière fois
I Qu’est-ce qu’un algorithme
I Notion de coût
I Notions de complexité (au pire) et ordres de grandeur
Aujourd’hui
I Comment écrire un algorithme récursif ?
I Comment évaluer son coût ?
2 / 31
Algorithmique et Analyse d’Algorithmes
Plan
Algorithme récursif
Schémas récursifs
Analyse de coût
Analyse en moyenne
Contexte
Méthode
Tri rapide
3 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Plan
Algorithme récursif
Schémas récursifs
Analyse de coût
Analyse en moyenne
Contexte
Méthode
Tri rapide
4 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
5 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
5 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Structure
Prérequis
I Savoir directement résoudre le problème sur des cas de base
I Savoir utiliser une (ou des) instances plus petites pour résoudre le
problème
« plus petit » = entier inférieur, sous-arbre, liste plus courte... mais pas
seulement
6 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Structure
Prérequis
I Savoir directement résoudre le problème sur des cas de base
I Savoir utiliser une (ou des) instances plus petites pour résoudre le
problème
« plus petit » = entier inférieur, sous-arbre, liste plus courte... mais pas
seulement
PAIR(n)
Données : un entier n
Résultat : booléen « n est-il pair ? »
if n = 0
return Vrai
else
return PAIR(n − 2)
6 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Structure
Prérequis
I Savoir directement résoudre le problème sur des cas de base
I Savoir utiliser une (ou des) instances plus petites pour résoudre le
problème
« plus petit » = entier inférieur, sous-arbre, liste plus courte... mais pas
seulement
PAIR(n)
Données : un entier n
Résultat : booléen « n est-il pair ? »
if n = 0
return Vrai
else
return PAIR(n − 2)
3+2+2+2+2+3
3+3+3+2+3
Exemples pour n = 14
7 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Analyse du problème
8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Analyse du problème
I Données :
8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Analyse du problème
I Données :
la longueur n du mur (les tailles des briques sont fixées)
(la récursivité ne peut donc porter que sur n)
I Utilisation de sous-problèmes :
8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Analyse du problème
I Données :
la longueur n du mur (les tailles des briques sont fixées)
(la récursivité ne peut donc porter que sur n)
I Utilisation de sous-problèmes :
Une fois la première brique posée il reste un mur de longueur < n.
I Reconstruction de la solution :
8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Analyse du problème
I Données :
la longueur n du mur (les tailles des briques sont fixées)
(la récursivité ne peut donc porter que sur n)
I Utilisation de sous-problèmes :
Une fois la première brique posée il reste un mur de longueur < n.
I Reconstruction de la solution : Les arrangements de longueur n
= ceux commençant par une brique de longueur 2
+ ceux commençant par une brique de longueur 3
I Cas de base :
8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Analyse du problème
I Données :
la longueur n du mur (les tailles des briques sont fixées)
(la récursivité ne peut donc porter que sur n)
I Utilisation de sous-problèmes :
Une fois la première brique posée il reste un mur de longueur < n.
I Reconstruction de la solution : Les arrangements de longueur n
= ceux commençant par une brique de longueur 2
+ ceux commençant par une brique de longueur 3
I Cas de base : n = 1 impossible ; pour n = 2 ou 3 un seul choix.
8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Analyse du problème
I Données :
la longueur n du mur (les tailles des briques sont fixées)
(la récursivité ne peut donc porter que sur n)
I Utilisation de sous-problèmes :
Une fois la première brique posée il reste un mur de longueur < n.
I Reconstruction de la solution : Les arrangements de longueur n
= ceux commençant par une brique de longueur 2
+ ceux commençant par une brique de longueur 3
I Cas de base : n = 1 impossible ; pour n = 2 ou 3 un seul choix.
BRIQUES(n)
if n = 1
return 0
else if n = 2 ou n = 3
return 1
else
return BRIQUES(n − 2) + BRIQUES(n − 3)
8 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Spécification
Étant donné un entier n, on cherche à produire à l’écran l’écriture binaire
de n.
Idée
On sait que :
I n % 2 donne le dernier bit
I les bits les plus à gauche sont aussi ceux de n/2.
9 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Spécification
Étant donné un entier n, on cherche à produire à l’écran l’écriture binaire
de n.
Idée
On sait que :
I n % 2 donne le dernier bit
I les bits les plus à gauche sont aussi ceux de n/2.
Remarque
Le problème ne se résout pas naturellement de manière impérative : il
faut « commencer par la fin ».
9 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Structure récursive
I Les cas n = 0 et n = 1 sont connus.
I On sait résoudre le problème si on a résolu l’instance n/2.
10 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Structure récursive
I Les cas n = 0 et n = 1 sont connus.
I On sait résoudre le problème si on a résolu l’instance n/2.
10 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Schémas récursifs
Structure récursive
I Les cas n = 0 et n = 1 sont connus.
I On sait résoudre le problème si on a résolu l’instance n/2.
Plan
Algorithme récursif
Schémas récursifs
Analyse de coût
Analyse en moyenne
Contexte
Méthode
Tri rapide
11 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
Calcul de la factorielle
FACT(n)
if n = 0
return 1
return n × FACT (n − 1)
12 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
Calcul de la factorielle
FACT(n)
if n = 0
return 1
return n × FACT (n − 1)
ß
CFACT (0) = 0
D’où
CFACT (n) = 2 + CFACT (n − 1)
12 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
Calcul de la factorielle
FACT(n)
if n = 0
return 1
return n × FACT (n − 1)
ß
CFACT (0) = 0
D’où
CFACT (n) = 2 + CFACT (n − 1)
La fonction de coût d’un algorithme récursif obéit généralement
elle-même à une équation récursive.
12 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
13 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
13 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
En particulier
Pn Pn n(n+1)
i=1 1 = n = O(n) ; i=1 i= 2 = O(n2 )
Pn
et de manière plus générale i=1 i k = O(nk+1 ).
13 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
14 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
C (n) = a1 C (n − 1) + a2 C (n − 2) + . . . ak C (n − k)
C (n) = O(nk−1 λn ).
14 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
Cas particuliers
Calcul de coût direct
Il est parfois possible de donner directement le coût.
Ex : l’algorithme d’écriture binaire effectue clairement blog2 (n)c divisions.
15 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
Cas particuliers
Calcul de coût direct
Il est parfois possible de donner directement le coût.
Ex : l’algorithme d’écriture binaire effectue clairement blog2 (n)c divisions.
A(n) B(n)
if n = 0 if n = 0
return 1 return 1
else else
return A(n-1) + A(n-1) + 1 return 2×B(n-1) + 1
I mathématiquement équivalents
I algorithmiquement très différents
15 / 31
Algorithmique et Analyse d’Algorithmes
Algorithme récursif
Analyse de coût
PGCD
SOUSTRACTIONS (a, b)
Données : Deux entiers a et b non nuls
Résultat : Le plus grand diviseur commun à a et b
if a = b
return a
else if a > b
return SOUSTRACTIONS (a − b, b)
else
return SOUSTRACTIONS (b, a)
16 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Contexte
Plan
Algorithme récursif
Schémas récursifs
Analyse de coût
Analyse en moyenne
Contexte
Méthode
Tri rapide
17 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Contexte
Motivation
Recherche séquentielle en table
RECH_SEQ(e, T , n)
Données : l’élément e à rechercher, un tableau T de taille n
Résultat : le premier indice i tel que T [i] = e, ou −1 s’il est absent
i =0
while i < n et puis T [i] 6= e
i =i +1
if i < n
return i
else
return −1
18 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Contexte
Motivation
Recherche séquentielle en table
RECH_SEQ(e, T , n)
Données : l’élément e à rechercher, un tableau T de taille n
Résultat : le premier indice i tel que T [i] = e, ou −1 s’il est absent
i =0
while i < n et puis T [i] 6= e
i =i +1
if i < n
return i
else
return −1
Complexité au pire
I la boucle while ne peut pas faire plus de n comparaisons
I pire cas facile à exhiber : e absent de T ou en dernière position
D’où CRECH_SEQ (n) = O(n)
18 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Contexte
Plus finement
19 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Contexte
Plus finement
19 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode
Plan
Algorithme récursif
Schémas récursifs
Analyse de coût
Analyse en moyenne
Contexte
Méthode
Tri rapide
20 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode
21 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode
21 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode
C moy (n) =
P
(Proba que l’entrée soit d) × (coût de l’algo sur d)
données d de taille n
21 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode
22 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode
= (1 − p)n + p n+1
2
moy n+1
En particulier si p = 1 on a CRECH_SEQ (n) = 2
22 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode
En pratique
I L’analyse au pire et au mieux donne déjà des informations sur la
complexité moyenne :
23 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode
En pratique
I L’analyse au pire et au mieux donne déjà des informations sur la
complexité moyenne :
23 / 31
Algorithmique et Analyse d’Algorithmes
Analyse en moyenne
Méthode
En pratique
I L’analyse au pire et au mieux donne déjà des informations sur la
complexité moyenne :
23 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Plan
Algorithme récursif
Schémas récursifs
Analyse de coût
Analyse en moyenne
Contexte
Méthode
Tri rapide
24 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Le tri rapide
25 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Le tri rapide
Quelques caractéristiques
I fondamentalement récursif
I en place (pas besoin de tableau auxiliaire)
I non stable (les éléments « égaux » ne conservent pas leur ordre
initial)
25 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Principe général
D A E C B F
26 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Principe général
D A E C B F
26 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Principe général
D A E C B F
26 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Principe général
D A E C B F
26 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Schéma de l’algorithme
TriSegmentation (E )
Donnée-résultat Un ensemble E de n éléments comparables
Effet de bord E est trié par ordre croissant
6 ∅
if E =
pivot := Extrait (E )
// retire l’élément pivot de E
(E1 , E2 ) := Segmentation (E,pivot)
// E1 éléments plus petits que pivot
// E2 éléments plus grands que pivot
Assemble ( TriSegmentation (E1 ), pivot, TriSegmentation (E2 ))
27 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Schéma de l’algorithme
TriSegmentation (E )
Donnée-résultat Un ensemble E de n éléments comparables
Effet de bord E est trié par ordre croissant
6 ∅
if E =
pivot := Extrait (E )
// retire l’élément pivot de E
(E1 , E2 ) := Segmentation (E,pivot)
// E1 éléments plus petits que pivot
// E2 éléments plus grands que pivot
Assemble ( TriSegmentation (E1 ), pivot, TriSegmentation (E2 ))
27 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Conception récursive
28 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Conception récursive
TriSegmentation (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Effet de bord T est trié par ordre croissant entre les indices g et d
if g < d
pivot := T [g]
Partition (T , g, d, pivot)
TriSegmentation (T , g, ?)
TriSegmentation (T , ?, d)
28 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Conception récursive
TriSegmentation (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Effet de bord T est trié par ordre croissant entre les indices g et d
if g < d
pivot := T [g]
i :=Partition (T , g, d, pivot)
TriSegmentation (T , g, i − 1)
TriSegmentation (T , i + 1, d)
28 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while
if
else
return i
29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while
if T [i + 1] ≤ T [g]
else
return i
29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while
if T [i + 1] ≤ T [g]
i =i +1
else
return i
29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while
if T [i + 1] ≤ T [g]
i =i +1
else
Échanger T [d] et T [i + 1]
d =d −1
return i
29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while i < d
if T [i + 1] ≤ T [g]
i =i +1
else
Échanger T [d] et T [i + 1]
d =d −1
return i
29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
La procédure Partition
Partition (T , g, d)
Donnée-résultat Un tableau T d’éléments comparables
Résultat : L’indice i de pivot correctement placé dans le tableau
Effet de bord Les éléments de T entre les indices :
I g et i − 1 sont tous inférieurs à pivot.
I i + 1 et d sont tous supérieurs à pivot.
i =g
while i < d
if T [i + 1] ≤ T [g]
i =i +1
else
Échanger T [d] et T [i + 1]
d =d −1
Échanger T [g] et T [i]
return i
29 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Éléments de complexité
I La taille des données est ici d − g
(taille de la portion de tableau manipulée)
I Partition a un coût linéaire en d − g.
I Coût d’évaluation des paramètres constant
donc négligeable devant d − g
30 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Éléments de complexité
I La taille des données est ici d − g
(taille de la portion de tableau manipulée)
I Partition a un coût linéaire en d − g.
I Coût d’évaluation des paramètres constant
donc négligeable devant d − g
I D’où
CTriSegmentation (d − g) = CPartition (d − g)
+CTriSegmentation (i − 1 − g)
+CTriSegmentation (d − i − 1)
= O(d − g)
+CTriSegmentation (i − 1 − g)
+CTriSegmentation (d − i − 1)
... mais i est donné par Partition, donc dépend de la donnée.
30 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
Éléments de complexité
I La taille des données est ici d − g
(taille de la portion de tableau manipulée)
I Partition a un coût linéaire en d − g.
I Coût d’évaluation des paramètres constant
donc négligeable devant d − g
I D’où
CTriSegmentation (d − g) = CPartition (d − g)
+CTriSegmentation (i − 1 − g)
+CTriSegmentation (d − i − 1)
= O(d − g)
+CTriSegmentation (i − 1 − g)
+CTriSegmentation (d − i − 1)
... mais i est donné par Partition, donc dépend de la donnée.
I Intuitivement : l’algorithme est efficace (resp. inefficace) quand le
pivot est un élément médian (resp. extrême).
I La suite plus tard...
30 / 31
Algorithmique et Analyse d’Algorithmes
Tri rapide
En résumé
Aujourd’hui
I Un algorithme récursif profite de la présence de sous-problèmes
pour résoudre un problème
I La complexité en moyenne permet d’évaluer le comportement d’un
algorithme dans une situation réaliste décrite par une distribution
aléatoire
I L’algorithme de tri rapide est récursif, peu performant au pire mais
efficace en général
La prochaine fois
I Invariant
I Correction d’un algorithme
I Terminaison d’un algorithme
I Drapeau hollandais
31 / 31
Algorithmique et Analyse d’Algorithmes
Bonus
Fonction 91 de McCarthy
MC91 (n)
if n ≤ 100
return MC91(MC91(n + 11))
else
return n − 10
1/1