Universit Abou Bakr Belkaid Facult des Sciences Dpartement
Université Abou Bakr Belkaid Faculté des Sciences Département d’informatique Algorithmique Avancée et Complexité Chap 3: Diviser pour Régner RSD -GL 2015 -2016 1
Principe v. Diviser : le problème en un certain nombre de sous-problèmes. v. 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 ; v. 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 θ(n 3). 3
Exemple : multiplication naïve de matrices n n 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: n aprés développement de cette équation, nous obtenons : n Puisque l’addition des matrices carrés de taille n/2 est Q(n 2). 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 sous -problèmes. (b) a. T(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é n La relation de récurrence prend alors la forme : n où l’on interprète n/b soit comme , soit comme 6
Complexité 7
Exemple 1 n n n 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)= θ(n 3) donc rien ne change b 8
Exemple 1 n Algorithme de Strassen pour la multiplication de matrices p 1 p 3 p 5 p 7 = = a(g – h) (c + d)e (a + d)(e + h) (a - c)(e + g) p 2 = (a + b)h p 4 = d(f - e) p 6 = (b - d)(f + h) r = p 5 + p 4 - p 2 + p 6 s = p 1 + p 2 t = p 3 + p 4 u = p 5 + p 1 -p 3 - p 7 7 multiplication et 18 addition T(n) = 7 T(n/2)+θ(n²). T(n)= θ (nlog 27) ~ θ (n 2. 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 sous-sé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 n 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 » : n n n 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 n n 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 trouvons dans le deuxième cas du théorème • par conséquent : 15
Complexité Tri par fusion n 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(n 2). 16
AVANTAGES ET INCONVÉNIENTS n n n 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
- Slides: 17