Analyse des récurrences diviser pour régner Théorème. Soit a > 0, b > 1, et d 0, et supposons que T(n = at( n/b + f(n avec f(n = O(n d log c n alors O(n d log c n si d > log b a T(n = O(n log c+1 n O(n log b a log c n si d = log b a si d < log b a. 1 n d log c n a ( n b d log c n b a 2 ( n b 2 d log c n b 2 1 f(n a f( n b a 2 f( n b 2 a k ( n b k d log c n b k profondeur k tq n b k 1, ie k log b n. a k f( n b k 3-1 1-1 3-2 Analyse des récurrences diviser pour régner Théorème. Soit a > 0, b > 1, et d 0, et supposons que T(n = at( n/b + f(n avec f(n = O(n d log c n alors O(n d log c n si d > log b a T(n = O(n log c+1 n O(n log b a log c n si d = log b a si d < log b a. 1 n d log c n si d > log b a, la suite ( a b d k ց a ( n b d log c n la série converge: coût cte f(n a 2 ( n b 2 d log c n si d = log b a, alors ( a b d k = 1 coût/niveau constant: log(n f(n a k ( n b k d log c n profondeur k tq n b 1, ie k log k b n. si d < log b a, la suite ( a b d k ր coût dominant en bas: a log b n f(cte 2-1 Min Distance: diviser pour régner E un ensemble de points Problème: Déterminer min d(x, y. x,y E Algo exhaustif: calculer O(n 2 distances. Diviser pour régner: C(n C(n = 2C(n/2 + O(n log n Diviser l espace de recherche en 2 parties.tri initial en O(nlog n Résoudre le sous-problème dans chaque partie. 2C(n/2 Recoller les solutions partielles. Tri vertical des pts de la bande, puis comparaison de chaque sommet aux k suivants (montrer que k = 3 suffit: O(n log n. n/2 pts = O(n log 2 n n/2 pts largeur 2m m = min(m 1, m 2
6-1 Plus longue sous-suite croissante: mémoisation une liste d entiers e 1,..., e n. Problème: trouver une sous-suite croissante de longueur maximale 5 2 6 3 6 9 7 Soit E l ensemble des couples (j, i tels que j < i et e j < e i. On cherche un plus long chemin dans le graphe orienté ([n], E Diviser pour régner? Retenir les calculs déjà fait (mémo! Les meilleures solutions pour e 1,..., e k et e k+1,..., e n ne se recollent pas forcément: 5 2 6 avec 3 6 9 7. Il faudrait connaitre dans les 2 sous-parties, les plus longues sousséquences terminant par k pour tout k: récursivement on traite un nombre exponentiel de problèmes différents Organiser les mémos... polynomial 4-1 Recherche de la médiane une liste d entiers L = e 1,..., e n. Problème: trouver k tel que {i e i > e k } = {i e i < e k }. Algorithme de base: trier en O(n log n Diviser pour régner: on étend le problème: select(i,l Soit e k un pivot, et 3 ensembles obtenus en n comparaisons : L = {i e i < e k }, L = = {i e i = e k } et L + = {i e i > e k } < select(j, L si j < L, select(j, L = e : k si L < j < L L =, select(j L L =, L + sinon Comment choisir le pivot? On voudrait L L /2, mais cela revient à choisir la médiane... Choisir le pivot au hasard! En moyenne C(n C(3n/4 + O(n = O(n. Une généralisation: chemins dans un DAG u v(e = 1 un DAG, une valuation des arêtes Problème. Déterminer un chemin de poids p(u, v = max 1+...+p(e k Exemple: plus longs ou plus courts chemins dans un DAG plus longue sous-séquence maximale 7-1 5-1
Une généralisation: chemins dans un DAG u v(e = 1 7 un DAG, une valuation des arêtes 2 3 6 9 Problème. Déterminer un chemin de poids 1 5 4 p(u, v = max p(e 1+...+p(e k Récurrence: un chemin arrivant en x finit par une arête (y, x donc si u x, alors p(u, x = max (p(u, y + p(y, x (y,x E Algorithme: Ordonner u, x 1, x 2,... les sommets accessibles de sorte que les arêtes soient croissantes (tri topologique, INF431. Calculer les p(u, x i dans l ordre des i ր, et pour chaque i marquer l arête qui donne le max. Remonter les arêtes marquées depuis v. Une généralisation: chemins dans un DAG u v(e = 1 7 un DAG, une valuation des arêtes 2 3 6 9 Problème. Déterminer un chemin de poids 1 5 4 p(u, v = max p(e 1+...+p(e k Récurrence: un chemin arrivant en x finit par une arête (y, x donc si u x, alors p(u, x = max (p(u, y + p(y, x (y,x E Algorithme: Ordonner u, x 1, x 2,... les sommets accessibles de sorte que les arêtes soient croissantes (tri topologique, INF431. 7-4 7-2 Une généralisation: chemins dans un DAG u v(e = 1 7 un DAG, une valuation des arêtes 2 3 6 9 Problème. Déterminer un chemin de poids 1 5 4 p(u, v = max p(e 1+...+p(e k Récurrence: un chemin arrivant en x finit par une arête (y, x donc si u x, alors p(u, x = max (p(u, y + p(y, x (y,x E Algorithme: Ordonner u, x 1, x 2,... les sommets accessibles de sorte que les arêtes soient croissantes (tri topologique, INF431. Calculer les p(u, x i dans l ordre des i ր, et pour chaque i marquer l arête qui donne le max. -1 7-3
Le problème du sac à dos S(P les poids p 1,..., p n de n objets et leurs valeurs v 1,..., v n Problème: trouverle sous-ensembledepoids P devaleurmaximale Hypothèse: on suppose les poids entiers et P pas trop grand On utilise la programmation dynamique: on peut considérer les sous-problèmes S(p pour p < P S(p = max i,p i p (v i + S(p p i Exemple: objets p i 2 4 7 v i 3 1 5 ok si on peut prendre le même objet plusieurs fois 5 1 3 DAG associé 0 p 7 p 4 p 2 p P La programmation dynamique (programmation=planification, dynamique=pas fixée d avance La programmation dynamique s applique quand : la solution optimale du problème de taille k contient en un certain sens des solutions optimales de sous-problèmes de taille inférieure. on peut calculer l optimum du problème de taille k à partir d une petite quantité d information sur les solutions des sous-problèmes. Elle consiste à résoudre toutes les instances duproblème par ordre croissant de taille retenirtoutesles instances pouvantencore servir à uneétape ultérieure. Les chemins dans un DAG: un exemple générique les sommets représentent les sous-problèmes les arêtes les dépendances entre problèmes et sous-problèmes 11-1 9-1 Le problème du sac à dos S(p les poids p 1,..., p n de n objets et leur valeur v 1,..., v n Chaque objet ne peut être pris qu une fois On considère S(k, p, le meilleur sac de poids p utilisant uniquement des objets parmi 1,..., k j S(k 1, p S(k, p = max Exemple: objets p i 2 4 7 v i 3 1 5 dans tous les cas v k + S(k 1, p p k si p k p p 0 1 2 3 4 5 6 7 S(0, p 0 0 0 0 0 0 0 0 S(1, p 0 0 3 3 3 3 3 3 S(2, p 0 0 3 3 3 3 4 4 S(3, p 0 0 3 3 3 3 4 5 +3 +1 +5 12-1 10-1
m i 6 4 1 2 1 0 2 0 3 0 On calculer des produits de matrices dont les tailles sont fixées. 4 1 2 A (B (C D = 240 1.2. 6 4 1 2 4.1. 6.4. C D (A (B C D= 152 4.1.2 6.4.2 6.2. B (A B (C D = A 6.4.1 1.2. 6.1. L ordre des produits joue sur la complexité: M((k, l, (l, m klm, On veut un algorithme qui trouve le meilleur parenthésage. Algorithme glouton: faire d abord le produit le moins coûteux. sur l exemple on obtient (A (B C D, non optimal... On essaye la programmation dynamique. 15-1 13-1 m i 6 4 1 2 1 0 24 2 0 c(1, 3 = min k ( 1: 0 + + 6.4.2 = 56 2: 24+0+6.1.2 = 36 les tailles m i m i+1 des matrices M i pour i = 1..., n Problème: trouver le meilleur parenthésage du produit M 1 M n. Remarque: Dans un parenthésage optimal, toute paire de parenthèses entoure un parenthésage optimal du facteur qu elle délimite. On considèreles sous-problèmes parenthésageoptimal desfacteurs c(i, j =coût min du calcul M i M j. Récurrence: c(i, j est donné par le meilleur découpage de la forme M i M j = (M i M k (M k+1 M j avec les 2 facteurs optimaux c(i, j = min avec c(i, i = 0, et c(i, i + 1 = m i m i+1 m i+2. 15-2 14-1
m i 6 4 1 2 Complexité: espace n 2, temps n 3. On trouve le parenthésage optimal à l aide d une table des meilleurs k. 1 0 24 36 2 0 4 1 1 2 2 2 2 2 3 3 4 c(1, 4 = min k ( 1: 0+4+6.4. = 240 2: 24+16+6.1. = 3: 36+0+6.2. = 132 (M 1 M 2 (M 3 M 4 Complexité: temps linéaire m i 6 4 1 2 1 0 24 36 2 0 c(2, 4 = min k ( 2: 0+16+4.1. = 4 3: +0+4.2. = 72 15-5 15-3 16-1 Distance d édition et alignement de séquences Deux mots u, v sur l alphabet A = {A, C, G, T } et une fonction de similarité des lettres σ : (A { } 2 R. Problème: trouver l alignement (U, V qui maximise P i σ(u i, V i. u = GATGCAT v = ATCGAT σ(x, x = 2 σ(x, = 1 σ(x, y = U G A T G C A T V A T C G A T σ(u, V = 1 + 2 + 2 1 + 2 1 + 2 + 2 Hypothèses: σ(x, y d autant plus grand que x et y se ressemblent. pour tout x, σ(x, x > 0 > σ(, x. Récurrence: pours i,j = meilleur alignement de u 1... u i avec v 1... v j. < S i 1,j 1 + σ(u i, v j si i > 0 et j > 0 S i,j = max S i 1,j + σ(u i, si i > 0 : S i,j 1 + σ(, v j si j > 0 15-4 m i 6 4 1 2 1 0 24 36 2 0 4 c(1, 4 = min k ( 1: 0+4+6.4. = 240 2: 24+16+6.1. = 3: 36+0+6.2. = 132
Distance d édition et alignement de séquences On veut calculer S n,n à partir de S 0,0 = 0 et de la récurrence < S i 1,j 1 + σ(u i, v i si i > 0 et j > 0 S i,j = max S i 1,j + σ(u i, si i > 0 : S i,j 1 + σ(, v i si j > 0 Pour calculer les S i,j avec i + j = k on a besoin que des S i,j avec i + j = k 1 ou k 2 on peut se contenter d un espace linéaire. Mais dans ce cas on ne veut pas garder la table des meilleurs choix. On peut trouver le meilleur alignement en espace linéaire par une approche diviser pour régner. Soit i 0 = u /2, on calcule le score a j = S i0,j pour tout j ainsi que b j = Si 0,j score du meilleur alignement de la 2ème moitié de u avec v j+1... v m pour tout j: espace linéaire. On choisit le k = argmax j (a j + b j on recommence dans les 2 moitiés séparément. 17-1 3 idées pour des problèmes avec une structure récursive: diviser pour régner, mémoïsation, programmation dynamique 1-1