Beruflich Dokumente
Kultur Dokumente
Principaux paradigmes
Diviser pour rgner Algorithmes rcursifs Principe de diviser pour rgner Ex. : Multiplication de Polynmes Ex. FFT Multiplication de matrices Programmation dynamique Distance de Levenshtein
A. Duret-Lutz
Alexandre Duret-Lutz
adl@lrde.epita.fr
18 dcembre 2009
2
Principes Chane de Multiplications de matrices Plus longue sous-squence commune Algorithmes gloutons Principe Distributeur de Monnaie Proprits gloutonnes Le problme de la loutre Codage de Human
2 / 60
A. Duret-Lutz
Algorithmique
1 / 60
Algorithmique
Algorithmes rcursifs
To understand what is recursion you must rst understand recursion.
Diviser pour rgner Algorithmes rcursifs Principe de diviser pour rgner Ex. : Multiplication de Polynmes Ex. FFT Multiplication de matrices Programmation dynamique Distance de Levenshtein
A. Duret-Lutz
Principes Chane de Multiplications de matrices Plus longue sous-squence commune Algorithmes gloutons Principe Distributeur de Monnaie Proprits gloutonnes Le problme de la loutre Codage de Human
3 / 60
Principe de la rcursivit On sait grer des cas simples. (Cas de bases) On sait passer d'un cas compliqu un cas plus simple. On passe des cas compliqus aux cas simples de proche en proche. Avantages Algorithmes concis et faciles prouver Inconvnient Une appel rcursif est assez coteux (temps & espace). On a souvent avantage implmenter des versions non-rcursives. Mais les compilateurs peuvent optimiser les recursions terminales : un appel rcursif en n de fonction est transform en boucle.
A. Duret-Lutz Algorithmique 4 / 60
Algorithmique
Power(v , n) 1 if n = 0 then return 1 2 return v Power(v , n 1) L'appel Power n'est pas terminal : il y a une multiplication ensuite. Power(v , n) 1 return Power'(v , n, 1) Power'(v , n, res ) 1 if n = 0 then return res 2 return Power(v , n 1, v res ) Maintenant la rcursion est terminale, elle peut tre rcrite : Power'(v , n, res ) 1 if n = 0 then return res 2 n n1 3 res v res 4 goto 1
A. Duret-Lutz Algorithmique 5 / 60
Multiplication de Polynmes
P1 (x ) = an x n + + a1 x + a0 P2 (x ) = bn x n + + b1 x + b0 P3 (x ) = P1 (x )P2 (x ) = c2n x 2n + + c1 x + c0
On a ck =
i +j =k
ai bj .
Mthode simple
c0 = a0 b0 c1 = a0 b1 + a1 b0
. . . . . .
cn = a0 bn + + an b0 cn+1 = a1 bn + + an b1 c2n = an bn
On fait alors 3 multiplications au lieu de 4. Gnralisons : si degr(P ) = 2m 1 = n 1, alors P1 (x ) = an1 x n1 + + a1 x + a0 peut s'crire On utilise donc une approche diviser pour rgner.
Q1 (x )
A. Duret-Lutz
Algorithmique
9 / 60
si n = 1 si n > 1
Par application du thorme gnral (a = 3, b = 2, f (n) = (n) domine par nlog 3 ) on obtient :
2
A. Duret-Lutz
Algorithmique
12 / 60
P1 P2
P = P1 P2
13 / 60
Complexit ?
Complexit ?
Algorithmique
valuation en n points
valuer un polynme de degr n 1 en un point cote (n). Il n'est pas possible de faire mieux. (Pourquoi ?) valuer un polynme de degr n 1 en n points coterait (n2 ) si l'on enchane les n valuations. Avec une telle complexit, il est inutile de chercher reprsenter un polynme par valeurs pour pouvoir le multiplier plus vite : la conversion initiale est dj plus chre que Karatsuba... Heureusement, en choisissant les points d'valuation astucieusement, on peut faire (beaucoup) mieux que (n2 ). L'astuce consiste valuer le polynme aux racines n-imes de l'unit :
k =e n
2 ik
n
Un calcul naf de F (A) demande (n2 ) oprations. Le choix des points d'valuation nous permet de faire ces calculs plus rapidement avec une approche diviser pour rgner.
A. Duret-Lutz Algorithmique 16 / 60
j =0 n/21
posons j = 2m ou j = 2m + 1
2km
a[2m]n
n/21 m=0
k a[2m](n )km + n
2
n/21
2 km a[2m + 1](n )
Pour trouver les termes de [[n/2, n[[ on s'appuie sur la priodicit des (k +n/2)j k +n/2 kj k. racines de l'unit : n = n = n /2 /2 et n
k [[0, n/2[[,
A. Duret-Lutz
A. Duret-Lutz
1 1 1 1 1 2 n 1 n n n 1 2 ( n 1 ) 2 4 ij ] n n W = 1 n = [n . . . . ... . . . . . . . . 2 ( n 1 ) ( n 1 )( n 1 ) n 1 1 n n n 1 ij [n ] en considrant [pij ] = WW 1 . On a Montrons que W 1 = n (i j )k 1 1 ik kj pij = n . Clairement pii = 1. Et si i = j , k n n = n k n n ( ) 1 ( ) 1 1 1 i j k k =0 (n ) = 1 = 1 = 1 = 0. Donc P = Id . On en dduit que 1 n1 kj
i n
n n
a[k ] =
n j =0
b[j ]n
19 / 60
A. Duret-Lutz
Algorithmique
20 / 60
a[k ] =
j =0 n1 j =0
kj b[j ]n
b = F (a) a = F (b) n
On peut donc rutiliser la FFT pour calculer son inverse. Le surcot de (n) oprations (calculs des conjugus et divisions par n) tant ngligeable devant le cot en (n log n) de la FFT.
A. Duret-Lutz Algorithmique 21 / 60
22 / 60
ci , j =
= AB
avec
k =1
ai ,k bk ,j
n=
A. Duret-Lutz
1500 2000 2500 3000 3500 4000 4500 5000 5500 6000 6500 7000 7500 8000 8500 9000 9500 10000 10500 11000 11500 12000 12500 13000 13500 14000 14500
Algorithmique
A. Duret-Lutz
Algorithmique
24 / 60
Algorithme de Strassen
Comme dans l'algorithme prcdent, on suppose les matrices n dcoupes en quatre blocs de taille n 2 2. Posons
M1 M3 M5 M7
=(A1,1 + A2,2 )(B1,1 + B2,2 ) =A1,1 (B1,2 B2,2 ) =(A1,1 + A1,2 )B2,2 =(A1,2 A2,2 )(B2,1 + B2,2 )
On a alors :
C1,1 C1,2 C2,1 C2,2
=A1,1 B1,1 + A1,2 B2,1 =A1,1 B1,2 + A1,2 B2,2 =A2,1 B1,1 + A2,2 B2,1 =A2,1 B1,2 + A2,2 B2,2
M2 =(A2,1 + A2,2 )B1,1 M4 =A2,2 (B2,1 B1,1 ) M6 =(A2,1 A1,1 )(B1,1 + B1,2 )
on a alors
Ceci suggre un algorithme rcursif de calcul des coecients de C . Quelle est sa complexit ?
A. Duret-Lutz Algorithmique 25 / 60
Ceci suggre un second algorithme rcursif de calcul des coecients de C . Quelle est sa complexit ?
A. Duret-Lutz Algorithmique 26 / 60
Programmation dynamique
1
Programmation dynamique
Principes Chane de Multiplications de matrices Plus longue sous-squence commune Algorithmes gloutons Principe Distributeur de Monnaie Proprits gloutonnes Le problme de la loutre Codage de Human
27 / 60
Diviser pour rgner Algorithmes rcursifs Principe de diviser pour rgner Ex. : Multiplication de Polynmes Ex. FFT Multiplication de matrices Programmation dynamique Distance de Levenshtein
A. Duret-Lutz
Il s'agit encore une fois de dnir le problme rcursivement Mais cette fois-ci, les dirents sous-problmes partagent des sous-sous-problmes. On veut viter de recalculer chaque sous problme plusieurs fois On stocke ces rsultats dans un tableau.
Algorithmique
A. Duret-Lutz
Algorithmique
28 / 60
Exemples :
dL (maks , make ) = 1 dL (maks , emacs ) = 2
A. Duret-Lutz
Algorithmique
29 / 60
A. Duret-Lutz Algorithmique
31 / 60
32 / 60
ne nombre de Catalan = C2
n n
n 1 C2 n
36 / 60
A. Duret-Lutz
38 / 60
BestCost(p, i , j ) 1 if i = j then return 0 2 m[i , j ] + 3 for k i to j 1 do 4 q BestCost(p , i , k ) + BestCost(p , k + 1, j ) + pi 1 pk pj 5 if q < m[i , j ] then m[i , j ] q 6 return m[i , j ] Si n = j i + 1, on a
T (n) = (1) +
=2
n 1 k =1 n1 k =1
(T (k ) + T (n k ) + 1)
T (k ) + n = (2n )
A. Duret-Lutz
Algorithmique
1
10
2
0
4
540
5
640
m
840
1
640
2
260
390 240 80 0 2
4
0
1200 15 0
100 0 5
5
10
2
A1
3
1
4
1
A2
5
3 2
3 3
A3
2 i 3 3
3 3
A4
4
A5
A1 A1 A2 A3 A4 A5
10 15 0 si i = j 15 8 m[i , j ] = 82 mini k <j {m[i , k ] + m[k + 1, j ] + pi 1 pk pj } 25 5 10 Meilleur parenthsage : ((A1 (A2 A3 ))(A4 A5 ))
A. Duret-Lutz Algorithmique 42 / 60
A2
A3
A4
A5
L'algorithme MatrixChain possde trois boucles imbriques qui font chacune au plus n itrations. Un dcompte plus prcis permet de montrer T (n) = (n3 ).
T (n) = O(n3 )
A. Duret-Lutz
Algorithmique
43 / 60
A. Duret-Lutz
44 / 60
si i = 0 ou j = 0 si i , j > 0 et xi = yi si i , j > 0 et xi = yi
On voit tout de suite que la procdure pour calculer la longueur maximale sera en (mn) : il sut de remplir le tableau ligne par ligne jusqu' obtenir C [m, n]. Pour produire la PLSC il faut retenir les choix qui ont t faits, comme dans MatrixChain. On utilise un tableau B pour cela.
A. Duret-Lutz Algorithmique 45 / 60
46 / 60
Algorithmes gloutons
1
O 0
U 0
T 0 1
R 0 2 2 2 2 2
E 0 Diviser pour rgner Algorithmes rcursifs Principe de diviser pour rgner Ex. : Multiplication de Polynmes Ex. FFT Multiplication de matrices Programmation dynamique Distance de Levenshtein
A. Duret-Lutz
0 0 0 0 0 0
0 0 1 1 1 1
0 0 2 2 2
1 1 2
1 1 2 2
2 2 2 3
Principes Chane de Multiplications de matrices Plus longue sous-squence commune Algorithmes gloutons Principe Distributeur de Monnaie Proprits gloutonnes Le problme de la loutre Codage de Human
48 / 60
A. Duret-Lutz
Algorithmique
47 / 60
Algorithmique
Algorithmes gloutons
Rsolvent un problme d'optimisation, comme la programmation dynamique. Leur mthode est compltement dirente. Un algorithme glouton rsoud un problme pas pas en faisant localement le choix qu'il estime le meilleur. Il espre ainsi trouver la meilleure solution globale. P.ex. un algorithme glouton du voyageur de commerce visite toujours la ville non-visite la plus proche de la dernire ville visite. Ingrdients : un ensemble de candidats pour crer la solution une fonction select, pour choisir le meilleur candidat ajouter la solution une fonction feasible vrie si un ensemble de candidats est faisable une fonction is_solution indique quand une solution a t trouve
A. Duret-Lutz Algorithmique
49 / 60
A. Duret-Lutz
Algorithmique
50 / 60
Rendu de Monnaie
La monnaie : C = {2, 2, 1, 1, .50, .50, .20, .20, .10, , .10}. Soit v = 1.90 rendre avec le moins de pices possible. L'algorithme glouton : is _solution(S ) = v = select (C , S ) = max C
feasible (S ) =
v
i S i
Proprits gloutonnes
Proprit du choix glouton : on peut arriver une solution globalement optimale en eectuant un choix localement optimal. Le choix peut dpendre des choix faits jusque l, mais pas des choix qui seront faits ensuite (e.g. solutions des sous-problmes). Dans le rendu de monnaie partir des pices v1 v2 vn on montre que pour tout montant v tel que vi < v vi +1 , il n'existe pas de solution optimale qui n'utilise pas vi +1 . Sous-structure optimale : une solution optimale du problme contient la solution optimale de sous-problmes. Dans le rendu de monnaie, si S {x } est une solution optimale pour rendre v partir de C , alors S est une solution optimale pour rendre v valeur (x ) partir de C \ {x }.
51 / 60 A. Duret-Lutz Algorithmique 52 / 60
i S i
La solution trouve : S = {1, .50, .20, .20}. Cette solution est-elle optimale ? Ici, oui. En gnral, cela dpend de C . Par exemple avec C = {1, .50, .30, .30, .30, .5, .5, .5} la solution gloutonne serait {1, .50, .30, .5, .5} et non {1, .30, .30, .30}.
A. Duret-Lutz Algorithmique
54 / 60
A. Duret-Lutz
Algorithmique
55 / 60
A. Duret-Lutz
Algorithmique
56 / 60
A. Duret-Lutz
Algorithmique
57 / 60