Diviser pour régner et Analyse des Algorithmes

Page 1 sur 19Lecteur de document UniversityLib

Diviser pour régner et Analyse des Algorithmes

Algorithmes, Complexité, Programmation · course

Voir tous les documents en programmation

Introduction

Algorithmes: Complexité, Analyse, Ordre

Diviser pour régner (Chapitre 2)

Programmation dynamique

Algorithmes voraces

Complexité du calcul

Diviser-pour-régner

Pour résoudre un problème P avec la méthode

« diviser-pour-régner »:

1. On subdivise P en sous problèmes P1, P2, … , PN de

même nature que le problème du départ P, mais de moindre

taille.

2. résoudre chacun des problèmes P1, P2, … , PN en

utilisant le même algorithme « d’une façon récursive »

3. On combine les solutions de ces sous problèmes pour

obtenir la solution du problème initial P.

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

Diviser-pour-régner

Diviser-pour-régner

Diviser une instance d'un problème en une

ou plusieurs instances plus petites.

Résoudre chacune des petites instances (Régner) .

A moins qu'une de ces instances ne soit

suffisamment triviale pour être résolue

directement, utiliser le processus de division

récursivement.

Combiner si nécessaire les solutions des

plus petites instances pour obtenir

la solution du problème global.

fonction DPR(x)

{la fonction retourne comme valeur la solution du problème avec input l'instance x}

si x est suffisamment simple alors

retourner SOLU-AD-HOC(x)

sinon décomposer x en sous-instances plus simples x1, …, xk

pour i=1 jusqu'a k faire

yi = DPR(xi)

combiner les yi pour obtenir une solution y pour x

retourner y

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

1

Diviser-pour-régner: Exemples

Exemple - Recherche binaire

  • Recherche binaire
  • Tri par Fusion (MergeSort)
  • Tri de Hoare (QuickSort)
  • Sélection de la médian

Si la liste est triée

S[bas]----------------------------------------------S[haut]

  • Algorithme de Strassen pour la multiplication de matrices

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

Exemple - Recherche binaire

Exemple - Recherche binaire

Opération Diviser:

comparer l'élément central avec x

si x est trouvé, terminer

fonction position(bas, haut)

S

sinon garder la partie ou x pourrait se trouver

if bas > haut then position:= 0;

(On a divisé le problème en un autre de taille moitié.)

Régner: Résoudre le sous tableau de taille moitié

Combiner: Pas nécessaire

[continuer jusqu'a ce que x est trouvé ou le sous tableau ]

else

Milieu:=  (bas +haut)/2 ;

if S[Milieu] = x then

position:= Milieu;

else if x < S[Milieu] then

position:=position(bas, Milieu-1);

else

position:=position(Milieu+1, haut);

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

2

Exemple - Recherche binaire

(RAPP: Version itérative: W(n) = 2 log n + 2)

Analyse dans le Pire Cas (Algorithme 2.2)

Taille du problème: n, le nombre d'éléments

Opérations élémentaires: comparaisons

Pire Input: ?

1. Diviser : Comparer avec le milieu: 1

2. Résoudre: on doit résoudre récursivement UN SEUL

sous problème de taille n/2. Donc on a W(n/2)

3. Combiner: Rien

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

Supposons que n est une puissance de 2 …..

Théorème

W(n) =  log n  + 1

Pour n = 1, W(n) = 1

Pour n > 1, W(n) = W(n/2) + 1

Récurrence a résoudre:

 W(n) = W(n/2) + 1 pour n > 1

 W(1) = 1

W(n) = lg n + 1, si n est une puissance de 2.

Preuve par induction?

Preuve par induction

Base:

n=1  log 1  + 1 = 1

Hypothèse d'induction:

Soit n > 1 pour tout 1 ≤ k ≤ n on assume que

W(K) =  log K  + 1

Considère n

W(n) = 1 + W(  n/2  )

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

3

Case 1) n pair

Relation de recurrence

Case 2) n impair

W(n) = W( n/2  )+1

= W(n/2 )+1

W(n) = W( n/2  ) + 1

= W((n- 1)/2 ) + 1

Par hypothèse d'induction

Par hypothèse d'induction

= (  log n/2  + 1 ) + 1

=  log n - log 2  + 2

=  log n - 1  + 2

=  log n  + 1

