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)

la complexité des algorithmes en toute simplicité

  • 1.
    1 Complexité et optimalité AnnéeUniversitaire 2014/2015 Niveau : 4 Sana REFAI Sana.refai@gmail.com
  • 2.
    1 Algorithmique avancée etcomplexité Année Universitaire 2014/2015 Niveau : 4
  • 3.
    Présentation du module 2 Cours Projet Coursclassique +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ès7 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
  • 5.
  • 6.
    Introduction & Motivations 4 -Algorithme Unalgorithme 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ésexigé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 : Valeurd’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 fork=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 deHorner) 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+ roù 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 fonctionde 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.
  • 22.
    Définitions(1/3) 4 La complexité d’unalgorithme 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 Dnl’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 algorithmeest 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 parinsertion 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 parinsertion 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 parinsertion 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 parinsertion 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 Lesalgorithmes 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.
  • 32.
  • 33.
  • 34.
    4 Chapitre 3: LaRécursivité
  • 35.
    Introduction 4 Récursivité De l’art etla 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 deRé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 deRé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 deRé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 deRé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 deRé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 deRé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 deRé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’ilfait 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 resultatde 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
  • 45.
  • 46.
    Exercie 4 Exercice 6 TD2 Considérerle 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érerle 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écursivela 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 intsomme (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 convertirun 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) VoidBinaire ( 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 laré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 laré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 dela 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 dela 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 laré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 laré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 dela 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 dela 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 laré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.
  • 67.
  • 68.
  • 69.
    Diviser pour régner 4 Principe -Denombreux 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 -Denombreux 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 del’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 dematrices 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 dematrices 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écursivedu 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écursivedu 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écurrencedes 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)