Académique Documents
Professionnel Documents
Culture Documents
Structures de Données
& Complexités
1er Année Cycle Préparatoire | MPI
29/01/2023 1
Présentation Générale
Objectif principal
Apprendre à évaluer les algorithmes et à proposer des
algorithmes efficaces et optimisés
Plan
Notions et concepts de base
Complexité d’algorithmes itératifs
Complexité d’algorithmes récursifs
Complexité des
Algorithmes Récursifs
Partie 3
3
Définition
• Algorithme récursif : un algorithme qui s’appelle lui-même
• Tout algorithme récursif doit :
– avoir au moins un cas qui ne comporte pas d’appel récursif :
cas de base ou condition d’arrêt,
– définir les bons cas de base :
• ils doivent être atteignables quelque soit l’exemple en
entrée : par exemple en s’assurant que le tableau dans
l’appel récursif est plus petit que celui en entrée
Exemples
Le calcul de la factorielle de n :
𝑛𝑛! = 𝑛𝑛 × (𝑛𝑛 − 1) × (𝑛𝑛 − 2) × ⋯ × 2 × 1 ,
on peut écrire ainsi 𝒏𝒏! = 𝒏𝒏 × (𝒏𝒏 − 𝟏𝟏)!
4
Itératif vs récursif
Solution itérative Solution récursive
fact(n:entier):entier fact(n:entier):entier
i,f : entier si n=1 alors
f := 1 fact := 1
pour i de 2 à n faire sinon
f := f * i fact := n * fact(n-1)
finpour finsi
fact := f fin
fin
5
Exécution d’un appel récursif
• L’exécution d’un appel récursif passe par deux phases :
– la phase de descente
– la phase de remontée
• Lors de la phase de descente, chaque appel récursif fait à son
tour un appel récursif
• En arrivant à la condition d’arrêt, on commence la phase de
remontée qui se poursuit jusqu’à ce que l’appel initial soit
terminé, ce qui termine le processus récursif
6
Types de récursivité
• On distingue plusieurs types de récursivité :
– Récursivité Simple : c’est une fonction qui contient dans son
corps un seul appel récursif
Exemple : Fonction factorielle
fact(n:entier):entier
si n=1 alors
fact := 1
sinon
fact := n * fact(n-1)
finsi
fin
7
Types de récursivité
• On distingue plusieurs types de récursivité :
– Récursivité Multiple : c’est une fonction qui contient plus
qu’un appel récursif dans son corps
Exemple : Calcul du nombre de combinaisons en se servant
de la relation de Pascal :
𝑝𝑝 1, 𝑠𝑠𝑖𝑖 𝑝𝑝 = 1 𝑜𝑜𝑜𝑜 𝑝𝑝 = 𝑛𝑛
𝐶𝐶𝑛𝑛 = � 𝑝𝑝 𝑝𝑝−1
𝐶𝐶 𝑛𝑛−1 + 𝐶𝐶 𝑛𝑛−1 , 𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠
9
Types de récursivité
• On distingue plusieurs types de récursivité :
– Récursivité Imbriquée : Lorsque un appel récursif est réalisé
à l’intérieur d’un autre appel récursif
Exemple : La fonction d’Ackermann :
𝑛𝑛 + 1, 𝑠𝑠𝑠𝑠 𝑚𝑚 = 0
𝐴𝐴 𝑚𝑚, 𝑛𝑛 = � 𝐴𝐴 𝑚𝑚 − 1, 1 , 𝑠𝑠𝑠𝑠 𝑚𝑚 > 0 𝑒𝑒𝑒𝑒 𝑛𝑛 = 0
𝐴𝐴 𝑚𝑚 − 1, 𝐴𝐴 𝑚𝑚, 𝑛𝑛 − 1 , 𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠
Ackermann(m:entier, n:entier):entier
si m = 0 alors
Ackermann := n + 1
sinonSi m > 0 et n = 0 alors
Ackermann := Ackermann(m-1, 1)
sinon
Ackermann := Ackermann(m-1, Ackermann(m, n-1))
finsi
fin
10
Récursivité terminale !!!
Un algorithme est récursif terminal si l’appel récursif est la toute
dernière instruction réalisée :
• La fonction Somme est récursive terminal : l’addition n + r
est faite avant l’appel pas de stockage de résultats
intermédiaires, les appels successifs sont vus comme des
égalités
Somme(n:entier,r:entier):entier
si n ≤ 1 alors
Somme := n+r
sinon
Somme := Somme(n-1,n+r)
finsi
fin
14
Types d’équations de récurrence
Il y a 2 types d’appels récursifs :
1. Les appels récursifs se font sur des problèmes de taille :
(𝑛𝑛 − 1), (𝑛𝑛 − 2) (𝑛𝑛 − 𝑏𝑏) …
Dans ce cas, le nombre d’opérations s’écrit :
𝐶𝐶(𝑛𝑛) = 𝑎𝑎 × 𝐶𝐶(𝑛𝑛 − 𝑏𝑏) + 𝑓𝑓(𝑛𝑛)
avec 𝒂𝒂, le nombre d'appels récursifs et 𝒇𝒇(𝒏𝒏) le nombre
d'opérations impliquées à chaque appel.
15
Types d’équations de récurrence
Il y a 2 types d’appels récursifs :
2. Le problème de taille 𝒏𝒏 est décompose en 𝑎𝑎 ≥ 1 sous
problèmes de taille 𝒏𝒏 ∕ 𝒃𝒃, avec 𝑏𝑏 > 1, pour le paradigme
"diviser pour régner" 𝑏𝑏 = 2,
Dans ce cas, le nombre d’opérations s’écrit :
𝐶𝐶(𝑛𝑛) = 𝑎𝑎 × 𝐶𝐶(𝑛𝑛 ∕ 𝑏𝑏) + 𝑓𝑓(𝑛𝑛)
avec :
• 𝒂𝒂 le nombre de sous problèmes
• 𝒃𝒃 le facteur de réduction
• 𝒇𝒇 (𝒏𝒏) le coût de décomposition du problème + le coût de
combinaison des résultats
16
Complexité de type 1 :
Cas simple
17
Calcul de complexité de type 1
Exemple 1 : La fonction factorielle, avec 𝐶𝐶(𝑛𝑛) la complexité d’un
appel à 𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹(𝑛𝑛)
1, 𝑛𝑛 = 1
𝐶𝐶(𝑛𝑛) = � C(n) = C(n-1) + 3
𝐶𝐶(𝑛𝑛 − 1) + 3, 𝑛𝑛 > 1
18
Calcul de complexité de type 1
Exemple 1 : par substitution
Pour calculer la solution générale de cette équation, on peut
procéder par substitution :
𝐶𝐶(𝑛𝑛) = 3 + 𝐶𝐶(𝑛𝑛 − 1)
= 3 + [3 + 𝐶𝐶(𝑛𝑛 − 2)]
= 3 + 3 + 3 + 𝐶𝐶(𝑛𝑛 − 3) 𝐶𝐶(𝑛𝑛) = 3𝑛𝑛 − 2
= ... 𝑖𝑖 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡
= 3 + 3 + ⋯ + 3 + 𝐶𝐶(𝑛𝑛 − 𝑖𝑖)
→ 𝑪𝑪(𝒏𝒏) = 𝑶𝑶(𝒏𝒏)
= 3 × 𝑖𝑖 + 𝐶𝐶(𝑛𝑛 − 𝑖𝑖)
𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝 𝑖𝑖 = 𝑛𝑛 − 1
= 3 × (𝑛𝑛 − 1) + 𝐶𝐶(𝑛𝑛 − (𝑛𝑛 − 1))
= 3 × (𝑛𝑛 − 1) + 𝐶𝐶(1)
= 3 × (𝑛𝑛 − 1) + 1
= 3 × 𝑛𝑛 − 2
19
Calcul de complexité de type 1
Exemple 1 : par somme d’équations
Pour calculer la solution générale de cette équation, on peut
aussi procéder par somme d’équations :
𝐶𝐶 𝑛𝑛 = 𝐶𝐶(𝑛𝑛 − 1) + 3
21
Calcul de complexité de type 1
Exemple 2 : Tours de Hanoï
22
Calcul de complexité de type 1
Exemple 2 : Tours de Hanoï
1 + 𝑂𝑂(1) 𝑛𝑛 = 1
𝐶𝐶(𝑛𝑛) = � C(n) = 2C(n-1) + 1
1 + 2 × 𝐶𝐶 𝑛𝑛 − 1 𝑛𝑛 > 1
23
Calcul de complexité de type 1
Exemple 2 : Tours de Hanoï
25
Paradigme "diviser pour régner" : Principe
26
Paradigme "diviser pour régner" : Principe
27
Paradigme "diviser pour régner" : Principe
28
Calcul de la complexité d’un algorithme "diviser pour régner"
29
Calcul de la complexité d’un algorithme "diviser pour régner"
30
Théorème de résolution de la récurrence
31
Calcul de complexité de type 2
5 8 1 10 12 6 4 9
5 8 1 10 12 6 4 9
5 8 1 10 12 6 4 9
8 5 1 10 12 6 4 9
8 10 12 9
10 12
12 32
Calcul de complexité de type 2
sinon
return k2
finsi C(n) = 2*C(n/2) + O(1)
finsi
fin
33
Calcul de complexité de type 2
34
Calcul de complexité de type 2
35
Calcul de complexité de type 2
Exemple 2 : Recherche dichotomique
Recherche_Dicho(L:entier, inf,sup:entier, x:entier):booléen C(n)
si (inf <= sup) alors
mil := (inf + sup) div 2
si (x = L[mil]) alors
return vrai
sinon
si (L[mil] > x) alors
return Recherche_Dicho(L,inf,mil-1,x) C(n/2)
sinon
return Recherche_Dicho(L,mil+1,sup,x)
finsi
finsi
sinon
return faux C(n) = C(n/2) + O(1)
finsi
36
Calcul de complexité de type 2
37
Calcul de complexité de type 2
38
Calcul de complexité de type 2
Exemple 3 : Tri fusion
39
Calcul de complexité de type 2
40
FIN
41
Présentation Générale
Objectif principal
Apprendre à évaluer les algorithmes et à proposer des
algorithmes efficaces et optimisés
Plan
Notions et concepts de base
Complexité d’algorithmes itératifs
Complexité d’algorithmes récursifs