120 likes | 535 Views
Multiplicação de Matrizes. Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares. Problema. Encontrar uma ordem para a multiplicação de matrizes que minimize o número de operações. Sabendo que o custo de multiplicar uma matriz
E N D
Multiplicação de Matrizes Colégio Batista Santos Dumont Olimpíada Brasileira de Informática Wladimir Araújo Tavares
Problema • Encontrar uma ordem para a multiplicação de matrizes que minimize o número de operações. Sabendo que o custo de multiplicar uma matriz A n x m por uma matriz B m x p é n x m x p.
Seja A1 :5 x 2 A2 :2 x 3 A3 : 3 x 4 A4 :4 x 5 Veja que existe vários sub-problemas que se repetem.
Podemos atacar esse problema resolvendo todas as multiplicações envolvendo 2 matrizes e depois para a multiplicações envolvendo 3 matrizes e finalmente resolver o problema. Vamos denotar m[i,j] = custo de multiplicar as matrizes de Ai...Aj. Vamos denotar b[i-1],b[i] como as dimensões das matrizes. b[0]=5 b[1]=2 b[2]=3 b[3]=4 b[4]=5 Multiplicações envolvendo 1 matriz tem custo 0. Multiplicações envolvendo 2 matrizes: m[1,2] = 5 x 2 x 3 = 30 m[2,3] = 2 x 3 x 4 = 24 m[3,4] = 3 x 4 x 5 = 60
Multiplicação envolvendo 3 matrizes: Podemos calcular A1 x A2 x A3 de duas formas: (A1 x A2 )x A3 = m[1,2] +m[3,3]+ b[0] x b[2] x b[3] = 30 + 0 + 5 x 3 x 4 = 90. A1 x (A2 x A3) = m[1,1] +m[2,3] b[0] x b[1] x [3] = 0 + 24 + 5 x 2 x 4 = 64. O custo mínimo para calcular m[1,3] =64 Podemos calcular A2 x A3 x A4 de duas formas (A2 x A3 )x A4 = m[2,3] +m[4,4]+ b[1] x b[3] x b[4] = 24 + 0 + 2 x 4 x 5 = 64 A2 x (A3 x A4) = m[2,2] +m[3,4] b[1] x b[2] x [4] = 0 + 60 + 2 x 3 x 5 = 90 m[2,4]=64
Para a multiplicação de tamanho 2 temos 4 formas: A1 x (A2 x A3 x A4) = m[1,1] + m[2,3] + b[0] x b[1] x b[4] 0 + 64 + 2 x 5 x 5 = 114 ((A1 x A2) x (A3 x A4)) = m[1,2] + m[3,4] +b[0] x b[2] x b[4] 30+ 60 + 2 x 3 x 5 = 120 (A1 x A2 x A3)x A4 = m[1,3] + m [4,4] + b[0] x b[3] x b[4] 64 + 0 + 2 x 4 x 5 = 104 Logo, m[1,4] = 104
Em geral, m[i,j] = min i<=k<j( m[i,k] + m[k+1,j] + b[i-1] x b[k] x b[j]) Se resolvermos primeiro os casos menores poderemos utilizar estes resultados para construir casos maiores.
Algoritmo Para i=1 até n faça m[i,i] = 0 variando as diagonais Para u=1 até n-1 faça Para i = 1 ate n – u faça j = i + u min = ∞ s[i,j] = 0 Para k = i ate j faca q = m[i,k] + m[k+1][j] + b[i-1] * b[k] * b[j] Se q < min então { min = q s[i,j] = k } m[i,j] = min
Construindo a solução ótima Print-MCM(s,i,j) if i=j then imprima “Ai” else imprima "(" + Print-MCM(s,1,s[i,j]) + "*" + Print-MCM(s,s[i,j]+1,j) + ")"