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