Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic Počet operací v násobení dvou matic ... ... ... ... ... ... = ... b ... ... a ... ... ... a ... ... ... ... ... ... ... ... c ... ... b c = 1 ... b b ... 1 b operací násobení pro výpočet jednoho prvku výsledné matice a * c prvků ve výsledné matici Vynásobení dvou matic o rozměrech ab a bc vyžaduje celkem a * b * c operací násobení dvou prvků (čísel). Sčítání zde neuvažujeme, lze pro něj vyvinout analogický postup.
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic Příklad násobení více matic 30 + 24 = 54 op. 40 + 60 = 100 op. 3 3 4 4 3* 2 * 4 = 24 op. 5 * 3 * 4 = 60 op. 2 3 3 5 4 5 2 4 5 * 3 * 2 = 30 op. 0 op. 0 op. 2 * 5 * 4 = 40 op. 2 2 3 3 5 5 4 4 5 5 2 2
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic A1 = A2 = A3 = 2 3 5 4 5 2 Součin (A1 A2) A3 vyžaduje 54 operace násobení . Součin A1 (A2 A3) vyžaduje 100 operací násobení. Evidentně, na způsobu uzávorkování záleží . Catalanova čísla CN Součin A1 A2 A3 ... AN lze uzávorkovat CN = Comb(2N, N) / (N+1) způsoby. C1, C2, ..., C7 = 1, 1, 2, 5, 14, 42, 132. CN > 2N pro N > 7. V obecném případě by mělo vyzkoušení všech uzávorkování exponenciální složitost.
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic Ilustrace 14 různých způsobů uzávorkování součinu 5 činitelů A1 (A2 (A3 (A4 A5))) A1 (A2 ((A3 A4) A5)) A1 ((A2 A3) (A4 A5)) A1 ((A2 (A3 A4)) A5) A1 (((A2 A3) A4) A5) (A1 A2) (A3 (A4 A5)) (A1 A2) ((A3 A4) A5) (A1 (A2 A3)) (A4 A5) ((A1 A2) A3) (A4 A5) (A1 (A2 (A3 A4))) A5 (A1 ((A2 A3) A4)) A5 ((A1 A2) (A3 A4)) A5 ((A1 (A2 A3)) A4) A5 (((A1 A2) A3) A4) A5
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic Instance úlohy Máme spočítat co nejefektivněji součin reálných matic A1 A2 A3 A4 A5 A6, kde rozměry jednotlivých matic jsou po řadě 30 35, 35 15, 15 5, 5 10, 10 20, 20 25. (Výsledná matice D má rozměr 30 20). Grafická podoba (dimenze matic ve správném poměru) A1 A2 A3 A4 A5 A6 D = Instance převzata z [CLRS], kap. 15.
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic A1 A2 A3 A4 A5 A6 D = Sledujeme jen počet operací součinu dvou reálných čísel. Uvažujeme různé možnosti uzávorkování a tím i pořadí výpočtu. metoda Výraz Počet operací zleva doprava ((((A1 A2) A3) A4) A5) A6 43 500 zprava doleva A1 (A2 (A3 (A4 (A5 A6)))) 47 500 nejhorší A1 ((A2 ((A3 A4) A5)) A6) 58 000 nejlepší (A1 (A2 A3)) ((A4 A5) A6) 15 125
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic A1 (A2 A3 A4 ... AN-1 AN) (A1 A2) (A3 A4 ... AN-1 AN) (A1 A2 A3) (A4 ... AN-1 AN) N 1 možných míst, v nichž výraz rozdělíme a provedeme poslední násobení (A1 A2 A3 A4) ( ... AN-1 AN) . . . (A1 A2 A3 A4 ...) (AN-1 AN) (A1 A2 A3 A4 ... AN-1) AN Předpokládejme, že máme předpočítáno optimální uzávorkování pro každý modrý úsek celkového výrazu.
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic A1 (A2 A3 A4 ... AN-1 AN) = B[1,1] B[2,N] (A1 A2) (A3 A4 ... AN-1 AN) = B[1,2] B[3,N] (A1 A2 A3) (A4 ... AN-1 AN) = B[1,3] B[4,N] (A1 A2 A3 A4) ( ... AN-1 AN) = B[1,4] B[5,N] . . . . . . (A1 A2 A3 A4 ...) (AN-1 AN) = B[1,N-2] B[N-1,N] (A1 A2 A3 A4 ... AN-1) AN = B[1,N-1] B[N,N] Matice B[i, j] představuje výsledek vynásobení odpovídajícího úseku. Nechť r(X) resp. s(X) představují počet řádků resp sloupců matice X. Podle pravidel násobení matic platí r(B[i, j]) = r(Ai), s(B[i, j]) = s(Aj), pro 1 ≤ i ≤ j ≤ N.
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic Nechť MO[i, j] představuje minimální počet operací potřebných k výpočtu matice B[i, j], tj. minimální počet operací potřebných k výpočtu matice Ai Ai+1 ... Aj-1 Aj. B[1,1] B[2,N] MO[1,1] + r(A1)*s(A1)*s(AN) + MO[2, N] B[1,2] B[3,N] MO[1,2] + r(A1)*s(A2)*s(AN) + MO[3, N] B[1,3] B[4,N] MO[1,3] + r(A1)*s(A3)*s(AN) + MO[4, N] . . . B[1,N-2] B[N-1,N] MO[1,N-2] + r(A1)*s(AN-2)*s(AN) + MO[N-1, N] B[1,N-1] B[N,N] MO[1,N-1] + r(A1)*s(AN-1)*s(AN) + MO[N, N] operací v levém úseku operací při násobení B[1,.] B[.,N] operací v pravém úseku Celkem dostáváme MO[1,N]: MO[1,N] = min {MO[1,k] + r(A1)*s(Ak)*s(AN) + MO[k+1, N] | k = 1..N-1}
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic MO[1,N] = min {MO[1,k] + r(A1)*s(Ak)*s(AN) + MO[k+1, N] | k = 1..N-1} Za předpokladu znalosti MO[i, j] pro úseky kratší než [1, N], lze řešení celé úlohy, tj. hodnotu MO[1, N], spočíst v čase (N). (*) Rekurentní využití řešení menších podúloh Identické úvahy, jaké jsme provedli pro celý výraz A1 A2 A3 ... AN , provedeme rovněž pro každý jeho souvislý úsek ... AL AL+1 ... AR-1 AR ..., 1 ≤ L ≤ R ≤ N. Počet těchto souvislých úseků je stejný jako počet dvojic indexů (L, R), kde 1 ≤ L ≤ R ≤ N. Ten je roven Comb(N, 2) (N2). Podúlohu na úseku (L, R) lze spočíst podle (*) v čase O(N), celou úlohu tak lze vyřešit v čase O(N3).
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic * MO[L,R] = min {MO[L,k] + r(AL)*s(Ak)*s(AR) + MO[k+1,R] | k = L..R-1} Hodnoty MO[L,R] ukládáme do 2D pole na pozici s indexy [L][R]. Při výpočtu MO[L,R] podle používáme vesměs hodnoty MO[x,y], kde rozdíl y - x (odpovídající délce podvýrazu) je menší než rozdíl R - L. Tabulku DP proto vyplňujeme v pořadí rostoucích rozdílů R - L. 0. Vyplníme prvky s indexy[L][R], kde R-L = 0, to je hlavní diagonála. 1. Vyplníme prvky s indexy[L][R], kde R-L = 1, to je diagonála těsně nad hlavní diagonálou. 2. Vyplníme prvky s indexy[L][R], kde R-L = 2, to je diagonála těsně nad předchozí diagonálou. ... N-1. Vyplníme prvek s indexem [L][R], kde R-L = N-1, to je pravý horní roh tabulky. *
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic Schéma postupu výpočtu R - L = 0 R - L = 1 R - L = 2 R - L = 3 R - L = N-2 R - L = N-1 Stop
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic MO[L,R] = min {MO[L,k] + r(AL)*s(Ak)*s(AR) + MO[k+1,R] | k = L..R-1} Ukázka postupu výpočtu MO[3,8] = min { MO[3,3] + r(A3)*s(A3)*s(A8) + MO[4,8], MO[3,4] + r(A3)*s(A4)*s(A8) + MO[5,8], MO[3,5] + r(A3)*s(A5)*s(A8) + MO[6,8], MO[3,6] + r(A3)*s(A6)*s(A8) + MO[7,8], MO[3,7] + r(A3)*s(A7)*s(A8) + MO[8,8]} Označme P[L, R] := r(AL)*s(AR). Potom 0 + s(A3)*P[3,8] + w, a + s(A4)*P[3,8] + x, b + s(A5)*P[3,8] + y, c + s(A6)*P[3,8] + z, d + s(A7)*P[3,8] + 0}. MO 8 3 3 a b c d w x y z
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic Instance úlohy A1 A2 A3 A4 A5 A6 D = 30 35 35 15 15 5 5 10 10 20 20 25 30 25 MO 1 2 3 4 5 6 1 0 15750 7875 9375 11875 15125 2 0 0 2625 4375 7125 10500 3 0 0 0 750 2500 5375 4 0 0 0 0 1000 3500 5 0 0 0 0 0 5000 6 0 0 0 0 0 0 optimum
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic MO[L,R] = min {MO[L,k] + r(AL)*s(Ak)*s(AR) + MO[k+1,R] | k = L..R-1} Při určení MO[L,R] do rekonstrukční tabulky RT stejné velikosti jako MO zaneseme na pozici [L][R] hodnotu k, v níž minimum nastalo. Hodnota k určuje optimální rozdělení výrazu na dva menší optimálně uzávorkované výrazy Hodnota RT[1, N] určuje optimální rozdělení celého výrazu na první dva menší optimálně uzávorkované výrazy Dále rekonstrukce optimálního uzávorkování pokračuje rekurzivně analogicky Rekonstrukce uzávorkování * * (AL AL+1 ... AR) (AL AL+1 ... Ak) (Ak+1 Ak+2 ... AR) A1 A2 ... AN (A1 A2 ... Ak) (Ak+1 Ak+2 ... AN). pro výraz (A1 A2 ... Ak) a pro výraz (Ak+1 Ak+2 ... AN) a dále pro jejich podvýrazy atd.
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic RT 1 2 3 4 5 6 1 0 1 1 3 3 3 2 0 0 2 3 3 3 3 0 0 0 3 3 3 4 0 0 0 0 4 5 5 0 0 0 0 0 5 6 0 0 0 0 0 0 A1 A6 A2 A3 A4 A5 A1 A6 A1 (A1 (A2 A3)) ((A4 A5) A6) D = A1 A3 A4 A6 A1 A1 A2 A3 A4 A5 A6 A6
Optimální pořadí násobení matic A4B33ALG 2015/11 Optimální pořadí násobení matic Odvození asymptotické složitosti Počet buněk, z nichž je počítán obsah dané buňky v DP tabulce, je úměrný složitosti výpočtu obsahu této buňky. index řádku Řádkové součty 1/2 * (N1) * N 1 2 3 N3 N2 N1 k = N1 1/2 * (N2) * (N1) 1 2 N4 N3 N2 k = N2 1/2 * (N3) * (N2) 1 N5 N4 N3 k = N3 k = k 1/2 * k * (k+1) 1 Nk2 Nk1 Nk k = 3 1/2 * 3 * 4 1 2 3 k = 2 1/2 * 2 * 3 1 2 k = 1 1/2 * 1 * 2 1 Celkový součet 1/2 * k * (k+1) = N-1 k=1 1/2 * k2 + N-1 k=1 1/2 * k N-1 k=1 = 1/2 * (N1) * N * (2N1)/6 + 1/2 * (N1) * N/2 (N3)