230 likes | 395 Views
Metódy návrhu efektívnych algoritmov. Divide et impera (rozde ľuj a vládni ). Jedna zo základných stratégií v politike, sociológii, ekonomike, armáde, .... a informatike Výrok sa pripisuje maced ónskému kráľovi Filipovi II (382-336 p.n.l. ). Divide et impera - princíp.
E N D
Divide et impera (rozdeľuj a vládni) • Jedna zo základných stratégií v politike, sociológii, ekonomike, armáde, .... a informatike • Výrok sa pripisuje macedónskému kráľovi Filipovi II (382-336 p.n.l.)
Divide et impera - princíp • Zložitý problém sa rieši pomocou menších (jednoduchších) problémov • Tento princíp poznáme z bežného života ale aj z programovania (už niekoľko krát bol použitý) • 2 základné metódy: • Rozdeľuj a panuj – prístup zhora nadol • Dynamické programovanie – prístup zdola nahor
Rozdeľuj a panuj • 3 kroky: • rozdelenie problému na podproblémy • (rekurzívne) vyriešenie každého z podproblémov • spojenie riešení podproblémov do riešenia pôvodného problému • Príklady: • Hanojské veže • QuickSort – kľúčová časť je rozdelenie problému • MergeSort – kľúčová časť je spojenie riešení
MergeSort (princíp) • Rozdelenie n-prvkovej postupnosti, ktorú treba utriediť, na dve podpostupnosti dĺžky približne n/2 (jednoduché) • Rekurzívne utriedenie podpostupností použitím MergeSortu(jednoduché) • Zlúčenie dvoch utriedených podpostupností do výslednej utriedenej postupnosti(???)
MergeSort (schéma) var p, q:array[1..MaxN] of integer; n: integer; procedure MergeSort(Zac, Kon: integer); var stred: integer; begin stred := (Zac + Kon) div 2; // rozdelenie MergeSort(Zac, stred); // rekurzivne riesenie MergeSort(stred + 1, Kon); // podproblemov Zluc(zac, kon); // spojenie rieseni end; Pozor, toto je len schéma !
Zlučovanie • Využijeme, že obe postupností sú utriedené • Pozorovanie (+ obrázok): • prvý prvok zlúčenej postupnosti je menší z prvých prvkov podpostupností • stačí postupne 2 kurzormi prechádzať oboma podpostupnosťami, aby sme získali utriedenú postupnosť • Lineárna časová zložitosť • Treba pomocné pole
Pár slov o efektivite riešenia • Časová zložitosť: O(n log n) • Máme najviac O(log n) rekurzívnych vnorení v rámci jednej vetvy • Lineárna zložitosť zlučovania • V každej „vrstve“ stromu vykonáme lineárny počet operácií • Nevýhoda: Nutné pomocné pole • MergeSort ide využiť na efektívne triedenie spájaných zoznamov (netreba pomocné pole)
Vyhodnocovanie artimetických výrazov • K zadanému výrazu skonštruujeme aritmetický strom • Elegantné rekurzívne vyhodnotenie: • Ak je to uzol, ktorý uchováva operáciu: • necháme vyhodnotiť podstrom zakorenený v ľavom synovi • necháme vyhodnotiť podstrom zakorenený v pravom synovi • na výsledky aplikujeme požadovanú operáciu • Ak je to uzol, ktorý uchováva hodnotu, tak vyhodnotenie máme ihneď
Dynamické programovanie • Postup zdola nahor • najprv riešime malé (elementárne) problémy a z nich budujeme riešenie väčších a väčších problémov • nie všetko čo počítame musí priamo (viditeľne) súvisieť s problémom, ktorý má vyriešiť • Príklady: • Fibonacciho čísla • Optimálne násobenie matíc • Grafové algoritmy
Postup pri riešení • Charakterizuj štruktúru optimálneho riešenia • Rekurzívne definuj hodnotu optimálneho riešenia • Metódou zdola nahor vypočítaj ohodnotenie optimálneho riešenia • Z vypočítanej informácie skonštruuj optimálne riešenie
Násobenie matíc • Matica A typu p x q(p riadkov, q stĺpcov) • Matica B typu q x r (q riadkov, r stĺpcov) • A x B je matica typu p x r • Počet operácií (zložitosť) potrebných na výpočet matice A x B je p x q x r jednoduchým algoritmom (existujú aj iné prefíkanejšie a rýchlejšie)
Algoritmus na násobenie matíc (schéma) procedure VynasobMatice(A, B, C); begin for i:=1 to riadky[A] do for j:=1 to stlpce[B] do begin C[i, j] := 0; for k:=1 to stlpce[A] do C[i, j] := C[i, j] + A[i, k] * B[k, j]; end; end;
Násobenie matíc - problém • A1, A2, A3, ..., An - postupnosť kompatibilných matíc • Nech P je pole rozmerov matíc a nech matica Ai má rozmery P[i-1] a P[i] • Chceme vypočítať A1x A2 x A3 x ...x An • Násobenie matíc je asociatívne – nezáleží na ozátvorkovaní • Rôzne „spôsoby“ (ozátvorkovania) ako vypočítať výsledný súčin
Príklad • A1: 10 x 100, A2: 100 x 5, A3: 5 x 50 • (A1 x (A2 x A3)): 75000 operácií • M = A2 x A3: 100 x 5 x 50 = 25000 operácií • A1 x M: 10 x 100 x 50 = 50000 operácií • ((A1 x A2) x A3): 7500 operácií • M = A1 x A2: 10 x 100 x 5 = 5000 operácií • M x A3: 10 x 5 x 50 = 2500 operácií Aké je ozátvorkovanie s minimálnym počtom operácií pri násobení ?
Štruktúra optimálneho riešenia (1) • Nech M[i, j] je minimálny počet operácií, ktoré treba pri optimálnom ozátvorkovaní výrazu: Aj x Aj+1 x … x Aj+i-1 • M[N, 1] – hľadaný počet operácií pri optimálnom ozátvorkovaní • M[1, j] = 0 pre všetky j = 1, 2, …, N • M[2, j] zodpovedá Aj x Aj+1, kde • Aj je P[j-1] x P[j] matica • Aj+1 je P[j] x P[j+1] matica • M[2, j] = P[j-1] x P[j] x P[j+1], pre j=1, 2, …, N-1
Štruktúra optimálneho riešenia (2) • Čomu sa rovná M[i, j] všeobecne ? • Súčin Aj x Aj+1 x … x Aj+i-1možno rozdeliť na súčin 2 medzivýsledkových matíc j-1 spôsobmi: • Aj x (Aj+1 x … x Aj+i-1 ) • (Aj x Aj+1 ) x (… x Aj+i-1 ) • … • (Aj x Aj+1 x … ) x Aj+i-1
Štruktúra optimálneho riešenia (3) • Počet operácií pri ozátvorkovaní (Aj x Aj+1 x … x Aj+k-1) x (Aj+k x … x Aj+i-1 ) súčin j-k matíc optimum M[j-k, j+k] súčin k matíc optimum M[k, j] celkovo: M[k, j] + M[i-k, j+k] + p[j-1] x p[j-k-1] x p[j+i-1]
Štruktúra optimálneho riešenia M[i, j] = min {M[k, j] + M[i-k, j+k] + p[j-1] x p[j-k-1] x p[j+i-1], pre k=1, …, i-1} • Všimnime si • k < i • j-k < I • Ak budeme postupne počítať hodnoty pre i=1, …, N tak máme hľadané riešenie
for j:=1 to N do M[1,j]:=0; for i:=2 to N do for j:=1 to N-i+1 do begin Min:=maxint; for k:=1 to i-1 do begin Poc:= M[k,j] + M[i-k,j+k] + P[j-1] * P[j+k-1] * P[j+i-1]; if Poc < Min then Min:=Poc end; M[i,j]:=Min end;
Rekonštrukcia optimálneho riešenia • Pri výpočte M[i, j] si do ďalšieho poľa poznamenáme, cez ktoré “rozdelenie” bolo dosiahnuté minimum vypočítané v M[i, j] • Spätným prechodom zrekonštruujeme optimálne ozátvorkovanie
Dynamické programovanie • Iné úlohy: • najdlhšia spoločná podpostupnosť • najdlhšia rastúca podpostupnosť • Úloha: • záhrada s rozmermi m x n • na každom políčku je A[i, j] jabĺk • začíname v ľavom hornom rohu a v rámci každého kroku sa môžeme pohnúť doprava alebo dole • pri ktorej ceste nazbierame najviac jabĺk ?