SlideShare une entreprise Scribd logo
1  sur  78
1
Complexité et optimalité
Année Universitaire 2014/2015
Niveau : 4
Sana REFAI
Sana.refai@gmail.com
1
Algorithmique avancée et complexité
Année Universitaire 2014/2015
Niveau : 4
Présentation du module
2
Cours
Projet
Cours classique +des activités à faire
Horaire :3H / 2semaines
Période :Période 1 de la semestre
Charge :12 H
Déroulement :Cours +TD
Apprentissage Active :APP
Horaire :3H /2semaines
Période :Période 2 de la semestre
Charge :9 H
Déroulement : Projet par groupe
Evaluation
4
❖DS ( après 7 semaines) : 40%
❖Projet : 60%
▪ distribution du projet par groupe 3 a 4 étudiants :1 point
note de présence,
▪ Suivi du projet:1point note de présence 6 point note de
suivi,
▪ Soutenance finale : 6 points présentation , 6 points rapports
Questions
4
……?
Introduction & Motivations
4
-Algorithme
Un algorithme est une suite finie d’opérations élémentaires constituant
un schéma de calcul ou de résolution d’un problème.
- Algorithmique
L’algorithmique désigne le processus de recherche d’algorithme .
-Différences entre algorithmes et programmes
Un programme est la réalisation (l’implémentation) d’un algorithme
au moyen d’un langage donné (sur une architecture donnée). Il s’agit de
la mise en oeuvre du principe. Par exemple, lors de la programmation
on s’occupera parfois, explicitement de la gestion de la mémoire
(allocation dynamique en C) qui est un problème d’implémentation
ignoré au niveau algorithmique.
Qu’est-ce que l’algorithmique ?
Introduction & Motivations
4
-Qualités exigées d’un bon algorithme
Un bon algorithme doit satisfaire les qualités suivantes:
Correct: Il faut que le programme exécute correctement les tâches pour
lesquelles il a été conçu
Complet: Il faut que le programme considère tous les cas possibles et
donne un résultat dans chaque cas.
Efficace: Il faut que le programme exécute sa tâche avec efficacité
c’est à dire avec un coût minimal. Le coût pour un ordinateur
se mesure en termes de temps de calcul et d’espace mémoire
nécessaire.
Exemple
4
Problème_1 : Valeur d’un polynôme
On voudrait élaborer un algorithme permettant de calculer pour une
valeur X donnée de type REAL la valeur numérique d'un polynôme de
degré n:
P(X) = anXn + an-1Xn-1 + ... + a1X + a0
Données : n et les coefficients an, ... , a0 et x
Objectif : calcul de P(X)
Exemple(1/3)
4
Algorithme_1 ( trivial)
begin
P=0
for k=0 to n do
P = P+ ak*XK
endfor
End
Coût de l’algorithme
(n+1) additions
(n+1) multiplications
(n+1) puissances
Exemple(2/3)
4
Algorithme_2 (sans puissance)
begin
XP=1 ; P =0
for K=0 to N do
P = P+ XP*ak
XP = XP * X
endfor
End
Coût de l’algorithme
(n+1) additions
2(n+1) multiplications
Exemple(3/3)
4
Algorithme_3 (Schéma de Horner)
Le schéma de Horner est illustré par la figure ci-contre :
P(x) = (….(((anx+an-1)x+an-2)x+an-3)…..)x+a0
🡺 l’algorithme
begin
P = an
for k = n-1 to 0 step –1 do
P = P*X + ak
endfor
end
Coût de l’algorithme
(n) additions
(n) multiplications
.... Peut-on faire mieux ?
Rappel
4
Suite arithmétique
Un+1=Un+ r où r est la raison de cette suite.
Sn = nombre de termes × (premier terme+dernier terme)/2
Exemple : Sn = (n+1) × ( U0+Un )/2
Suite géometrique
un+1 = q un ou q est la raison constante not nulle
Sn = premier terme* 1-raisonnbre de termes/1-raison
Exercices
4
Déterminer (en fonction de N à O( ) près) la complexité en nombre
d’opérations de chaque séquence :
Séquence 1:
For i = 1 to N do
Opération ;
Endfor
Nombre d’oprérations est : N
Exercices
4
Séquence 2:
For i = 1 to N do
For j = 1 to N do
Opération ;
Endfor
Endfor
Nombre d’oprérations est :N2
Exercices
4
Séquence 3:
For i = 1 to N do
For j = 1 to i do
Opération ;
Endfor
Endfor
Nombre d’oprérations est :N(N+1)/2
Suite arithmétique de raison 1
Exercices
4
Séquence 4:
i=1;
While ( i < N) Do
i = 2*i;
Opération ;
Endwhile
Nombre d’oprérations est : log(N)
Exercices
4
Séquence 5:
i = 1;
For j=1 To n do
i = 2*i;
Endfor
For j= 1 to i do
Opération;
Endfor
Nombre d’oprérations est :2N
Exercices
4
Séquence 6:
For i = 1 To N Do
J=1;
While (J < N ) Do
J = 2 * J;
Opération;
Endwhile
Endfor
Nombre d’oprérations est :Nlog(N)
Exercices
4
Séquence 7:
i = 1;
While ( i < N ) Do
i = 2*i;
For j = 1 to i Do
Opération;
Endfor
Endwhile
Nombre d’oprérations est :2 log(N)
Suite géometrique avec nombre de terme log(N)
Exercices
4
Séquence 8:
For k = 1 to n do
i = 1;
For j = 1 to k do
i = 2*i;
Endfor
For j = 1 to i do
Opération;
Endfor
Endfor
Nombre d’oprérations est :2 N-1🡪 O(2 N)
Suite géometrique avec nombre de terme N-1
4
Chapitre 2: Complexité et
optimalité
Définitions(1/3)
4
La complexité d’un algorithme est la mesure du nombre
d’opérations fondamentales qu’il effectue sur un jeu de
données. La complexité est fonction de la taille du jeu de
données.
Nous notons Dn l’ensemble des données de taille n et
T(d) le coût de l’algorithme sur la donnée d.
On définit 3 types de complexité :
-Complexité au meilleur
-Complexité au pire
-Complexité moyenne
Définitions(2/3)
4
On note Dn l’ensemble des données de taille n et T(d) le coût de l’algorithme sur la
donné d.
-Complexité au meilleur: C’est le plus petit nombre
d’opérations qu’aura à exécuter l’algorithme sur un jeu de
données de taille fixée, ici à n.
-Complexité au pire: C’est le plus grand nombre d’opérations
qu’aura à exécuter l’algorithme sur un jeu de données de
taille fixée, ici à n.
-Complexité moyenne: C’est la moyenne des complexités de
l’algorithme sur des jeux de données de taille
n
D
d
moy
D
d
C
n
T n



)
(
)
(
Définitions(3/3)
4
- Un algorithme est dit optimal si sa complexité est la
complexité minimale parmi les algorithmes de sa classe.
-Nous nous intéresserons quasi exclusivement à la
complexité en temps des algorithmes. Il est parfois
intéressant de s’intéresser à d’autres ressources, comme
la complexité en espace (taille de l’espace mémoire
utilisé), la largeur de bande passante requise, etc.
Exemple: tri par insertion
4
Principe
De manière répétée, on retire un nombre de la séquence
d’entrée et on l’insère à la bonne place dans la séquence
des nombres déjà triés.
Algorithme
For j=2 to n do
clé = A[ j]
i= j-1
while (i > 0 and A[i] > clé) do
A[i+1]=A[i]
i=i-1
End_while
A[i+1]=clé
Endfor
Exemple: tri par insertion
4
Complexité
Instruction Coût unitaire Coût total
For j=2 to n do
clé = A[ j ]
i= j-1
while (i > 0 and A[i] > clé) do
A[i+1]=A[i]
i=i-1
End_while
A[i+1]=clé
Endfor
c1
c2
c3
c4
c5
c6
c7
n
n-1
n-1
n-1
Exemple: tri par insertion
4
Complexité
Le temps d’exécution total de l’algorithme est alors la
somme des coûts élémentaires:
Exemple:tri par insertion
4
Complexité au meilleur :
le cas le plus favorable est quand le tableau est déjà
trié. Dans ce cas tj = 1 pour tout j.
T(n) = c1n+c2(n-1)+c3(n-1)+c4(n-1)+c7(n-1)
= (c1+c2+c3+c4+c7)n-(c2+c3+c4+c7)
T(n) peut ici être écrit sous la forme T(n) = an+b, a et b
étant des constantes indépendantes des entrées.
T(n) est donc une fonction linéaire de n.
Exemple:tri par insertion
4
Complexité au pire :
Le cas le plus défavorable est quand le tableau est déjà
trié dans l’ordre inverse. Dans ce cas tj = j pour tout j.
Rappel :
T(n) est donc de la forme
T(n) est donc une fonction quadratique de n.
2
)
1
(
)
1
(
1
2
)
1
(
2
)
1
(
2
2
1







 

 


n
n
j
et
n
n
j
donc
n
n
j
n
j
n
j
n
j
)
1
(
)
2
)
1
(
(
)
2
)
1
(
(
)
1
2
)
1
(
(
)
1
(
)
1
(
)
( 7
6
5
4
3
2
1 












 n
c
n
n
c
n
n
c
n
n
c
n
c
n
c
n
c
n
T
)
(
)
2
2
2
(
2
1
)
(
2
1
)
( 7
4
3
2
7
6
5
4
3
2
1
2
6
5
4 c
c
c
c
n
c
c
c
c
c
c
c
n
c
c
c
n
T 













c
bn
an
n
T 

 2
)
(
Exemple: tri par insertion
4
Complexité en moyenne
Pour n nombres choisis au hasard, en moyenne, la
moitié des éléments de A[1.. j-1] sont inférieurs à A[ j],
et l’autre moitié sont supérieurs. Donc t j = j/2. Si l’on
reporte cette valeur dans l’équation définissant T(n), on
obtient, comme dans le cas pire, une fonction
quadratique en n.
Ordre de grandeur
la complexité du tri par insertion :
Complexité au meilleur = O(n).
Complexité au pire = O(n2).
Complexité en moyenne = O(n2).
Classes de complexité
4
Les algorithmes usuels peuvent être classés en un certain nombre de
grandes classes de complexité :
O(logn) : Les algorithmes sub-linéaires dont la complexité est en
général en O(logn).
O(n) : Les algorithmes linéaires en complexité O(n)
O(nlogn) : et ceux en complexité en O(nlogn)
O(nk) : Les algorithmes polynomiaux en O(nk) pour k > 3
Exp(n) : Les algorithmes exponentiels
Les trois premières classes sont considérées rapides alors que la
quatrième est considérée lente et la cinquième classe est considérée
impraticable.
Classes de complexité
4
Exercice
4
4
Chapitre 3: La Récursivité
Introduction
4
Récursivité
De l’art et la manière d’élaborer des algorithmes pour
résoudre des problèmes qu’on ne sait pas résoudre soi-
même !
Définition
Une définition récursive est une définition dans
laquelle intervient ce que l’on veut définir.
Un algorithme est dit récursif lorsqu’il est défini en
fonction de lui-même.
Les types de Récursivité
4
Récursivité simple
-La fonction contient un seul appel récursif dans son corps
- Exemple: fonction factorielle
- Ecrivez la fonction puissance.
Les types de Récursivité
4
Récursivité simple
la fonction puissance x xn. Cette fonction peut être définie
récursivement :
L’algorithme correspondant s’écrit :
Puissance (x, n)
Begin
If (n = 0) then
return 1
Else
return (x*Puissance (x, n-1))
End
Les types de Récursivité
4
Récursivité multiple
Une définition récursive peut contenir plus d’un appel récursif.
Exemple: Nombre de Combinaisons
On se propose de calculer le nombre de combinaisons en se
servant de la relation de Pascal :
Les types de Récursivité
4
Récursivité multiple
Combinaison (n, p)
Begin
If ( p = 0 OR p = n) then
return 1
Else
return (Combinaison (n-1, p) + Combinaison (n-1, p-1))
End
Les types de Récursivité
4
Récursivité mutuelle
Des définitions sont dites mutuellement récursives si
elles dépendent les unes des autres. Ça peut être le cas
pour la définition de la parité :
et
Les types de Récursivité
4
Récursivité mutuelle
Les algorithmes correspondants s’écrivent :
Pair (n)
Begin
If ( n = 0 ) Then
return (vrai)
Else
return (impair(n-1) )
End
Impair (n)
Begin
If ( n = 0 ) Then
return (faux)
Else
return ( Pair (n-1))
End
Les types de Récursivité
4
Récursivité imbriquée
La fonction d’Ackermann est définie comme suit :
Ackermann (m, n)
Begin
If ( m = 0 ) Then
return (n+1)
else
If (n=0) Then
Return(Ackermann (m-1, 1))
else
Return ( Ackermann (m-1, Ackermann (m, n-1)) )
End
Exemple
4
Qu’est ce qu’il fait l’algorithme ???
Algoritheme(a,b)
If (a <=0) then Erreur
Else
If (a>=b) return (a=b)
Else
Return (Algoritheme(a,b-a) )
End_Algoritheme
L’algorithme ci-dessous teste si a est un diviseur de b.
Exemple
4
Donner le resultat de l’excution pour n =5
Test 1(n)
If (n = 0 )Then ne rien faire
Else
afficher n
Test1 (n-1)
End_if
End_Test1
Test2(n)
If ( n = 0) Then ne rien faire
Else
Test2(n-1)
afficher n
Endif
End_Test2
Exemple
4
Recursévitite terminale.
Recursivite non terminale
Exercie
4
Exercice 6 TD2
Considérer le programme (en encadré-2)
On exécute le programme et on tape dans l’ordre les
nombres suivants : 5, 7, 13, 4, 7, 0, 5, 15, 50, 0. Quels
sont les nombres affichés à l’écran.
Dérécursiver la fonction « traiter ».
void traiter()
{ int x;
cin >> x;
if (x != 0)
traiter();
cout << " , " << x;
}
void main ()
{ traiter (); }
,0,7,4,13,7,5
Exercie
4
Exercice 6 TD2
Considérer le programme (en encadré-2)
On exécute le programme et on tape dans l’ordre les
nombres suivants : 5, 7, 13, 4, 7, 0, 5, 15, 50, 0. Quels
sont les nombres affichés à l’écran.
Dérécursiver la fonction « traiter ».
void traiter()
{ int x;
cin >> x;
if (x != 0)
traiter();
cout << " , " << x;
}
void main ()
{ traiter (); }
Recursvite non terminale
Exercie
4
Exercice 5TD2
Rendre récursive la fonction somme (en encadré-1).
int somme (int *x , int n)
{ int i, s=0 ;
for (i=0; i < n ; i++)
s = s + x[i];
return s;
}
Exercie
4
Exercice 5 solution
int somme (int *x , int n)
{ int i, s=0 ;
if ( n ==1 ) return x[0];//ou n==0 return 0
Else
return ( x[n-1]+ somme( int *x, n-1))
}
Exemple d’algorithme récursif : les tours de Hanoï
4
Le problème
Le jeu est constitué d’une plaquette de bois où sont
plantées trois tiges numérotées 1, 2 et 3. Sur ces tiges
sont empilés des disques de diamètres tous différents.
Les seules règles du jeu sont que l’on ne peut déplacer
qu’un seul disque à la fois, et qu’il est interdit de poser
un disque sur un disque plus petit.
Au début, tous les disques sont sur la tige 1
(celle de gauche), et à la fin ils doivent être
sur celle de droite.
Exemple d’algorithme récursif : les tours de Hanoï
4
Résolution :
Principe : On suppose que l’on sait résoudre le
problème pour (n-1) disques. Pour déplacer n disques
de la tige 1 vers la tige 3, on déplace les (n-1) plus petits
disques de la tige 1 vers la tige 2, puis on déplace le plus
gros disque de la tige 1 vers la tige 3, puis on déplace les
(n-1) plus petits disques
de la tige 2 vers la tige 3.
Exemple d’algorithme récursif : les tours de Hanoï
4
Algorithme
Hanoi (n, départ, intermédiaire, destination)
If n > 0 Then
Hanoi (n-1, départ, destination, intermédiaire)
déplacer un disque de départ vers destination
Hanoi (n-1, intermédiaire, départ, destination)
Endif
End_Hanoi
Exemple d’algorithme récursif : les tours de Hanoï
4
Trace
L’appel à Hanoi(3,1,2,3) entraîne l’affichage de :
1. Déplace un disque de la tige 1 vers la tige 3
2. Déplace un disque de la tige 1 vers la tige 2
3. Déplace un disque de la tige 3 vers la tige 2
4. Déplace un disque de la tige 1 vers la tige 3
5. Déplace un disque de la tige 2 vers la tige 1
6. Déplace un disque de la tige 2 vers la tige 3
7. Déplace un disque de la tige 1 vers la tige 3
Exemple d’algorithme récursif : les tours de Hanoï
4
Complexité
On compte le nombre de déplacements de disques
effectués par l’algorithme Hanoi invoqué sur n disques.
T(n) = 1+ 2T(n-1)
= 1+ 2 * ( 2 * T(n-2) +1)
Suite géométrique de raison 2
= 2n -1
 Complexite exponnentielle
Exemple d’algorithme récursif : les tours de Hanoï
4
Le temps !!!!!
En supposant que le déplacement d’un disque nécessite
1minute (il faut réfléchir et déplacer un disque qui peut
être lourd puisqu’il est en or), et si on dispose de 64
disques, il faudrait :
minutes = 3,50965 1013 = 35096,5 milliards d'années
Exercice
4
Exercice 7:
Pour convertir un nombre entier positif N de la base
décimale à la base binaire, il faut opérer par des
divisions successives du nombre N par 2. Les restes des
divisions constituent la représentation binaire. Ecrire une
fonction récursive « Binaire » permettant d’imprimer à
l’écran la représentation binaire d’un nombre N (voir
exemple en face).
Donner la formule récurrente exprimant sa complexité
en nombre de divisions. Estimer cette complexité.
Binaire(13)
1101
Exercice
4
Exercice 7 (correction)
Void Binaire ( int n)
{
If ( n/2 = 0)
Printf( « %d », n mod 2);
else
{
Binaire (n/2);
Printf( « %d », n mod 2);
}
}
Nombre de division T(n)=T(n/2)+1
( arbre récursive == log2(n))
Binaire(13)
1101
Elimination de la récursivité
4
Dérécursiver, c’est transformer un algorithme récursif
en un algorithme équivalent ne contenant pas d’appels
récursifs.
Elimination de la Récursivité terminale simple
Rappel: Un algorithme est dit récursif terminal s’il ne
contient aucun traitement après un appel récursif.
La récursivité terminale simple peut être remplacée
par une solution itérative.
Elimination de la récursivité terminale
4
– U est la liste des paramètres ;
– C est une condition portant sur U ;
– a(U) représente la transformation des paramètres ;
Algo récursif Algo Itératif
Algorithme P(U)
If ( Condition(U) ) Then
Traitement_base (U);
P(a(U)) ;
Else
Traitement_terminaison(U);
Endif
End_Algorithme
Algorithme P’(U)
While ( Condition(U) ) do
Traitement_base(U);
U a(U)
End_while
Traitement_terminaison;
End_Algorithme
Exemple 1:Elimination de la récursivité terminale
4
Version récursive Version dérécursivée
Diviseur (a,b)
If (a <=0) then Erreur
Else
If (a>=b) return (a=b)
Else
Return (Diviseur (a,b-a) )
End_Diviseur
?
Exemple2 :Elimination de la récursivité terminale
4
Version récursive Version dérécursivée
Diviseur (a,b)
If (a <=0) then Erreur
Else
If (a>=b) return (a=b)
Else
Return (Diviseur (a,b-a) )
End_Diviseur
Diviseur(a,b)
If (a <= 0 )then Erreur
While ( b > a )
b=b-a
return (a=b)
End_Diviseur
Elimination de la récursivité non terminale
4
Dans un algorithme récursif non terminale , l’appel
récursif est suivi d’un traitement  il reste un
traitement à reprendre ultérieurement. Il va falloir donc
sauvegarder, sur une pile, le contexte de l’appel récursif,
typiquement les paramètres de l’appel engendrant
l’appel récursif.
 La récursive non terminale simple peut être
remplacée par une solution itérative utilisant une pile.
Elimination de la récursivité non terminale
4
Algorithme récursif Algorithme dérécursivé
Algorithme Q(U)
If ( Condition(U) ) Then
Traitement_A(U);
Q(a(U));
Traitement_B(U);
Else
Traitement_terminaison(U);
Endif
End_Algorithme
Algorithme Q’(U)
Pile.init() ;
While (Condition (U)) do
Traitement_A(U) ;
Pile.push(U) ;
U= a(U);
Endwhile
Traitement_terminaison (U) ;
While (not Pile.empty()) do
Pile.pop (U) ;
Traitement_B(U) ;
Endwhile
End_Algorithme
Exemple: Elimination de la récursivité non terminale
4
Version récursive Version dérécursivée
void recursif(int n)
{ if ( n> 0)
{cout<<"nIN : N = "<<n<< endl ;
recursif(n-1);
cout<<"nOUT : N = "<<n<<endl;
}else
cout << "nTerminaison"<<endl;
}
?
Exemple: Elimination de la récursivité non terminale
4
Version récursive Version dérécursivée
void recursif(int n)
{ if ( n> 0)
{cout<<"nIN : N = "<<n<< endl ;
recursif(n-1);
cout<<"nOUT : N = "<<n<<endl;
}else
cout << "nTerminaison"<<endl;
}
void non_recursif(int &n)
{ pile P;int k;
P.init();
k=n;
while (k>0)
{cout<<"nIN : N = "<<k<< endl ;
P.push(k);
k--;
}
cout << "nTerminaison"<<endl;
while (!P.empty())
{ P.pop(n) ;
cout << "nOUT : N = "<<n<<endl;
}
}
Elimination de la récursivité
4
Remarque:
Les programmes itératifs sont souvent plus efficaces, mais les
programmes récursifs sont plus faciles à écrire.
Il est toujours possible de dérécursiver un algorithme récursif.
Exercice
4
4
Chapitre 3: Diviser pour
régner
Diviser pour régner
4
Principe
-De nombreux algorithmes ont une structure récursive: pour résoudre
un problème donné, ils s’appellent eux-mêmes récursivement une ou
plusieurs fois sur des problèmes très similaires, mais de tailles
moindres, résolvent les sous problèmes de manière récursive puis
combinent les résultats pour trouver une solution au problème initial.
-Le paradigme « diviser pour régner » donne lieu à 3 étapes à chaque
niveau de récursivité :
Diviser : le problème en un certain nombre de sous-problèmes ;
Régner : sur les sous-problèmes en les résolvant récursivement ou, si la
taille d’un sous-problème est assez réduite, le résoudre directement ;
Combiner: les solutions des sous-problèmes en une solution complète
du problème initial.
Diviser pour régner
2
Principe
-De nombreux algorithmes ont une structure récursive: pour résoudre
un problème donné, ils s’appellent eux-mêmes récursivement une ou
plusieurs fois sur des problèmes très similaires, mais de tailles
moindres, résolvent les sous problèmes de manière récursive puis
combinent les résultats pour trouver une solution au problème initial.
-Le paradigme « diviser pour régner » donne lieu à 3 étapes à chaque
niveau de récursivité :
Diviser : le problème en un certain nombre de sous-problèmes ;
Régner : sur les sous-problèmes en les résolvant récursivement ou, si la
taille d’un sous-problème est assez réduite, le résoudre directement ;
Combiner: les solutions des sous-problèmes en une solution complète
du problème initial.
Exemple1: Recherche de l’indice du maximum d’un tableau
3
Fonction maximum ( Tab , indDeb, indFin )
if ( indDeb = indFin)
return indDeb;
else
m=(indDeb + indFin)/2; // division du problème en 2 sous-problèmes
k1 = maximum (Tab, indDeb, m ) ;// régner sur le 1er sous-problème
k2 = maximum (Tab, m+1, indFin);// régner sur le 2ème sous-problème
if(Tab(k1) > Tab(k2)) // combiner les solutions
return k1
else
return k2
End_maximum
 T(n) = 2T(n/2)+ 1
Exemple2: Multiplication de matrices carrées
3
-Dans cet exemple, on se propose de multiplier 2 matrices carrées A et
B de taille n chacun, nous supposerons que n est une puissance de 2.
-Décomposons les matrices A, B et C en sous-matrices de taille n/2 x
n/2. L’équation C = AB peut alors se récrire :
- Le développement de cette équation donne:
r = ae+bf ; s = ag+bh; t = ce+df ; u = cg+dh:
Exemple2: Multiplication de matrices carrées
4
-Chacune de ces quatre opérations correspond à :
deux multiplications de matrices carrées de taille n/2  2T(n/2)
et une addition de telles matrices  O(n2) // n2/4
A partir de ces équations on peut aisément dériver un algorithme «
diviser pour régner » dont la complexité est donnée par la récurrence :
T(n) = 8T(n/2)+O(n2)
Exercice: Recherche récursive du maximum d’une fonction
4
Soit une fonction à une dimension définie par N échantillons
équidistants se trouvant dans un tableau X. On suppose que la
fonction est unimodale (croissante puis décroissante) (Voir figure). On
voudrait déterminer l’échantillon qui donne sa valeur maximale.
Ecrire un algorithme récursif permettant de déterminer l’élément du
tableau X contenant l’échantillon maximal selonl e paradigme « diviser
pour régner ».
Estimer sa complexité en terme de comparaisons.
Correction: Recherche récursive du maximum d’une fonction
4
Fonction unimodale( int *x, indeb,indfin)
M=indeb+indfin/2
Si ( x[m] > x[m-1] && x[m] > x[m+1])
Return X[m]
Else
Si ( x[m] > x[m-1]
Return(unimodale( int *x, m+1,indfin)
Else
Return(unimodale( int *x, indeb,m-1)
T(n)= T(n/2)+1
Analyse des algorithmes « diviser pour régner »
5
- Lorsqu’un algorithme contient un appel récursif à lui-même, son
temps d’exécution peut souvent être décrit par une équation de
récurrence qui décrit le temps d’exécution global pour un problème de
taille n en fonction du temps d’exécution pour des entrées de taille
moindre.
-La récurrence définissant le temps d’exécution d’un tel algorithme se
décompose suivant les trois étapes du paradigme de base :
1. Si la taille du problème est suffisamment réduite, n <= c pour une
certaine constante c, la résolution est directe et consomme un temps
constant O(1).
2. Sinon, on divise le problème en a sous-problèmes chacun de taille
1/b de la taille du problème initial. Le temps d’exécution total se
décompose alors en trois parties :
- D(n) : le temps nécessaire à la division du problème en sous-
problèmes.
- aT(n/b) : le temps de résolution des a sous-problèmes.
- C(n) : le temps nécessaire pour construire la solution finale à partir
des solutions aux sous-problèmes.
Analyse des algorithmes « diviser pour régner »
6
-La relation de récurrence prend alors la forme :
-Soit f(n) la fonction qui régroupe D(n) et C(n). La fonction T(n) est alors
définie:
T(n)= aT(n/b)+ f(n)
T(n)=aT(n/b)+c.nK
Résolution des récurrence des algorithmes« diviser pour régner »
7
T(n)=aT(n/b)+c.nK
Théorème de la résolution de la récurrence:
-Si a > bk alors T(n) = O(nlog
b
(a))
-Si a = bk alors T(n) = O(nklogb(n))
-Si a < bk alors T(n) =O(f(n) = O(nk)
-Exemple: multiplication des matrices
T(n) = 8T(n/2)+O(n2)
a =8 , b=2, k = 2  a > bk
logb(a)= 3
T(n) = O(n3)

Contenu connexe

Similaire à la complexité des algorithmes en toute simplicité

algo et complexité .pptx
algo et complexité  .pptxalgo et complexité  .pptx
algo et complexité .pptxtarekjedidi
 
récursivité algorithmique et complexité algorithmique et Les algorithmes de tri
récursivité algorithmique et complexité algorithmique et Les algorithmes de trirécursivité algorithmique et complexité algorithmique et Les algorithmes de tri
récursivité algorithmique et complexité algorithmique et Les algorithmes de triYassine Anddam
 
chap 3 complexité (3).pdf
chap 3 complexité (3).pdfchap 3 complexité (3).pdf
chap 3 complexité (3).pdfdonixwm
 
LES ALGORITHMES D’APPROXIMATION
LES ALGORITHMES D’APPROXIMATIONLES ALGORITHMES D’APPROXIMATION
LES ALGORITHMES D’APPROXIMATIONborhen boukthir
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
Chapitre 3 _Conception et analyse d’algorithme-DPR.pdf
Chapitre 3 _Conception et analyse d’algorithme-DPR.pdfChapitre 3 _Conception et analyse d’algorithme-DPR.pdf
Chapitre 3 _Conception et analyse d’algorithme-DPR.pdfMbarkiIsraa
 
L’analyse et Expérimentation des séquences du Tri par shell
L’analyse et Expérimentation des séquences du Tri par shellL’analyse et Expérimentation des séquences du Tri par shell
L’analyse et Expérimentation des séquences du Tri par shellyoucefsama
 
Algorithmique programmation2018
Algorithmique programmation2018Algorithmique programmation2018
Algorithmique programmation2018salah fenni
 
Cours_3_0910_2.pdf
Cours_3_0910_2.pdfCours_3_0910_2.pdf
Cours_3_0910_2.pdfSongSonfack
 
Algorithmique Amp Programmation (R Sum
Algorithmique  Amp  Programmation (R SumAlgorithmique  Amp  Programmation (R Sum
Algorithmique Amp Programmation (R SumAmy Isleb
 
Cours - TC - Histoire Algorithmique.pdf
Cours - TC - Histoire Algorithmique.pdfCours - TC - Histoire Algorithmique.pdf
Cours - TC - Histoire Algorithmique.pdfadeljaouadi
 
1 analyse-et-mesure-des-performances
1 analyse-et-mesure-des-performances1 analyse-et-mesure-des-performances
1 analyse-et-mesure-des-performancesm.a bensaaoud
 

Similaire à la complexité des algorithmes en toute simplicité (20)

algo et complexité .pptx
algo et complexité  .pptxalgo et complexité  .pptx
algo et complexité .pptx
 
récursivité algorithmique et complexité algorithmique et Les algorithmes de tri
récursivité algorithmique et complexité algorithmique et Les algorithmes de trirécursivité algorithmique et complexité algorithmique et Les algorithmes de tri
récursivité algorithmique et complexité algorithmique et Les algorithmes de tri
 
chap 3 complexité (3).pdf
chap 3 complexité (3).pdfchap 3 complexité (3).pdf
chap 3 complexité (3).pdf
 
TAD (1).pptx
TAD (1).pptxTAD (1).pptx
TAD (1).pptx
 
langage C++
langage C++langage C++
langage C++
 
Récursivité
RécursivitéRécursivité
Récursivité
 
LES ALGORITHMES D’APPROXIMATION
LES ALGORITHMES D’APPROXIMATIONLES ALGORITHMES D’APPROXIMATION
LES ALGORITHMES D’APPROXIMATION
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Chapitre 3 _Conception et analyse d’algorithme-DPR.pdf
Chapitre 3 _Conception et analyse d’algorithme-DPR.pdfChapitre 3 _Conception et analyse d’algorithme-DPR.pdf
Chapitre 3 _Conception et analyse d’algorithme-DPR.pdf
 
2-Algo.ppt
2-Algo.ppt2-Algo.ppt
2-Algo.ppt
 
Algo inf102 2007
Algo inf102 2007Algo inf102 2007
Algo inf102 2007
 
L’analyse et Expérimentation des séquences du Tri par shell
L’analyse et Expérimentation des séquences du Tri par shellL’analyse et Expérimentation des séquences du Tri par shell
L’analyse et Expérimentation des séquences du Tri par shell
 
Algorithmique programmation2018
Algorithmique programmation2018Algorithmique programmation2018
Algorithmique programmation2018
 
COURS_PYTHON_22.ppt
COURS_PYTHON_22.pptCOURS_PYTHON_22.ppt
COURS_PYTHON_22.ppt
 
Cours_3_0910_2.pdf
Cours_3_0910_2.pdfCours_3_0910_2.pdf
Cours_3_0910_2.pdf
 
Cours_3_0910.pdf
Cours_3_0910.pdfCours_3_0910.pdf
Cours_3_0910.pdf
 
Algorithmique Amp Programmation (R Sum
Algorithmique  Amp  Programmation (R SumAlgorithmique  Amp  Programmation (R Sum
Algorithmique Amp Programmation (R Sum
 
Mathématiques et Python
Mathématiques et PythonMathématiques et Python
Mathématiques et Python
 
Cours - TC - Histoire Algorithmique.pdf
Cours - TC - Histoire Algorithmique.pdfCours - TC - Histoire Algorithmique.pdf
Cours - TC - Histoire Algorithmique.pdf
 
1 analyse-et-mesure-des-performances
1 analyse-et-mesure-des-performances1 analyse-et-mesure-des-performances
1 analyse-et-mesure-des-performances
 

Plus de Sana REFAI

Algo II : les piles ( cours + exercices)
Algo II :  les piles ( cours + exercices)Algo II :  les piles ( cours + exercices)
Algo II : les piles ( cours + exercices)Sana REFAI
 
Chapitre 2 : Les Listes chainées en Algo et C
Chapitre 2 : Les Listes chainées en Algo et CChapitre 2 : Les Listes chainées en Algo et C
Chapitre 2 : Les Listes chainées en Algo et CSana REFAI
 
Chap2: lescollections
Chap2: lescollections Chap2: lescollections
Chap2: lescollections Sana REFAI
 
Chap1lla génèricité.pptx
Chap1lla génèricité.pptxChap1lla génèricité.pptx
Chap1lla génèricité.pptxSana REFAI
 
Cours algo: Les pointeurs
Cours algo: Les pointeursCours algo: Les pointeurs
Cours algo: Les pointeursSana REFAI
 
Gestion de projets
Gestion de projetsGestion de projets
Gestion de projetsSana REFAI
 

Plus de Sana REFAI (8)

Algo II : les piles ( cours + exercices)
Algo II :  les piles ( cours + exercices)Algo II :  les piles ( cours + exercices)
Algo II : les piles ( cours + exercices)
 
Chapitre 2 : Les Listes chainées en Algo et C
Chapitre 2 : Les Listes chainées en Algo et CChapitre 2 : Les Listes chainées en Algo et C
Chapitre 2 : Les Listes chainées en Algo et C
 
Chap2: lescollections
Chap2: lescollections Chap2: lescollections
Chap2: lescollections
 
Chap1lla génèricité.pptx
Chap1lla génèricité.pptxChap1lla génèricité.pptx
Chap1lla génèricité.pptx
 
Pfe
PfePfe
Pfe
 
Cours algo: Les pointeurs
Cours algo: Les pointeursCours algo: Les pointeurs
Cours algo: Les pointeurs
 
Kinect
Kinect Kinect
Kinect
 
Gestion de projets
Gestion de projetsGestion de projets
Gestion de projets
 

Dernier

présentation sur la logistique (4).
présentation     sur la  logistique (4).présentation     sur la  logistique (4).
présentation sur la logistique (4).FatimaEzzahra753100
 
Cours-de-Ponts Cours de Ponts Principes généraux - Conception Méthodes de con...
Cours-de-Ponts Cours de Ponts Principes généraux - Conception Méthodes de con...Cours-de-Ponts Cours de Ponts Principes généraux - Conception Méthodes de con...
Cours-de-Ponts Cours de Ponts Principes généraux - Conception Méthodes de con...maach1
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfInstitut de l'Elevage - Idele
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...Institut de l'Elevage - Idele
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfInstitut de l'Elevage - Idele
 
JTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfJTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfInstitut de l'Elevage - Idele
 
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdfSKennel
 
Câblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfCâblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfmia884611
 

Dernier (10)

présentation sur la logistique (4).
présentation     sur la  logistique (4).présentation     sur la  logistique (4).
présentation sur la logistique (4).
 
Cours-de-Ponts Cours de Ponts Principes généraux - Conception Méthodes de con...
Cours-de-Ponts Cours de Ponts Principes généraux - Conception Méthodes de con...Cours-de-Ponts Cours de Ponts Principes généraux - Conception Méthodes de con...
Cours-de-Ponts Cours de Ponts Principes généraux - Conception Méthodes de con...
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdf
 
JTC 2024 - DeCremoux_Anomalies_génétiques.pdf
JTC 2024 - DeCremoux_Anomalies_génétiques.pdfJTC 2024 - DeCremoux_Anomalies_génétiques.pdf
JTC 2024 - DeCremoux_Anomalies_génétiques.pdf
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
 
JTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfJTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdf
 
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_APC.pdf
 
CAP2ER_GC_Presentation_Outil_20240422.pptx
CAP2ER_GC_Presentation_Outil_20240422.pptxCAP2ER_GC_Presentation_Outil_20240422.pptx
CAP2ER_GC_Presentation_Outil_20240422.pptx
 
Câblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfCâblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdf
 

la complexité des algorithmes en toute simplicité

  • 1. 1 Complexité et optimalité Année Universitaire 2014/2015 Niveau : 4 Sana REFAI Sana.refai@gmail.com
  • 2. 1 Algorithmique avancée et complexité Année Universitaire 2014/2015 Niveau : 4
  • 3. Présentation du module 2 Cours Projet Cours classique +des activités à faire Horaire :3H / 2semaines Période :Période 1 de la semestre Charge :12 H Déroulement :Cours +TD Apprentissage Active :APP Horaire :3H /2semaines Période :Période 2 de la semestre Charge :9 H Déroulement : Projet par groupe
  • 4. Evaluation 4 ❖DS ( après 7 semaines) : 40% ❖Projet : 60% ▪ distribution du projet par groupe 3 a 4 étudiants :1 point note de présence, ▪ Suivi du projet:1point note de présence 6 point note de suivi, ▪ Soutenance finale : 6 points présentation , 6 points rapports
  • 6. Introduction & Motivations 4 -Algorithme Un algorithme est une suite finie d’opérations élémentaires constituant un schéma de calcul ou de résolution d’un problème. - Algorithmique L’algorithmique désigne le processus de recherche d’algorithme . -Différences entre algorithmes et programmes Un programme est la réalisation (l’implémentation) d’un algorithme au moyen d’un langage donné (sur une architecture donnée). Il s’agit de la mise en oeuvre du principe. Par exemple, lors de la programmation on s’occupera parfois, explicitement de la gestion de la mémoire (allocation dynamique en C) qui est un problème d’implémentation ignoré au niveau algorithmique. Qu’est-ce que l’algorithmique ?
  • 7. Introduction & Motivations 4 -Qualités exigées d’un bon algorithme Un bon algorithme doit satisfaire les qualités suivantes: Correct: Il faut que le programme exécute correctement les tâches pour lesquelles il a été conçu Complet: Il faut que le programme considère tous les cas possibles et donne un résultat dans chaque cas. Efficace: Il faut que le programme exécute sa tâche avec efficacité c’est à dire avec un coût minimal. Le coût pour un ordinateur se mesure en termes de temps de calcul et d’espace mémoire nécessaire.
  • 8. Exemple 4 Problème_1 : Valeur d’un polynôme On voudrait élaborer un algorithme permettant de calculer pour une valeur X donnée de type REAL la valeur numérique d'un polynôme de degré n: P(X) = anXn + an-1Xn-1 + ... + a1X + a0 Données : n et les coefficients an, ... , a0 et x Objectif : calcul de P(X)
  • 9. Exemple(1/3) 4 Algorithme_1 ( trivial) begin P=0 for k=0 to n do P = P+ ak*XK endfor End Coût de l’algorithme (n+1) additions (n+1) multiplications (n+1) puissances
  • 10. Exemple(2/3) 4 Algorithme_2 (sans puissance) begin XP=1 ; P =0 for K=0 to N do P = P+ XP*ak XP = XP * X endfor End Coût de l’algorithme (n+1) additions 2(n+1) multiplications
  • 11. Exemple(3/3) 4 Algorithme_3 (Schéma de Horner) Le schéma de Horner est illustré par la figure ci-contre : P(x) = (….(((anx+an-1)x+an-2)x+an-3)…..)x+a0 🡺 l’algorithme begin P = an for k = n-1 to 0 step –1 do P = P*X + ak endfor end Coût de l’algorithme (n) additions (n) multiplications .... Peut-on faire mieux ?
  • 12. Rappel 4 Suite arithmétique Un+1=Un+ r où r est la raison de cette suite. Sn = nombre de termes × (premier terme+dernier terme)/2 Exemple : Sn = (n+1) × ( U0+Un )/2 Suite géometrique un+1 = q un ou q est la raison constante not nulle Sn = premier terme* 1-raisonnbre de termes/1-raison
  • 13. Exercices 4 Déterminer (en fonction de N à O( ) près) la complexité en nombre d’opérations de chaque séquence : Séquence 1: For i = 1 to N do Opération ; Endfor Nombre d’oprérations est : N
  • 14. Exercices 4 Séquence 2: For i = 1 to N do For j = 1 to N do Opération ; Endfor Endfor Nombre d’oprérations est :N2
  • 15. Exercices 4 Séquence 3: For i = 1 to N do For j = 1 to i do Opération ; Endfor Endfor Nombre d’oprérations est :N(N+1)/2 Suite arithmétique de raison 1
  • 16. Exercices 4 Séquence 4: i=1; While ( i < N) Do i = 2*i; Opération ; Endwhile Nombre d’oprérations est : log(N)
  • 17. Exercices 4 Séquence 5: i = 1; For j=1 To n do i = 2*i; Endfor For j= 1 to i do Opération; Endfor Nombre d’oprérations est :2N
  • 18. Exercices 4 Séquence 6: For i = 1 To N Do J=1; While (J < N ) Do J = 2 * J; Opération; Endwhile Endfor Nombre d’oprérations est :Nlog(N)
  • 19. Exercices 4 Séquence 7: i = 1; While ( i < N ) Do i = 2*i; For j = 1 to i Do Opération; Endfor Endwhile Nombre d’oprérations est :2 log(N) Suite géometrique avec nombre de terme log(N)
  • 20. Exercices 4 Séquence 8: For k = 1 to n do i = 1; For j = 1 to k do i = 2*i; Endfor For j = 1 to i do Opération; Endfor Endfor Nombre d’oprérations est :2 N-1🡪 O(2 N) Suite géometrique avec nombre de terme N-1
  • 21. 4 Chapitre 2: Complexité et optimalité
  • 22. Définitions(1/3) 4 La complexité d’un algorithme est la mesure du nombre d’opérations fondamentales qu’il effectue sur un jeu de données. La complexité est fonction de la taille du jeu de données. Nous notons Dn l’ensemble des données de taille n et T(d) le coût de l’algorithme sur la donnée d. On définit 3 types de complexité : -Complexité au meilleur -Complexité au pire -Complexité moyenne
  • 23. Définitions(2/3) 4 On note Dn l’ensemble des données de taille n et T(d) le coût de l’algorithme sur la donné d. -Complexité au meilleur: C’est le plus petit nombre d’opérations qu’aura à exécuter l’algorithme sur un jeu de données de taille fixée, ici à n. -Complexité au pire: C’est le plus grand nombre d’opérations qu’aura à exécuter l’algorithme sur un jeu de données de taille fixée, ici à n. -Complexité moyenne: C’est la moyenne des complexités de l’algorithme sur des jeux de données de taille n D d moy D d C n T n    ) ( ) (
  • 24. Définitions(3/3) 4 - Un algorithme est dit optimal si sa complexité est la complexité minimale parmi les algorithmes de sa classe. -Nous nous intéresserons quasi exclusivement à la complexité en temps des algorithmes. Il est parfois intéressant de s’intéresser à d’autres ressources, comme la complexité en espace (taille de l’espace mémoire utilisé), la largeur de bande passante requise, etc.
  • 25. Exemple: tri par insertion 4 Principe De manière répétée, on retire un nombre de la séquence d’entrée et on l’insère à la bonne place dans la séquence des nombres déjà triés. Algorithme For j=2 to n do clé = A[ j] i= j-1 while (i > 0 and A[i] > clé) do A[i+1]=A[i] i=i-1 End_while A[i+1]=clé Endfor
  • 26. Exemple: tri par insertion 4 Complexité Instruction Coût unitaire Coût total For j=2 to n do clé = A[ j ] i= j-1 while (i > 0 and A[i] > clé) do A[i+1]=A[i] i=i-1 End_while A[i+1]=clé Endfor c1 c2 c3 c4 c5 c6 c7 n n-1 n-1 n-1
  • 27. Exemple: tri par insertion 4 Complexité Le temps d’exécution total de l’algorithme est alors la somme des coûts élémentaires:
  • 28. Exemple:tri par insertion 4 Complexité au meilleur : le cas le plus favorable est quand le tableau est déjà trié. Dans ce cas tj = 1 pour tout j. T(n) = c1n+c2(n-1)+c3(n-1)+c4(n-1)+c7(n-1) = (c1+c2+c3+c4+c7)n-(c2+c3+c4+c7) T(n) peut ici être écrit sous la forme T(n) = an+b, a et b étant des constantes indépendantes des entrées. T(n) est donc une fonction linéaire de n.
  • 29. Exemple:tri par insertion 4 Complexité au pire : Le cas le plus défavorable est quand le tableau est déjà trié dans l’ordre inverse. Dans ce cas tj = j pour tout j. Rappel : T(n) est donc de la forme T(n) est donc une fonction quadratique de n. 2 ) 1 ( ) 1 ( 1 2 ) 1 ( 2 ) 1 ( 2 2 1               n n j et n n j donc n n j n j n j n j ) 1 ( ) 2 ) 1 ( ( ) 2 ) 1 ( ( ) 1 2 ) 1 ( ( ) 1 ( ) 1 ( ) ( 7 6 5 4 3 2 1               n c n n c n n c n n c n c n c n c n T ) ( ) 2 2 2 ( 2 1 ) ( 2 1 ) ( 7 4 3 2 7 6 5 4 3 2 1 2 6 5 4 c c c c n c c c c c c c n c c c n T               c bn an n T    2 ) (
  • 30. Exemple: tri par insertion 4 Complexité en moyenne Pour n nombres choisis au hasard, en moyenne, la moitié des éléments de A[1.. j-1] sont inférieurs à A[ j], et l’autre moitié sont supérieurs. Donc t j = j/2. Si l’on reporte cette valeur dans l’équation définissant T(n), on obtient, comme dans le cas pire, une fonction quadratique en n. Ordre de grandeur la complexité du tri par insertion : Complexité au meilleur = O(n). Complexité au pire = O(n2). Complexité en moyenne = O(n2).
  • 31. Classes de complexité 4 Les algorithmes usuels peuvent être classés en un certain nombre de grandes classes de complexité : O(logn) : Les algorithmes sub-linéaires dont la complexité est en général en O(logn). O(n) : Les algorithmes linéaires en complexité O(n) O(nlogn) : et ceux en complexité en O(nlogn) O(nk) : Les algorithmes polynomiaux en O(nk) pour k > 3 Exp(n) : Les algorithmes exponentiels Les trois premières classes sont considérées rapides alors que la quatrième est considérée lente et la cinquième classe est considérée impraticable.
  • 34. 4 Chapitre 3: La Récursivité
  • 35. Introduction 4 Récursivité De l’art et la manière d’élaborer des algorithmes pour résoudre des problèmes qu’on ne sait pas résoudre soi- même ! Définition Une définition récursive est une définition dans laquelle intervient ce que l’on veut définir. Un algorithme est dit récursif lorsqu’il est défini en fonction de lui-même.
  • 36. Les types de Récursivité 4 Récursivité simple -La fonction contient un seul appel récursif dans son corps - Exemple: fonction factorielle - Ecrivez la fonction puissance.
  • 37. Les types de Récursivité 4 Récursivité simple la fonction puissance x xn. Cette fonction peut être définie récursivement : L’algorithme correspondant s’écrit : Puissance (x, n) Begin If (n = 0) then return 1 Else return (x*Puissance (x, n-1)) End
  • 38. Les types de Récursivité 4 Récursivité multiple Une définition récursive peut contenir plus d’un appel récursif. Exemple: Nombre de Combinaisons On se propose de calculer le nombre de combinaisons en se servant de la relation de Pascal :
  • 39. Les types de Récursivité 4 Récursivité multiple Combinaison (n, p) Begin If ( p = 0 OR p = n) then return 1 Else return (Combinaison (n-1, p) + Combinaison (n-1, p-1)) End
  • 40. Les types de Récursivité 4 Récursivité mutuelle Des définitions sont dites mutuellement récursives si elles dépendent les unes des autres. Ça peut être le cas pour la définition de la parité : et
  • 41. Les types de Récursivité 4 Récursivité mutuelle Les algorithmes correspondants s’écrivent : Pair (n) Begin If ( n = 0 ) Then return (vrai) Else return (impair(n-1) ) End Impair (n) Begin If ( n = 0 ) Then return (faux) Else return ( Pair (n-1)) End
  • 42. Les types de Récursivité 4 Récursivité imbriquée La fonction d’Ackermann est définie comme suit : Ackermann (m, n) Begin If ( m = 0 ) Then return (n+1) else If (n=0) Then Return(Ackermann (m-1, 1)) else Return ( Ackermann (m-1, Ackermann (m, n-1)) ) End
  • 43. Exemple 4 Qu’est ce qu’il fait l’algorithme ??? Algoritheme(a,b) If (a <=0) then Erreur Else If (a>=b) return (a=b) Else Return (Algoritheme(a,b-a) ) End_Algoritheme L’algorithme ci-dessous teste si a est un diviseur de b.
  • 44. Exemple 4 Donner le resultat de l’excution pour n =5 Test 1(n) If (n = 0 )Then ne rien faire Else afficher n Test1 (n-1) End_if End_Test1 Test2(n) If ( n = 0) Then ne rien faire Else Test2(n-1) afficher n Endif End_Test2
  • 46. Exercie 4 Exercice 6 TD2 Considérer le programme (en encadré-2) On exécute le programme et on tape dans l’ordre les nombres suivants : 5, 7, 13, 4, 7, 0, 5, 15, 50, 0. Quels sont les nombres affichés à l’écran. Dérécursiver la fonction « traiter ». void traiter() { int x; cin >> x; if (x != 0) traiter(); cout << " , " << x; } void main () { traiter (); } ,0,7,4,13,7,5
  • 47. Exercie 4 Exercice 6 TD2 Considérer le programme (en encadré-2) On exécute le programme et on tape dans l’ordre les nombres suivants : 5, 7, 13, 4, 7, 0, 5, 15, 50, 0. Quels sont les nombres affichés à l’écran. Dérécursiver la fonction « traiter ». void traiter() { int x; cin >> x; if (x != 0) traiter(); cout << " , " << x; } void main () { traiter (); } Recursvite non terminale
  • 48. Exercie 4 Exercice 5TD2 Rendre récursive la fonction somme (en encadré-1). int somme (int *x , int n) { int i, s=0 ; for (i=0; i < n ; i++) s = s + x[i]; return s; }
  • 49. Exercie 4 Exercice 5 solution int somme (int *x , int n) { int i, s=0 ; if ( n ==1 ) return x[0];//ou n==0 return 0 Else return ( x[n-1]+ somme( int *x, n-1)) }
  • 50. Exemple d’algorithme récursif : les tours de Hanoï 4 Le problème Le jeu est constitué d’une plaquette de bois où sont plantées trois tiges numérotées 1, 2 et 3. Sur ces tiges sont empilés des disques de diamètres tous différents. Les seules règles du jeu sont que l’on ne peut déplacer qu’un seul disque à la fois, et qu’il est interdit de poser un disque sur un disque plus petit. Au début, tous les disques sont sur la tige 1 (celle de gauche), et à la fin ils doivent être sur celle de droite.
  • 51. Exemple d’algorithme récursif : les tours de Hanoï 4 Résolution : Principe : On suppose que l’on sait résoudre le problème pour (n-1) disques. Pour déplacer n disques de la tige 1 vers la tige 3, on déplace les (n-1) plus petits disques de la tige 1 vers la tige 2, puis on déplace le plus gros disque de la tige 1 vers la tige 3, puis on déplace les (n-1) plus petits disques de la tige 2 vers la tige 3.
  • 52. Exemple d’algorithme récursif : les tours de Hanoï 4 Algorithme Hanoi (n, départ, intermédiaire, destination) If n > 0 Then Hanoi (n-1, départ, destination, intermédiaire) déplacer un disque de départ vers destination Hanoi (n-1, intermédiaire, départ, destination) Endif End_Hanoi
  • 53. Exemple d’algorithme récursif : les tours de Hanoï 4 Trace L’appel à Hanoi(3,1,2,3) entraîne l’affichage de : 1. Déplace un disque de la tige 1 vers la tige 3 2. Déplace un disque de la tige 1 vers la tige 2 3. Déplace un disque de la tige 3 vers la tige 2 4. Déplace un disque de la tige 1 vers la tige 3 5. Déplace un disque de la tige 2 vers la tige 1 6. Déplace un disque de la tige 2 vers la tige 3 7. Déplace un disque de la tige 1 vers la tige 3
  • 54. Exemple d’algorithme récursif : les tours de Hanoï 4 Complexité On compte le nombre de déplacements de disques effectués par l’algorithme Hanoi invoqué sur n disques. T(n) = 1+ 2T(n-1) = 1+ 2 * ( 2 * T(n-2) +1) Suite géométrique de raison 2 = 2n -1  Complexite exponnentielle
  • 55. Exemple d’algorithme récursif : les tours de Hanoï 4 Le temps !!!!! En supposant que le déplacement d’un disque nécessite 1minute (il faut réfléchir et déplacer un disque qui peut être lourd puisqu’il est en or), et si on dispose de 64 disques, il faudrait : minutes = 3,50965 1013 = 35096,5 milliards d'années
  • 56. Exercice 4 Exercice 7: Pour convertir un nombre entier positif N de la base décimale à la base binaire, il faut opérer par des divisions successives du nombre N par 2. Les restes des divisions constituent la représentation binaire. Ecrire une fonction récursive « Binaire » permettant d’imprimer à l’écran la représentation binaire d’un nombre N (voir exemple en face). Donner la formule récurrente exprimant sa complexité en nombre de divisions. Estimer cette complexité. Binaire(13) 1101
  • 57. Exercice 4 Exercice 7 (correction) Void Binaire ( int n) { If ( n/2 = 0) Printf( « %d », n mod 2); else { Binaire (n/2); Printf( « %d », n mod 2); } } Nombre de division T(n)=T(n/2)+1 ( arbre récursive == log2(n)) Binaire(13) 1101
  • 58. Elimination de la récursivité 4 Dérécursiver, c’est transformer un algorithme récursif en un algorithme équivalent ne contenant pas d’appels récursifs. Elimination de la Récursivité terminale simple Rappel: Un algorithme est dit récursif terminal s’il ne contient aucun traitement après un appel récursif. La récursivité terminale simple peut être remplacée par une solution itérative.
  • 59. Elimination de la récursivité terminale 4 – U est la liste des paramètres ; – C est une condition portant sur U ; – a(U) représente la transformation des paramètres ; Algo récursif Algo Itératif Algorithme P(U) If ( Condition(U) ) Then Traitement_base (U); P(a(U)) ; Else Traitement_terminaison(U); Endif End_Algorithme Algorithme P’(U) While ( Condition(U) ) do Traitement_base(U); U a(U) End_while Traitement_terminaison; End_Algorithme
  • 60. Exemple 1:Elimination de la récursivité terminale 4 Version récursive Version dérécursivée Diviseur (a,b) If (a <=0) then Erreur Else If (a>=b) return (a=b) Else Return (Diviseur (a,b-a) ) End_Diviseur ?
  • 61. Exemple2 :Elimination de la récursivité terminale 4 Version récursive Version dérécursivée Diviseur (a,b) If (a <=0) then Erreur Else If (a>=b) return (a=b) Else Return (Diviseur (a,b-a) ) End_Diviseur Diviseur(a,b) If (a <= 0 )then Erreur While ( b > a ) b=b-a return (a=b) End_Diviseur
  • 62. Elimination de la récursivité non terminale 4 Dans un algorithme récursif non terminale , l’appel récursif est suivi d’un traitement  il reste un traitement à reprendre ultérieurement. Il va falloir donc sauvegarder, sur une pile, le contexte de l’appel récursif, typiquement les paramètres de l’appel engendrant l’appel récursif.  La récursive non terminale simple peut être remplacée par une solution itérative utilisant une pile.
  • 63. Elimination de la récursivité non terminale 4 Algorithme récursif Algorithme dérécursivé Algorithme Q(U) If ( Condition(U) ) Then Traitement_A(U); Q(a(U)); Traitement_B(U); Else Traitement_terminaison(U); Endif End_Algorithme Algorithme Q’(U) Pile.init() ; While (Condition (U)) do Traitement_A(U) ; Pile.push(U) ; U= a(U); Endwhile Traitement_terminaison (U) ; While (not Pile.empty()) do Pile.pop (U) ; Traitement_B(U) ; Endwhile End_Algorithme
  • 64. Exemple: Elimination de la récursivité non terminale 4 Version récursive Version dérécursivée void recursif(int n) { if ( n> 0) {cout<<"nIN : N = "<<n<< endl ; recursif(n-1); cout<<"nOUT : N = "<<n<<endl; }else cout << "nTerminaison"<<endl; } ?
  • 65. Exemple: Elimination de la récursivité non terminale 4 Version récursive Version dérécursivée void recursif(int n) { if ( n> 0) {cout<<"nIN : N = "<<n<< endl ; recursif(n-1); cout<<"nOUT : N = "<<n<<endl; }else cout << "nTerminaison"<<endl; } void non_recursif(int &n) { pile P;int k; P.init(); k=n; while (k>0) {cout<<"nIN : N = "<<k<< endl ; P.push(k); k--; } cout << "nTerminaison"<<endl; while (!P.empty()) { P.pop(n) ; cout << "nOUT : N = "<<n<<endl; } }
  • 66. Elimination de la récursivité 4 Remarque: Les programmes itératifs sont souvent plus efficaces, mais les programmes récursifs sont plus faciles à écrire. Il est toujours possible de dérécursiver un algorithme récursif.
  • 68. 4 Chapitre 3: Diviser pour régner
  • 69. Diviser pour régner 4 Principe -De nombreux algorithmes ont une structure récursive: pour résoudre un problème donné, ils s’appellent eux-mêmes récursivement une ou plusieurs fois sur des problèmes très similaires, mais de tailles moindres, résolvent les sous problèmes de manière récursive puis combinent les résultats pour trouver une solution au problème initial. -Le paradigme « diviser pour régner » donne lieu à 3 étapes à chaque niveau de récursivité : Diviser : le problème en un certain nombre de sous-problèmes ; Régner : sur les sous-problèmes en les résolvant récursivement ou, si la taille d’un sous-problème est assez réduite, le résoudre directement ; Combiner: les solutions des sous-problèmes en une solution complète du problème initial.
  • 70. Diviser pour régner 2 Principe -De nombreux algorithmes ont une structure récursive: pour résoudre un problème donné, ils s’appellent eux-mêmes récursivement une ou plusieurs fois sur des problèmes très similaires, mais de tailles moindres, résolvent les sous problèmes de manière récursive puis combinent les résultats pour trouver une solution au problème initial. -Le paradigme « diviser pour régner » donne lieu à 3 étapes à chaque niveau de récursivité : Diviser : le problème en un certain nombre de sous-problèmes ; Régner : sur les sous-problèmes en les résolvant récursivement ou, si la taille d’un sous-problème est assez réduite, le résoudre directement ; Combiner: les solutions des sous-problèmes en une solution complète du problème initial.
  • 71. Exemple1: Recherche de l’indice du maximum d’un tableau 3 Fonction maximum ( Tab , indDeb, indFin ) if ( indDeb = indFin) return indDeb; else m=(indDeb + indFin)/2; // division du problème en 2 sous-problèmes k1 = maximum (Tab, indDeb, m ) ;// régner sur le 1er sous-problème k2 = maximum (Tab, m+1, indFin);// régner sur le 2ème sous-problème if(Tab(k1) > Tab(k2)) // combiner les solutions return k1 else return k2 End_maximum  T(n) = 2T(n/2)+ 1
  • 72. Exemple2: Multiplication de matrices carrées 3 -Dans cet exemple, on se propose de multiplier 2 matrices carrées A et B de taille n chacun, nous supposerons que n est une puissance de 2. -Décomposons les matrices A, B et C en sous-matrices de taille n/2 x n/2. L’équation C = AB peut alors se récrire : - Le développement de cette équation donne: r = ae+bf ; s = ag+bh; t = ce+df ; u = cg+dh:
  • 73. Exemple2: Multiplication de matrices carrées 4 -Chacune de ces quatre opérations correspond à : deux multiplications de matrices carrées de taille n/2  2T(n/2) et une addition de telles matrices  O(n2) // n2/4 A partir de ces équations on peut aisément dériver un algorithme « diviser pour régner » dont la complexité est donnée par la récurrence : T(n) = 8T(n/2)+O(n2)
  • 74. Exercice: Recherche récursive du maximum d’une fonction 4 Soit une fonction à une dimension définie par N échantillons équidistants se trouvant dans un tableau X. On suppose que la fonction est unimodale (croissante puis décroissante) (Voir figure). On voudrait déterminer l’échantillon qui donne sa valeur maximale. Ecrire un algorithme récursif permettant de déterminer l’élément du tableau X contenant l’échantillon maximal selonl e paradigme « diviser pour régner ». Estimer sa complexité en terme de comparaisons.
  • 75. Correction: Recherche récursive du maximum d’une fonction 4 Fonction unimodale( int *x, indeb,indfin) M=indeb+indfin/2 Si ( x[m] > x[m-1] && x[m] > x[m+1]) Return X[m] Else Si ( x[m] > x[m-1] Return(unimodale( int *x, m+1,indfin) Else Return(unimodale( int *x, indeb,m-1) T(n)= T(n/2)+1
  • 76. Analyse des algorithmes « diviser pour régner » 5 - Lorsqu’un algorithme contient un appel récursif à lui-même, son temps d’exécution peut souvent être décrit par une équation de récurrence qui décrit le temps d’exécution global pour un problème de taille n en fonction du temps d’exécution pour des entrées de taille moindre. -La récurrence définissant le temps d’exécution d’un tel algorithme se décompose suivant les trois étapes du paradigme de base : 1. Si la taille du problème est suffisamment réduite, n <= c pour une certaine constante c, la résolution est directe et consomme un temps constant O(1). 2. Sinon, on divise le problème en a sous-problèmes chacun de taille 1/b de la taille du problème initial. Le temps d’exécution total se décompose alors en trois parties : - D(n) : le temps nécessaire à la division du problème en sous- problèmes. - aT(n/b) : le temps de résolution des a sous-problèmes. - C(n) : le temps nécessaire pour construire la solution finale à partir des solutions aux sous-problèmes.
  • 77. Analyse des algorithmes « diviser pour régner » 6 -La relation de récurrence prend alors la forme : -Soit f(n) la fonction qui régroupe D(n) et C(n). La fonction T(n) est alors définie: T(n)= aT(n/b)+ f(n) T(n)=aT(n/b)+c.nK
  • 78. Résolution des récurrence des algorithmes« diviser pour régner » 7 T(n)=aT(n/b)+c.nK Théorème de la résolution de la récurrence: -Si a > bk alors T(n) = O(nlog b (a)) -Si a = bk alors T(n) = O(nklogb(n)) -Si a < bk alors T(n) =O(f(n) = O(nk) -Exemple: multiplication des matrices T(n) = 8T(n/2)+O(n2) a =8 , b=2, k = 2  a > bk logb(a)= 3 T(n) = O(n3)