ALG Dynamické rogramování Nejdelší rostoucí odoslounost Otimální ořadí násobení matic
Nejdelší rostoucí odoslounost Z dané oslounosti vyberte co nejdelší rostoucí odoslounost. 5 4 9 5 8 6 7 Řešení: 4 5 6 7 Jiné možné varianty Vlastnosti hledané odoslounosti: Klesající, nerostoucí, neklesající, aritmetická, s omezenou rychlostí růstu, s váhami rvků, atd., Konceční řístu I zde nerobírané Převeď na známou úlohu, definuj vhodný DAG odle daných vlastností odoslounosti, v DAG hledej nejdelší cestu.
Nejdelší rostoucí odoslounost Konceční řístu I Transformace na známou úlohu Prvky oslounosti budou uzly DAG, který je již toologicky usořádán, ořadí v oslounosti = ořadí v to. usořádání. Hrana x > y existuje rávě tehdy, když x je v oslounosti dříve než y a navíc x<y. V tomto DAG hledáme nejdelší cestu. 5 4 9 5 8 6 7 Algoritmus je znám, má složitost (N+M), tedy O(N ). Nař. ro rostoucí oslounost má složitost až (N ).
Nejdelší rostoucí odoslounost Konceční řístu II Sestav samostatný a otenciálně rychlejší algoritmus řešení: Registrujme otimální odoslounosti všech možných délek. Postuně metodou DP aktualizujme tyto otimální odoslounosti. k V 5 4 9 4 5 5 6 7 8 9 8 6 7 k.. index rvku V.. hodnota rvku.. index ředchůdce.. index osledního rvku v rostoucí odoslounosti délky d =,,, N. Pro každý index k: Nechť d je index největšího rvku, ro který latí V[[d]] < V[k]. Potom [d+] := k, [k] = [d], okud d existuje. Jinak [] := k, [k] = null. V[[d]], d =..N je neklesající, lze v ní hledat v čase O(log N).
k V Nejdelší rostoucí odoslounost 4 8 4 5 4 6 7 9 8 9 7 5 6 k.. index rvku V.. hodnota rvku.. index ředchůdce.. index osledního rvku v rostoucí odoslounosti délky d =,,, N. 8 8 5 5 6 5 5 k= 5 5 8 k= 5 5 8 Pro každý index k: Nechť d je index max. rvku, ro který latí V[[d]] < V[k]. Potom [d+] := k, [k] = [d], okud d existuje. Jinak [] := k, [k] = null. Pro každé k je nalezneme d v čase O(log N) ůlením intervalu. Aktualizace a roběhne v konstantním čase. Celkem je složitost O(N log (N)). 4
Nejdelší rostoucí odoslounost k 4 5 6 7 8 9 k 4 5 6 7 8 9 V 4 8 4 9 7 5 6 V 4 8 4 9 7 5 6 4 5 4 4 6 5 4 4 8 6 5 7 4 9 5 4 8 8 5 7 4 9 5 5
Nejdelší rostoucí odoslounost k 4 5 6 7 8 9 k 4 5 6 7 8 9 V 4 8 4 9 7 5 6 V 4 8 4 9 7 5 6 8 5 7 4 9 5 8 5 4 5 5 5 5 VL 8 5 9 4 7 5 5 8 5 5 5 5 8 Rekonstrukce otimální cesty 8 5 6 5 5 5 8 Poslední definovaný rvek v je indexem osledního rvku jedné z otimálních odoslouností celé oslounosti. Pole určuje omocí ředchůdců tuto odoslounost. 6
Otimální ořadí násobení matic Instance úlohy Máme sočítat co nejefektivněji součin reálných matic A A A A 4 A 5 A 6, kde rozměry jednotlivých matic jsou o řadě 5, 5 5, 5 5, 5,, 5. (Výsledná matice D má rozměr ). Grafická odoba (dimenze matic ve srávném oměru) A A A A 4 A 5 A 6 D = Instance řevzata z [CLRS], ka. 5. 7
Otimální ořadí násobení matic Počet oerací v násobení dvou matic a b b = c a c b = b b oerací násobení ro výočet jednoho rvku výsledné matice a * c rvků ve výsledné matici Vynásobení dvou matic o rozměrech a b a b c vyžaduje celkem a * b * c oerací násobení dvou rvků (čísel). Sčítání zde neuvažujeme, lze ro něj vyvinout analogický ostu. 8
Otimální ořadí násobení matic A A A A 4 A 5 A 6 D = Sledujeme jen očet oerací součinu dvou reálných čísel. Uvažujeme různé možnosti uzávorkování a tím i ořadí výočtu. metoda Výraz Počet oerací zleva dorava zrava doleva ((((A A ) A ) A 4 ) A 5 ) A 6 4 5 A (A (A (A 4 (A 5 A 6 )))) 47 5 nejhorší A ((A ((A A 4 ) A 5 )) A 6 ) 58 nejleší (A (A A )) ((A 4 A 5 ) A 6 ) 5 5 9
Otimální ořadí násobení matic Příklad násobení více matic + 4 = 54 o. 4 * * 4 = 4 o. 4 + 6 = o. 4 5 * * 4 = 6 o. 4 5 5 4 5 * * = o. o. o. * 5 * 4 = 4 o. 5 5 4 5 5 4
Otimální ořadí násobení matic A = A = A = 5 5 Součin (A A ) A vyžaduje 54 oerace násobení. Součin A (A A ) vyžaduje oerací násobení. Evidentně, na zůsobu uzávorkování záleží. Catalanova čísla C N Součin A A A A N lze uzávorkovat 4 C N = Comb(N, N) / (N+) zůsoby. C, C,, C 7 =,,, 5, 4, 4,. C N >N ro N > 7. V obecném říadě by mělo vyzkoušení všech uzávorkování exonenciální složitost.
Ilustrace Otimální ořadí násobení matic 4 různých zůsobů uzávorkování součinu 5 činitelů A (A (A (A 4 A 5 ))) A (A ((A A 4 ) A 5 )) A ((A A ) (A 4 A 5 )) A ((A (A A 4 )) A 5 ) A (((A A ) A 4 ) A 5 ) (A A ) (A (A 4 A 5 )) (A A ) ((A A 4 ) A 5 ) (A (A A )) (A 4 A 5 ) ((A A ) A ) (A 4 A 5 ) (A (A (A A 4 ))) A 5 (A ((A A ) A 4 )) A 5 ((A A ) (A A 4 )) A 5 ((A (A A )) A 4 ) A 5 (((A A ) A ) A 4 ) A 5
Otimální ořadí násobení matic A (A A A 4 A N- A N ) (A A ) (A A 4 A N- A N ) (A A A ) (A 4 A N- A N ) (A A A A 4 ) ( A N- A N )... (A A A A 4 ) (A N- A N ) (A A A A 4 A N- ) A N N možných míst, v nichž výraz rozdělíme a rovedeme oslední násobení Předokládejme, že máme ředočítáno otimální uzávorkování ro každý modrý úsek celkového výrazu.
Otimální ořadí násobení matic A (A A A 4 A N- A N ) (A A ) (A A 4 A N- A N ) (A A A ) (A 4 A N- A N ) (A A A A 4 ) ( A N- A N )... (A A A A 4 ) (A N- A N ) (A A A A 4 A N- ) A N = B[,] B[,N] = B[,] B[,N] = B[,] B[4,N] = B[,4] B[5,N]... = B[,N-] B[N-,N] = B[,N-] B[N,N] Matice B[i, j] ředstavuje výsledek vynásobení odovídajícího úseku. Nechť r(x) res. s(x) ředstavují očet řádků res slouců matice X. Podle ravidel násobení matic latí r(b[i, j]) = r(a i ), s(b[i, j]) = s(a j ), ro i j N. 4
Otimální ořadí násobení matic Nechť MO[i, j] ředstavuje minimální očet oerací otřebných k výočtu matice B[i, j], tj. minimální očet oerací otřebných k výočtu matice A i A i+ A j- A j. A4BALG 5/ B[,] B[,] B[,]... B[,N-] B[,N-] B[,N] B[,N] B[4,N] B[N-,N] B[N,N] MO[,] + r(a )*s(a )*s(a N ) + MO[, N] MO[,] + r(a )*s(a )*s(a N ) + MO[, N] MO[,] + r(a )*s(a )*s(a N ) + MO[4, N] MO[,N-] + r(a )*s(a N- )*s(a N ) + MO[N-, N] MO[,N-] + r(a )*s(a N- )*s(a N ) + MO[N, N] oerací v levém úseku oerací ři násobení B[,.] B[.,N] oerací v ravém úseku Celkem dostáváme MO[,N]: MO[,N] = min {MO[,k] + r(a )*s(a k )*s(a N ) + MO[k+, N] k =..N-} 5
Otimální ořadí násobení matic MO[,N] = min {MO[,k] + r(a )*s(a k )*s(a N ) + MO[k+, N] k =..N-} Za ředokladu znalosti MO[i, j] ro úseky kratší než [, N], lze řešení celé úlohy, tj. hodnotu MO[, N], sočíst v čase (N). (*) Rekurentní využití řešení menších odúloh Identické úvahy, jaké jsme rovedli ro celý výraz A A A A N, rovedeme rovněž ro každý jeho souvislý úsek A L A L+ A R- A R, L R N. Počet těchto souvislých úseků je stejný jako očet dvojic indexů (L, R), kde L R N. Ten je roven Comb(N, ) (N ). Podúlohu na úseku (L, R) lze sočíst odle (*) v čase O(N), celou úlohu tak lze vyřešit v čase O(N ). 6
Otimální ořadí násobení matic * MO[L,R] = min {MO[L,k] + r(a L )*s(a k )*s(a R ) + MO[k+,R] k = L..R-} Hodnoty MO[L,R] ukládáme do D ole na ozici s indexy [L][R]. * A4BALG 5/ Při výočtu MO[L,R] odle oužíváme vesměs hodnoty MO[x,y], kde rozdíl y - x (odovídající délce odvýrazu) je menší než rozdíl R - L. Tabulku DP roto vylňujeme v ořadí rostoucích rozdílů R - L.. Vylníme rvky s indexy[l][r], kde R-L =, to je hlavní diagonála.. Vylníme rvky s indexy[l][r], kde R-L =, to je diagonála těsně nad hlavní diagonálou.. Vylníme rvky s indexy[l][r], kde R-L =, to je diagonála těsně nad ředchozí diagonálou. N-. Vylníme rvek s indexem [L][R], kde R-L = N-, to je ravý horní roh tabulky. 7
Otimální ořadí násobení matic Schéma ostuu výočtu R - L = R - L = R - L = R - L = R - L = N- R - L = N- Sto 8
Otimální ořadí násobení matic MO[L,R] = min {MO[L,k] + r(a L )*s(a k )*s(a R ) + MO[k+,R] k = L..R-} Ukázka ostuu výočtu MO a b c d 8 w x y z MO[,8] = min { MO[,] + r(a )*s(a )*s(a 8 ) + MO[4,8], MO[,4] + r(a )*s(a 4 )*s(a 8 ) + MO[5,8], MO[,5] + r(a )*s(a 5 )*s(a 8 ) + MO[6,8], MO[,6] + r(a )*s(a 6 )*s(a 8 ) + MO[7,8], MO[,7] + r(a )*s(a 7 )*s(a 8 ) + MO[8,8]} Označme P[L, R] := r(a L )*s(a R ). Potom MO[,8] = min { + s(a )*P[,8] + w, a + s(a 4 )*P[,8] + x, b + s(a 5 )*P[,8] + y, c + s(a 6 )*P[,8] + z, d + s(a 7 )*P[,8] + }. 9
Otimální ořadí násobení matic Instance úlohy A A A A 4 A 5 A 6 D = 5 5 5 5 5 5 5 5 MO 4 5 6 575 7875 975 875 55 65 475 75 5 75 5 575 4 5 5 5 6 otimum
Otimální ořadí násobení matic Rekonstrukce uzávorkování * MO[L,R] = min {MO[L,k] + r(a L )*s(a k )*s(a R ) + MO[k+,R] k = L..R-} Při určení MO[L,R] do rekonstrukční tabulky RT stejné velikosti jako MO zaneseme na ozici [L][R] hodnotu k, v níž minimum * nastalo. Hodnota k určuje otimální rozdělení výrazu (A L A L+ A R ) na dva menší otimálně uzávorkované výrazy (A L A L+ A k ) (A k+ A k+ A R ) Hodnota RT[, N] určuje otimální rozdělení celého výrazu A A A N na rvní dva menší otimálně uzávorkované výrazy (A A A k ) (A k+ A k+ A N ). Dále rekonstrukce otimálního uzávorkování okračuje rekurzivně analogicky ro výraz (A A A k ) a ro výraz (A k+ A k+ A N ) a dále ro jejich odvýrazy atd.
Otimální ořadí násobení matic RT 4 5 6 4 4 5 5 5 6 A A A A4 A5A 6 A A 6 A A A A 4 A 6 A A A A A 4 A 5 A 6 A 6 (A (A A )) ((A 4 A 5 ) A 6 ) D =
Otimální ořadí násobení matic Odvození asymtotické složitosti index řádku Řádkové součty Počet buněk, z nichž je očítán obsah dané buňky v DP tabulce, je úměrný složitosti výočtu obsahu této buňky. k = N k = N k = N / * (N ) * N / * (N ) * (N ) / * (N ) * (N ) N N N N 4 N N N 5 N 4 N k = k / * k * (k+) N k N k N k k = k = k = / * * 4 / * * / * * Celkový součet N- N- / * k * (k+) = / * k N- + / * k k= k= k= = / * (N ) * N * (N )/6 + / * (N ) * N/ (N )