Chap3 - WordPress.com

publicité
Université Abou Bakr Belkaid
Faculté des Sciences
Département d’informatique
Algorithmique Avancée et Complexité
Chap3:Diviser pour Régner
RSD -GL
2015-2016
1
Principe
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 , si la taille d’un sousproblè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.
2
Exemple
MULTIPLIER-MATRICES(A, B)
Soit n la taille des matrices carrés A et B
Soit C une matrice carré de taille n
Algorithme Classique
Pour i =1 à n faire
Pour j= 1 à n faire
cij:= 0
Pour k =1 à n faire
cij:= cij+ aik bkj
renvoyer C
La complexité de cet algorithme est θ(n3) .
3
Exemple :multiplication naïve de matrices


Algorithme « diviser pour régner »
on suppose que n est une puissance exacte de 2.
on décompose les matrices A, B et C en sousmatrices de taille n/2*n/2. L’équation C = A*B
peut être ecrit:

aprés développement de cette équation, nous obtenons :

Puisque l’addition des matrices carrés de taille n/2 est Q(n2).
4
Complexité
• La complexité d’un algorithme « diviser pour régner » 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 Q (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 :
(a) D(n) : le temps nécessaire à la division du problème en sousproblèmes.
(b) aT(n/b) : le temps de résolution des a sous-problèmes.
(c) C(n) : le temps nécessaire pour construire la solution finale à
partir des solutions aux sous-problèmes.
5
Complexité

La relation de récurrence prend alors la forme :

où l’on interprète n/b soit comme
,soit comme
6
Complexité
7
Exemple1





multiplication naïve de matrices
a=8,b=2 f(n) =θ(n²)
Appliquons le théorème précédent:
log a=3  cas 1
ξ =1  T(n)= θ(n3) donc rien ne
change
b
8
Exemple1

Algorithme de Strassen pour la multiplication de matrices
p1
p3
p5
p7
=
=
=
=
a(g – h)
(c + d)e
(a + d)(e + h)
(a - c)(e + g)
p2 = (a + b)h
p4 = d(f - e)
p6 = (b - d)(f + h)
r = p5 + p4 - p2 + p6
s = p1 + p2
t = p3 + p4
u = p5 + p1-p3 - p7
7 multiplication et 18 addition
T(n) = 7T(n/2)+θ(n²).
T(n)= θ (nlog27) ~ θ (n2.8 )
Donc  meilleur que l’algorithme classique
9
Exemple Tri par fusion
Principe
L’algorithme de tri par fusion est construit suivant le paradigme
« diviser pour régner » :
1. Il divise la séquence de n nombres à trier en deux sousséquences de taille n/2.
2. Il trie récursivement les deux sous-séquences.
3. Il fusionne les deux sous-séquences triées pour produire la
séquence complète triée.
La récursion termine quand la sous-séquence à trier est de
longueur 1 car une telle séquence est toujours triée.
10
Exemple Tri par fusion
Diviser Fusionner
11
Exemple Tri par fusion

FUSIONNER(A, p, q, r)
i :=p
j :=q+1
Soit C un tableau de taille r- p+1
K:= 1
tant que i≤ q et j ≤ r faire
si A[i] < A[ j] alors C[k] :=A[i]
i :=i+1
sinon C[k] :=A[ j]
J:= j+1
K:= k+1
tant que i ≤ q faire C[k]:= A[i]
i :=i+1
K:= k+1
tant que j ≤ r faire C[k] :=A[ j]
j :=j+1
k :=k+1
pour k :=1 à r- p+1 faire
A[p+k-1] :=C[k]
12
Exemple Tri par fusion
Étudions les différentes étapes de l’algorithme :
– les initialisations ont un coût constant θ(1) ;
– la boucle tant que de fusion s’exécute au plus r- q fois, chacune de ses
itérations étant de coût constant, d’où un coût total en θ(r-q) ;
– les deux boucles tant que complétant C ont une complexité respective au
pire de q- p+1 et de r-q, ces deux complexités étant en θ(r- p) ;
– la recopie finale coûte θ(r- p+1).
Par conséquent, l’algorithme de fusion a une complexité en θ(n)
13
Complexité Tri par fusion
• Pour déterminer la formule de récurrence qui nous donnera la
complexité de l’algorithme TRI-FUSION, nous étudions les trois
phases de cet algorithme « diviser pour régner » :

Diviser : cette étape se réduit au calcul du milieu de
l’intervalle [p..r] sa complexité est donc en θ(1).

Régner : l’algorithme résout récursivement deux sousproblèmes de tailles respectives n/2

Combiner : la complexité de cette étape est celle de
l’algorithme de fusion qui est de θ(n) pour la construction
d’un tableau solution de taille n.
14
Complexité Tri par fusion

Par conséquent, la complexité du tri par fusion
est donnée par la récurrence :

Pour déterminer la complexité du tri par
fusion, nous utilisons de nouveau le théorème.
• Ici a=2 et b=2 donc logba =1, et nous nous trouvons dans le deuxième
cas du théorème
• par conséquent :
15
Complexité Tri par fusion

Pour des valeurs de n suffisamment grandes, le
tri par fusion avec son temps d’exécution en
Q(nlogn)est nettement plus efficace que le tri
par insertion dont le temps d’exécution est en
Q(n2).
16
AVANTAGES ET INCONVÉNIENTS



L'avantage  résolution des pièces plus réduites
du même problème par le même code.
dépassement des ressources autorisées.
Le temps d'exécution est plus long à cause de
sauvegarde et de récupération des tâches sur la
pile.
17
Téléchargement