CSI3505 - Paola Flocchini

Analyse: Cas Moyen

Si la valeur cherché x est dans la liste

Ii = inputs qui permettent de trouver l’élément cherché

avec i appels

P(I1) = ?

I1

I2

.

.

.

Ii

t(I1) = 1

t(I2) = 2

t(Ii) = i

= (  log ((n - 1)/2)  + 1 ) + 1

=  log (n-1) - log 2  + 2

=  log (n-1) - 1  + 2

=  log (n-1)  + 1

Parce-que

 log (n-1) - 1  =

 log (n-1)  - 1

Quand est-ce que  log (n-1)  ≠  log n  ??

Seulement quand n est une puissance de 2

CSI3505 - Paola Flocchini

mais n est impair ...

I1

t(I1) = 1

P(I1) = probabilité que x se trouve exactement au milieu

= 1/n

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

4

I2

t(I2) = 2

P(I2) = ?

P(I2) = probabilité que x se trouve dans les positions ¼ ou ¾

= 2/n

I3

t(I3) = 3

P(I3) = ?

P(I3) = probabilité que x se trouve …..

CSI3505 - Paola Flocchini

4/n

Problème du Tri

Problème:

ordonner n valeurs dans une séquence croissante

Données:

un entier positif n, un vecteur de valeurs S indexé

de 1 à n

Résultat:

Le vecteur S contenant les valeurs dans un ordre

croissant

CSI3505 - Paola Flocchini

I1

I2

I3

.

.

.

Ii

t(I1) = 1

t(I2) = 2

t(I3) = 4

P(I1) = 1/n

P(I2) = 2/n

P(I3) = 4/n

t(Ii) = i

P(I3) = 2 i-1 /n

Combien d’appelles récursifs ?

log n + 1

Donc

log n +1

Publicité

A(n) = Σ i ⋅ 2 i-1 /n

i=1

CSI3505 - Paola Flocchini

= log n ⋅ 2(log n +1) +1

n

Exemple - Tri par fusion - MERGESORT

1. Diviser le tableau en deux sous-tableaux

à peu près égaux en taille (environ n/2).

2. Résoudre le problème du tri pour chaque

