1 / 23

Metódy návrhu efektívnych algoritmov

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.

eadoin
Download Presentation

Metódy návrhu efektívnych algoritmov

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Metódy návrhu efektívnych algoritmov

  2. 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.)

  3. 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

  4. 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í

  5. 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(???)

  6. 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 !

  7. 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

  8. Programujeme …

  9. 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)

  10. 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ď

  11. 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

  12. 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

  13. 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)

  14. 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;

  15. 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

  16. 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í ?

  17. Š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

  18. Š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

  19. Š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]

  20. Š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

  21. 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;

  22. 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

  23. 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 ?

More Related