Algorithmique et Analyse d’Algorithmes
Algorithmique et Analyse d’Algorithmes
L3 Info
Cours 2 : algorithmes récursifs, analyse en moyenne
Benjamin Wack
2021 – 2022
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 ?
I Comment évaluer l’efficacité d’un algorithme plus finement que dans le pire cas ?
I Tri rapide
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
Algorithmique et Analyse d’Algorithmes Algorithme récursif
Schémas récursifs
Notion d’algorithme récursif
Aux constructions habituelles on ajoute la possibilité d’appeler l’algorithmelui-mêmesur une autre donnée.
Calcul de la factorielle FACT(n)
Données :un entiern
Résultat :la valeur den! =n×(n−1)×. . .×2×1 ifn= 0
return1
returnn×FACT(n−1)
I caractéristique de l’algorithme, pas du problème
I non limité aux entiers, et particulièrement adapté aux structures récursives
I ce n’est pas de latriche!
Travail fourni = identifier la structure récursive du problème
Algorithmique et Analyse d’Algorithmes Algorithme récursif
Schémas récursifs
Structure
Prérequis
I Savoir directementrésoudrele problème sur descas de base I Savoirutiliserune (ou des) instances plus petitespour résoudre le
problème
« plus petit » = entier inférieur, sous-arbre, liste plus courte... mais pas seulement
PAIR(n)
Données :un entiern
Résultat :booléen «nest-il pair ? » ifn= 0
returnVrai else
returnPAIR(n−2)
Tout chemin d’exécution doit mener à un cas de base en temps fini.
Algorithmique et Analyse d’Algorithmes Algorithme récursif
Schémas récursifs
Écriture d’un algorithme récursif
Un problème qui casse pas des briques
On cherche à construire un mur de longueurnavec des briques de longueur 2 ou 3.
2+2+3+2+3+2 3+2+2+2+2+3 3+3+3+2+3 Exemples pourn= 14
Combien y a-t-il de possibilités distinctes ?
Algorithmique et Analyse d’Algorithmes Algorithme récursif
Schémas récursifs
Analyse du problème
I Données :
la longueur ndu 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 longueurn
= 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) ifn= 1
return0
else ifn= 2ou n= 3 return1
else
returnBRIQUES(n−2) + BRIQUES(n−3)
Algorithmique et Analyse d’Algorithmes Algorithme récursif
Schémas récursifs
Exemple : Conversion en base 2
Spécification
Étant donné un entiern, on cherche à produire à l’écran l’écriture binaire den.
Idée
On sait que :
I n% 2 donne ledernierbit
I les bits les plus à gauche sont aussi ceux den/2.
Remarque
Le problème ne se résout pas naturellement de manière impérative : il faut « commencer par la fin ».
Algorithmique et Analyse d’Algorithmes Algorithme récursif
Schémas récursifs
Exemple : Conversion en base 2 (suite)
Structure récursive
I Les casn= 0 et n= 1 sont connus.
I On sait résoudre le problème si on a résolu l’instance n/2.
Écriture binaire d’un entier ECRITURE_BINAIRE(n) ifn<2
Écriren else
ECRITURE_BINAIRE(n/2) Écriren% 2
Un algorithme récursif ne se termine en généralpaspar l’appel récursif.
Et si on voulait stocker le résultat dans un tableau ?
Algorithmique et Analyse d’Algorithmes Algorithme récursif
Analyse de coût
Retour sur la factorielle
Rappel
Le coût de l’appel d’une procédure est :
I le coût du corps de la procédure pour ses paramètres d’appel I plus le coût de l’évaluation de ses paramètres.
Calcul de la factorielle FACT(n)
ifn= 0 return1
returnn×FACT(n−1) D’où
ß CFACT(0) = 0
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.
Algorithmique et Analyse d’Algorithmes Algorithme récursif
Analyse de coût
Quelques équations récursives classiques
Coût arithmétique(un seul appel qui s’effectue en temps constant) SiC(n) =a+C(n−1)
alorsC(n) =a×n+C(0) =O(n) : coût linéaire Équations linéaires simples(un seul appel qui coûtef(n)) SiC(n) =C(n−1) +f(n)
alorsC(n) =C(0) +f(0) +f(1) +· · ·+f(n) =C(0) +Pn i=0f(i) CommeC(0) est constant on peut généralement l’ignorer.
En particulier Pn
i=11 =n=O(n) ; Pn
i=1i= n(n+1)2 =O(n2) et de manière plus générale Pn
i=1ik =O(nk+1).
Algorithmique et Analyse d’Algorithmes Algorithme récursif
Analyse de coût
Quelques équations récursives classiques (2)
Coût géométrique(aappels récursifs) SiC(n) =a×C(n−1) (aveca>1)
alorsC(n) =an×C(0) =O(an) Équations linéaires multiples Plus généralement si on a
C(n) =a1C(n−1) +a2C(n−2) +. . .akC(n−k) (plusieurs appels récursifs pour des données presque aussi grandes)
alors en général on obtient une solution de la forme C(n) =O(nk−1λn).
autrement dit une croissance au moins exponentielle.
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 clairementblog2(n)cdivisions.
Chaque appel compte
A(n) ifn= 0
return1 else
returnA(n-1) + A(n-1) + 1
B(n) if n= 0
return1 else
return2×B(n-1) + 1 I mathématiquement équivalents
I algorithmiquement très différents
Algorithmique et Analyse d’Algorithmes Algorithme récursif
Analyse de coût
Cas particuliers (2)
PGCD
SOUSTRACTIONS (a,b)
Données :Deux entiersaetb non nuls
Résultat :Le plus grand diviseur commun àa etb ifa=b
returna else ifa>b
returnSOUSTRACTIONS (a−b, b) else
returnSOUSTRACTIONS (b, a)
« Décroissance » des données en un sens à préciser
Algorithmique et Analyse d’Algorithmes Analyse en moyenne
Contexte
Motivation
Recherche séquentielle en table RECH_SEQ(e,T,n)
Données :l’élémente à rechercher, un tableauT de taillen Résultat :le premier indicei tel queT[i] =e, ou −1 s’il est absent i= 0
whilei<n et puis T[i]6=e i=i+ 1
ifi <n returni else
return−1
Complexité au pire
I la bouclewhile ne peut pas faire plus dencomparaisons I pire cas facile à exhiber :e absent deT ou en dernière position D’oùCRECH_SEQ(n) =O(n)
Algorithmique et Analyse d’Algorithmes Analyse en moyenne
Contexte
Plus finement
I Pour tous les autres cas on faitstrictementmoins den comparaisons !
I Ce genre d’algorithme est utilisé de façon répétée :
le coût d’une exécution « au pire » n’est pas très informatif.
Idée : moyenne de coût de plusieurs exécutions
On « lisse » les écarts de coûts en prenant en compte les différentes instances possibles :
Cmoy(n) = moyenne(coût(d)) pour toutes les donnéesd de taillen
Maisune moyenne uniforme est-elle représentative ?
Etcomment faire une moyenne sur tous les tableaux possibles ?
Algorithmique et Analyse d’Algorithmes Analyse en moyenne
Méthode
Calcul de coût moyen
Présupposé indispensable
Modèle probabiliste de répartition des données
i.e. pour une taillenfixée, probabilité pour chacune des donnéesd possibles qu’elle soit donnée en entrée à l’algorithme
Il doit correspondre à une réalité d’utilisation :
I recherche dans un dictionnaire : la plupart du temps le mot existe I accès mémoire : l’élément recherché est souvent au début (cache) I les algorithmes de tri reçoivent souvent des données presque triées I . . .
Formule générale : moyennepondérée
Cmoy(n) = P
donnéesdde taille n
(Proba que l’entrée soitd) × (coût de l’algo surd)
Algorithmique et Analyse d’Algorithmes Analyse en moyenne
Méthode
Fin de l’exemple : recherche en table
Deux paramètres sont nécessaires : I probabilité P(e∈T) notéep
I dans le cas où e∈T, on supposera équiprobable de le trouver à chacun des indices 0..n−1.
On trouve alors :
CRECH_SEQmoy (n) = (1−p)×n+
n
P
i=1 p n×i
= (1−p)n+pnn(n+1)2
= (1−p)n+pn+12
En particulier sip= 1 on aCRECH_SEQmoy (n) = n+12
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 :
Cmin(n) ≤ Cmoy(n) ≤ Cmax(n)
Maisattentionen généralCmoy(n)
6=
(Cmin(n) +Cmax(n))/2I Regrouper les données de même coût : Cmoy(n) = X
coûtsc
c×(probabilité des données engendrant un coûtc)
I Parfois un modèle simplifié s’impose pour que les calculs soient faisables :
I minimiser les paramètres I privilégier l’équiprobabilité
Algorithmique et Analyse d’Algorithmes Tri rapide
Le tri rapide
I aussi appelé QuickSort, Tri par segmentation...
I inventé par Tony Hoare en 1961
I utilisé dans de nombreuses librairies comme tri
« de référence »
C.A.R. Hoare (1934-) 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)
Algorithmique et Analyse d’Algorithmes Tri rapide
Principe général
D A E C B F
1. Choisir un élément : lepivot
D A E C B F
2. Partitionnerle tableau selon ce pivot : I élémentsinférieursau pivot à gauche I élémentssupérieursau pivot à droite
A C B D F E
3. Trier récursivement les deux sous-tableaux ainsi formés A B C D E F
Algorithmique et Analyse d’Algorithmes Tri rapide
Schéma de l’algorithme
TriSegmentation(E)
Donnée-résultatUn ensemble E de n éléments comparables Effet de bordE est trié par ordre croissant
ifE 6=∅
ChoisirunpivotdansE
SegmenterE selon lepivoten deux sous-ensemblesE1etE2
// E1 éléments plus petits que pivot // E2 éléments plus grands que pivot
Assembler(TriSegmentation(E1), pivot,TriSegmentation(E2))
À instancier avec les contraintes suivantes : I E est représenté dans un tableau
I Segmenter en place (pas de tableau auxiliaire) I Après l’appel àSegmenter on ne touche plus au pivot
Algorithmique et Analyse d’Algorithmes Tri rapide
Conception récursive
I Les appels récursifs opéreront sur des sous-tableaux (segments)
⇒2 paramètres en plus : les indices entre lesquels on travaille I Reconstruction triviale :E1 etE2 sont triés et leurs éléments sont
bien placés par rapport au pivot
I Cas de base : tableau de taille 0 ou 1 (déjà trié)
TriSegmentation(T,g,d)
Donnée-résultatUn tableau T d’éléments comparables
Effet de bordT est trié par ordre croissant entre les indices g et d ifg<d
pivot:=T[g]
i :=Partition(T,g,d,pivot) TriSegmentation(T,g, ?i−1) TriSegmentation(T, ?i+ 1,d)
Algorithmique et Analyse d’Algorithmes Tri rapide
La procédure Partition
Partition(T,g,d)
Donnée-résultatUn tableau T d’éléments comparables
Résultat :L’indicei depivot correctement placé dans le tableau Effet de bordLes éléments de T entre les indices :
I g et i−1sont tous inférieurs à pivot.
I i+ 1et d sont tous supérieurs à pivot.
i=g whilei<d
if T[i+ 1]≤T[g] i=i+ 1 else
ÉchangerT[d] etT[i+ 1]
d=d−1 ÉchangerT[g] et T[i]
returni
Algorithmique et Analyse d’Algorithmes Tri rapide
Éléments de complexité
I La taille des données est ici d−g
(taille dusegment de tableau manipulé) I Partition a un coût linéaire end−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) ... maisi est donné parPartition, 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...
Algorithmique et Analyse d’Algorithmes Tri rapide
En résumé
Aujourd’hui
I Un algorithmerécursifprofite de la présence desous-problèmes pour résoudre un problème
I La complexité en moyennepermet d’évaluer le comportement d’un algorithme dans une situation réaliste décrite par unedistribution aléatoire
I L’algorithme de tri rapideest 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
Algorithmique et Analyse d’Algorithmes
Bonus
Fonction 91 de McCarthy MC91 (n)
ifn≤100
returnMC91(MC91(n+ 11)) else
returnn−10