sous-tableau (à l'aide du tri par fusion).

3. Combiner les sous-tableaux triés en les

fusionnant en un seul tableau trié,

en utilisant l'algorithme

de fusion 2.3

Exemple 2.2 et Figure 2.2 dans le livre

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

5

Exemple - Tri par fusion

Exemple - Tri par fusion

Etape 1 – Diviser

62317425

7425

6231

25

74

31

62

5

2

4

7

1

3

2

6

Résoudre

CSI3505 - Paola Flocchini

Etape 2 – Combiner

5

2

4

7

1

3

2

6

O(n)

52

74

31

62

7542

6321

76543221

O(n)

O(n)

O(n)

CSI3505 - Paola Flocchini

Exemple - Tri par fusion

Exemple - Tri par fusion

U,V: les sous-vecteurs

20

4

7

6

1

3

9

5

Diviser

20

4

7

6

20

4

7

6

1

1

3

3

9

5

9

5

20

4

7

6

1

3

9

5

4

20

6

7

1

3

5

9

Combiner

4

6

7

20

1

3

5

9

1

3

4

5

6

7

9

20

CSI3505 - Paola Flocchini

TriFusion(n,S)

h ← n div 2

m ← n - h

if n > 1 then

copier S[1] … S[h] en U

copier S[h+1]…. S[n] en V

TriFusion(h,U)

TriFusion(m,V)

Fusionner(h,m,U,V,S)

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

6

Fusionner(h,m,U,V,S)

i ← 1; j ← 1; k ← 1;

while i <= h and j<=m do

if U[i] < V[j] then

else

S[k] ← U[i]

i ← i+1

S[k] ← V[j]

j ← j+1

k ← k+1

if i> h then

copy V[j] …. V[m] en S[k] …. S[k+m]

else

copy V[i]…..V[ ] en S[k]…..S[k+m]

CSI3505 - Paola Flocchini

Fusionner(h,m,U,V,S)

2 5 6 9 12 15 20 27

U

4 7 10 13 16

V

2 4 5 6

S

Comparer U[i] et V[j] et mettre le plus petit en S

Incrémenter l'index de la liste ou le plus petit

se trouvait et incrémenter l'index de S

Lorsque l’on arrive a la fin d'une liste,

copier ce qui reste de l'autre liste en S.

CSI3505 - Paola Flocchini

Exemple - Tri par fusion

Analyse dans le Pire Cas (Algorithme 2.2)

Exemple - Tri par fusion

Analyse dans le Pire Cas (Algorithme 2.2)

Taille du problème: n, le nombre d'éléments

Opérations élémentaires: comparaisons

Pire Input: ?

1. Diviser : calculer le milieu. 0

2. Résoudre: on doit résoudre récursivement deux

sous-problèmes de taille n/2. Donc on a 2W(n/2)

3. Combiner: fusionner les deux sous listes triées: n-1

CSI3505 - Paola Flocchini

Supposons que n est une puissance de 2 …..

Pour n = 1, W(n) = 0

Pour n > 1 W(n) = = W(n/2) + W(n/2) + n-1

Récurrence a résoudre:

W(n) = 2 W(n/2) + n - 1 pour n > 1

W(1) =0

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

7

W(n) = 2 W(n/2) + n - 1 pour n > 1

W(n) = 2 ( 2 W(n/4) + n/2 –1) + n - 1

= 22 W(n/4) + n-2 + n - 1

= 2 ( 2 ( 2 W(n/8) + n/4 –1 ) + n/2 –1) + n - 1

= 23 W(n/8) + n-4 + n-2 + n - 1

= 2i W(n/ 2i ) + n- 2i-1 + n- 2i-2 + …. + n-2 + n - 1

= 2i W(n/ 2i ) + Σ (n- 2j )

i-1

j=0

CSI3505 - Paola Flocchini

W(n) = 2i W(n/ 2i ) + Σ (n- 2j )

i-1

j=0

Nous savons que W(1) = 0

1 = n/ 2i quand i = log n

n

Σ Xi= Xi-1

X -1

i=0

log n -1

W(n) = 0 + Σ (n- 2j )

j=0

log n -1

log n -1

= Σ n - Σ 2j

Publicité

j=0

j=0

= n log n – 2 log n -1

2 -1

CSI3505 - Paola Flocchini

Exemple - Le tri de Hoare - QUICKSORT

Exemple - Le tri de Hoare - QUICKSORT

Choisir comme pivot l'un des éléments du

tableau

Partitionner le tableau autour du pivot.

On déplace les éléments de telle

sorte que ceux qui sont supérieurs

se retrouvent a droite du pivot, les

autres a gauche

Trier récursivement les sous-tableau sans

besoin de fusionner

Quicksort(bas, haut)

{ trie le tableau T[bas...haut] en ordre croissant }

si ( haut > bas )

piv ← Pivoter(bas, haut)

Quicksort(bas,piv-1)

Quicksort(piv +1, haut)

{ suite au pivotage,

bas≤ k < piv ⇒ T[k] ≤ T[piv ]

et piv ≤ k < haut ⇒ T[k] > T[piv] }

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

8

Pivoter(bas, haut)

{permute les éléments du tableau de telle sorte que, a la fin bas≤ piv < haut,

tous les éléments de T[bas.. piv -1] sont inférieurs ou égaux à T[piv]=p et les

éléments de T[piv+1 .. haut] sont supérieurs à p }

elempivot := T[bas]

j ← bas

for( i= bas + 1; i≤ haut; i++ )

if T[i] < elempivot then

{ j ← j+1

échanger T[i] et T[j] }

piv:=j

échanger T[bas] et T[piv]

return (piv)

CSI3505 - Paola Flocchini

Analyse de QUICKSORT- Cas Pire

Taille du problème: n, le nombre d'éléments

Opérations élémentaires: echanges

Pire Input: ???

CSI3505 - Paola Flocchini

Analyse de QUICKSORT- Cas Pire

Analyse de QUICKSORT- Cas Pire

1. Diviser : n-1 (le temps pour pivoter)

2. Résoudre: récursivement deux sous-problèmes de

taille 0 et n-1. Donc on a besoin de W(0) + W(n-1)

3. Combiner: rien

CSI3505 - Paola Flocchini

Partitionnement non -équilibré à chaque étape de l'algo

Tableau déjà trié

W(n) = W(0) + W(n-1) + n-1

pivotage ..

Pour trier la partie gauche

Pour trier la partie droite

W(n) = W(n-1) + n-1

W(0) = 0

n>0

CSI3505 - Paola Flocchini

O(n2)

CSI3505 - Paola Flocchini

9

Analyse de QUICKSORT- Cas meilleur

Analyse de QUICKSORT- Cas moyen

Partitionnement produit deux régions de taille n/2

  • toutes les permutations des nombre d'éntrées sont

W(n) = 2W(n/2) + n-1

W(0) = 0

n>0

O(n log n)

CSI3505 - Paola Flocchini

A(n) = n-1 + 1/n Σ A(p-1) + Σ A(n-p) =

n

n

p=1

p=1

n

n-1 + 2/n Σ A(p-1) =

p=1

A(1) = A(0) = 0

n

A(n) = n-1 + 2/n Σ A(p-1)

p=1

équiprobables

Certain pivotages sont bien équilibrés, certains sont

déséquilibré

A(1) = A(0) = 0

n

A(n) = Σ 1/n [ A(p-1) + A(n-p) ] + n-1

p=1

Probabilité que le

pivot soit en position p

Trier sous-tableau quand

le pivot est en position p

CSI3505 - Paola Flocchini

Pivotage

A(1) = A(0) = 0

n

A(n) = n-1 + 2/n Σ A(p-1)

p=1

A(n) = n-1 + 2/n Σ A(p-1) =

n A(n) = n(n-1) + 2 Σ A(p-1)

p=1

n

(n-1) A(n-1) = (n-1) (n-2) + 2 Σ A(p-1)

Donc pour n-1

n-1

p=1

soustracting

n A(n) - (n-1) A(n-1) = 2(n-1) + 2 A(n-1)

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

10

n A(n) - (n-1) A(n-1) = 2(n-1) + 2 A(n-1)

n (n+1)

n (n+1)

A(n) = A(n-1) + 2(n-1)

(n+1)

n

n (n+1)

Soit an = A(n)/ (n+1)

an = an-1 + 2/n

O(nlog n)

an = an-1 + 2(n-1)

n (n+1)

a0 = 0

Similaire a: an = an-1 + 2/n

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

Exemple: Sélection de la médian

Exemple: Sélection de la médian

Plus général: sélection de l’élément k-eme.

2 6 4 8 10 18 3 9 19 13 14

2 3 4 6 8 9 10 13 14 18 19

médian

Faisons l’hypothèse que les éléments sont distincts

Algorithme simple

Trier: O(n log n)

Prendre l’élément en position n/2

O(n log n)

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

11

Exemple: Sélection de la médian

Select(S,k)

Algorithme linéaire

Hypothèses (pour simplicité):

1) Les éléments sont distincts

2) n = 5 (2r +1)

Ex: n = 35 ou n = 55 ….

CSI3505 - Paola Flocchini

1) si |S| ≤ 5

retourner l’elem. K-eme

2) Diviser les élément en groupes de cinq et trouver

la médian de chaque groupe. Soit M l’ensemble qui contient

les médians.

> m1

m1

< m1

> mi

…..

mi

…..

< mi

M = {m1 , … , mi , … , m2r +1 }

CSI3505 - Paola Flocchini

n = 5 (2r +1)

Select(S,13)

Select(S,13)

> m1

m1

< m1

15

11

7

5

2

22

7

5

3

1

21

17

4

3

1

21

17

12

10

8

18

16

15

14

3

21

Publicité

17

4

3

1

22

6

5

3

1

15

11

7

5

2

21

17

12

10

8

18

16

15

14

3

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

12

3) m* = Select(M,|M|/2)

A> mi

< mi

C

< m*

<

<

m*

<

B

> m*

<

D

Select(M,3)

> 7

m*

15

11

7

5

2

21

17

12

10

8

18

16

15

14

3

22

6

5

3

1

21

17

4

3

1

<7

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

3) m* = Select(M,|M|/2)

A> mi

< mi

C

< m*

<

<

m*

<

B

> m*

<

D

4) Comparer chaque élément en A et D avec m*

Soit S1 = C ∪ { clef de A ∪ D qui sont plus petits que m*}

Soit S2 = B ∪ {clef de A ∪ D qui sont plus grands que m*}

> 7

22

6

5

3

1

m*

15

11

7

5

2

21

17

12

10

8

18

16

15

14

3

D

A

21

17

4

3

1

<7

Soit S1 = C ∪ { clef de A ∪ D qui sont plus petits que m*}

Soit S2 = B ∪ {clef de A ∪ D qui sont plus grands que m*}

Je cherche maintenant le 7-eme de ce qui reste

S1 = 2,3,5,6

S2 = 8,10,11,14,15,17,21,22

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

13

5) Si ( k = |S1| +1 ) m est le k-eme, retourner m

sinon si (k <= | S1 | )

le k-eme se trouve en S1

retourner (Select(S1,k) )

sinon

le k-eme se trouve en S2

retourner (Select(S2,k-|S1|-1) )

Complexité

Soit n = 5 (2r +1)

Taille du problème: n, le nombre d'éléments

Opérations élémentaires: comparaisons

Pire Input: ???

S1 = 2,3,5,6

S2 = 8,10,11,14,15,17,21,22

CSI3505 - Paola Flocchini

(Select(S2,7-4-1) )

CSI3505 - Paola Flocchini

n = 5 (2r +1)

r groupes de 5

2r

A

C

< m*

<

<

m*

<

2(r+1) +r = 3r +2

B

> m*

<

D

2r

2) Diviser les élément en groupes de cinq et trouver la médian de

chaque groupe

Trouver la median d’un groupe de 5 = 6 comparaisons

3r +2

Tot: 6 n/5 comparaisons

3) m* = Select(M,|M|/2)

|M| = n/5

W(n/5) comparaisons

4) Comparer chaque élément en A et D avec m*

4 r comparaisons

|A| + |D| = 4r

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

14

S1 = C ∪ { clef de A ∪ D qui sont plus petits que m*}

S2 = B ∪ {clef de A ∪ D qui sont plus grands que m*}

5) Si ( k = |S1| +1 ) retourner m*

sinon si le k-eme se trouve en S1

retourner (Select(S1,k) )

sinon retourner (Select(S2,k) )

Cas Pire:

tous les 4r éléments dans A et D sont dans la même cote de m*

( tous plus petits ou tous plus grands).

B et C contienent 3r + 2 elem chacun

Max{| S1 | ,| S2 |} = |A|+|D|+|C| = 7r +2

W(7r + 2) comparaisons

CSI3505 - Paola Flocchini

6 n/5 + W(n/5) + 4 r + W(7r + 2)

r est approximativement n/10 -

W(n) ≤ 1.2 n + W(n/5) + 0.4 n + W(7/10 n)

W(n) ≤ W(n/5) + W(7/10 n) + 1.6 n

Solution: O(n)

CSI3505 - Paola Flocchini

Exemple - Algorithme de Strassen pour la

Exemple - Algorithme de Strassen

multiplication matricielle

L’algorithme 1.4 a une complexité de W(n) = n3.

Avec l’Algorithme 1.4, pour multiplier deux matrices de

taille 2x2 on a besoin de faire 23 =8 multiplications

a11 a12

Publicité

a22

a21

x

b11 b12

b22

b21

=

c11 c12

c22

c21

On peut le faire en utilisant 7 multiplications scalaires

L'idée de Strassen

Calculer 7 valeurs: m1, m2 … m7

chaqu'un avec une seule multiplication.

ou c12 = a11 b12 + a12 b22

Exprimer chaque cij comme somme et soustractions des mi

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

15

m1 = (a11 + a22 ) (b11 + b22 )

m2 = (a21 + a22 ) b11

m3 = a11 (b12 - b22 )

m4 = a22 (b21 - b11 )

m5 = (a11 + a12 ) b22

m6 = (a21 - a11 ) (b11 + b12 )

m7 = (a12 - a22 ) (b21 + b22 )

m1 + m4 - m5 + m7

m3 + m5

C =

m2 + m4

m1 + m3 - m2 + m6

Verifique …...

c12

doit être égal a

a11 b12 + a12 b22

CSI3505 - Paola Flocchini

Exemple - Algorithme de Strassen

• Vérification:

m1 + m4 - m5 + m7

= (a11 + a22 ) (b11 + b22 ) + a22 (b21 - b11 ) -(a11 + a12 ) b22 + (a12 - a22 ) (b21 + b22 )

= (a11 b11 + a11 b22+ a22b11 + a22b22) + (a22b21 - a22b11 ) -(a11b22 + a12b22) +

(a12 b21+ a12 b22 - a22b21 - a22b22 ) =

= a11 b11 + a12 b21 = c11

m1 + m4 - m5 + m7

m3 + m5

C =

m2 + m4

m1 + m3 - m2 + m6

CSI3505 - Paola Flocchini

Exemple - Algorithme de Strassen

  • Pour les matrices de taille plus grande que 2 on applique

la même stratégie.

  • Pour simplifier l’analyse on suppose que n est une

puissance de 2 …… n = 2 k

  • Décomposer la matrice de taille nxn en 4 sous matrices,

chacune de taille n/2 x n/2

Disons que n est une puissance de 2 …… n = 2 k

Décomposer chaque matrice en 4 sous-matrices

A11

A12

A21

A22

A = 2n x 2n

A11 = n x n

A11 =

a11 a12 ……..

a22

a21

a1n/2

a2n/2

an/2 1 an/2 2

an/2 n/2

CSI3505 - Paola Flocchini

M1 = (A11 + A22) ( B11 + B22)

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

16

Exemple - Algorithme de Strassen

Nous pouvons alors multiplier deux matrices

2n x 2n avec 7 multiplications de matrices n x n

(plus un certain nombre de soustractions)

c11 c12

c22

c21

C11

C21

C12

C22

=

=

a11 a12

a22

a21

A11

A12

A21

A22

x

x

b11 b12

b22

b21

B11

B21

B12

B22

M1 + M4 - M5 + M7

M3 + M5

C =

M2 + M4

M1 + M3 - M2 + M6

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

Strassen(n,A,B,C)

if n <= seuil then

calculer C ← A x B en utilisant l'algo classique

else

partitionner A en 4 sous-matrices A11 A12 A21 A22

partitionner B en 4 sous-matrices B11 B12 B21 B22

calculer C ← A x B en utilisant Strassen

Strassen(n/2, A11+ A22, B11+ B22 , M1)

Strassen(n/2, A21 + A22 , B11 , M2)

Strassen(n/2, A12 - A22 , B21 + B22 , M7)

C ← sommes et soustractions des Mi

Algorithme de Strassen : analyse du cas pire

Taille du problème: n

Opérations élémentaires: multiplications

Pire Input: ?

n = 2 k

Nous allons considerer comme seuil: n = 1

W(1) = 1

W(n) = 7 W(n/2)

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

17

W(1) = 1

W(n) = 7 W(n/2)

W(n) = 7 W(n/2)

= 7 W(2k-1)

= 7 ( 7 W(2k-2 ))

= …

= 7i W(2k-i )

= …

= 7k W(20)

= 7k W(1)

= 7k

W(n) = 7 log n

CSI3505 - Paola Flocchini

Théorème

Prouver formellement que W(n) = 7 log n

Preuve

Par induction.

Base.

W(1) = 1

Hypothèse

d'induction.

vrai pour 1 ≤ m ≤ n

Considère n.

W(n) = 7 W(n/2)

= 7 (7 log (n/2) )

= 7 log (n/2) + 1

= 7 log n - log2 + 1

= 7 log n - 1 + 1

CSI3505 - Paola Flocchini

= 7 log n

Résume

Multiplication matricielle

• Et si on ne compte que les additions et

soustractions:

Algorithme classique (1.4): n2 (n-1) = n3 – n2

n x n

A x B

n x n

1. Algo classique (1.4)

2. Algo de Strassen

Algorithme Strassen: (voir Exemple B.20, App.B)

W(n) = 7 W(n/2) + 18 (n/2)2

W(1) = 0

Solution: 6nlog7 – 6n2 = 6n2.81 – 6 n2

Classique

Strassen

Multiplications

n2.81

n3

7 log n =

Additions +

soustractions

n3 -n2

6n 2.81 - 6 n 2

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

18

Dans le pire cas, la complexité de Strassen est

O (n2.81)

Peut-on faire mieux que Strassen?????

Coppersmith & Winograd (1987) O(n 2.38)

On ne peux pas faire mieux que Ω(n2)

Ω(n2) ≤ Meilleure algorithme ≤ O(n 2.38)

?

CSI3505 - Paola Flocchini

CSI3505 - Paola Flocchini

19