340 likes | 552 Views
Divide et impera Rozdeľuj a panuj. Maroš Dzuriš, Marian Pruchnerovič (Seminár z informatiky). Obsah. Princíp a formálny zápis História Výhody a Nevýhody Quicksort Binárne vyhľadávanie Mergesort. Rozdeľuj a panuj - princíp.
E N D
Divide et impera Rozdeľuj a panuj Maroš Dzuriš, Marian Pruchnerovič (Seminár z informatiky)
Obsah • Princíp a formálny zápis • História • Výhody a Nevýhody • Quicksort • Binárne vyhľadávanie • Mergesort Dzuriš,Pruchnerovič
Rozdeľuj a panuj - princíp • výrok sa pripisuje macedónskému kráľovi Filipovi II (382-336 p.n.l.) • zložitý problém sa rieši pomocou menších (jednoduchších) problémov • riešenie prístupom rozdeľuj a panuj je založené na multi - rozvetvenej rekurzii Dzuriš,Pruchnerovič
Rozdeľuj a panuj - princíp • riešenie pod-problémov sa zlúči, aby sa vyriešil základný problém • Napr. quicksort, mergesort, hanojské veže, syntaktická analýza, binárne vyhľadávanie Dzuriš,Pruchnerovič
Rozdeľuj a panuj - princíp • P- riešený problém, N - rozmer dát, potom môžeme zapísať: • P(N) → P(N1) → P(N2) + ... + P(Nk) + KOMB(N) • problém rádu N sme rozdelili na k pod-problémov • Zefektívnenie z O(n) → O(log2n). Dzuriš,Pruchnerovič
Formálny zápis rozdeľuj_a_panuj(N) { pokial+ N je dostatočne nízke vráťKonečná_podmienka(N); inak { "Rozdeľ" P(N) na jednotlivé časti P(N1), P(N2),...P(NK) Pre i= 1 ... K vypočítaj jednotlivý výsledok wi = rozdel_a_panuj(N1); vráť KOMB(w1, w2, .., wk); } } Dzuriš,Pruchnerovič
História • 200 r. pred Kristom v Babylone –myšlienky použiť triedenie pre uľahčenie vyhľadávanie s jednými pod problémom • 1946 Johan Mauchly – v jeho článku sa objavuje popis spomínaného algoritmu • 1945 John von Neuman –alg. rozdeľuj a panuj z dvoma podproblémami – Merge sort Dzuriš,Pruchnerovič
Výhody algoritmu rozdeľuj a panuj • riešenie zložitých problémov • často pomáha pri objavení efektívnych algoritmov (quicksort, mergesort, Strassen alg. pre násobenie matíc, Fourierova transformácia) • paralelizmus – prispôsobený pre výkon v multiprocesorových strojoch • efektívne využitie pamäte Dzuriš,Pruchnerovič
Nevýhody algoritmu rozdeľuj a panuj • pri jednoduchých algoritmoch môže byť neefektívna a zbytočná Dzuriš,Pruchnerovič
Quciksort • jeden z najrýchlejších známych triediacich algoritmov, založených na porovnávaní prvkov Princíp: • Výber pivota • Rozdelenie na dve časti • Rekurzívne triedenie oboch častí Dzuriš,Pruchnerovič
Quciksort • vizualizácia: Dzuriš,Pruchnerovič
Quciksort • Ukážka triediaceho algoritmu quicksort pomocou algoritmu rozdeľuj a panuj v Jave: Dzuriš,Pruchnerovič
Quciksort • publicclass quicksort • { • publicstaticvoid swap(int[]pole,int a,int b){ • int k=pole[a]; • pole[a]=pole[b]; • pole[b]=k; • } • publicstaticint partition(int [] pole,int begin, int end, int pivot){ • int piv=pole[pivot]; • swap(pole,pivot,end-1); • int store=begin; • for(int i=begin;i<end-1;i++){ • if(pole[i]<=piv){ • swap(pole,store,i); • store++; • } • } • swap(pole,end-1,store); • return store; • } Dzuriš,Pruchnerovič
Quciksort • publicstaticvoid qsort(int []pole,int begin, int end){ • if(end-1>begin){ • int pivot=(int) (begin+((end-begin)/2)); • pivot=partition(pole, begin, end, pivot); • qsort(pole, begin, pivot); • qsort(pole, pivot+1, end); • } • } • publicstaticvoid quick_sort(int [] pole){ • qsort(pole, 0, pole.length); • } • publicstaticvoid main(String[] args) { • // TODO Auto-generated method stub • quick_sort(int [] pole); • } • } Dzuriš,Pruchnerovič
Binárne vyhľadávanie • nájdenie zadanej hodnoty v usporiadanom zozname pomocou skracovania zoznamu o polovicu v každom kroku • logaritmická zložitosť O(log n) • vyžaduje usporiadané pole Dzuriš,Pruchnerovič
Binárne vyhľadávanie • Jednoduchý postup: • určíme stred, ľavý a pravý prvok • zistíme či prvok patri do ľavej alebo do pravej časti • nájdeme nový stred a rozdeľujeme postupnosť ďalej • koniec: • ak je hľadaný prvok stredom • prvok v postupnosti nie je Dzuriš,Pruchnerovič
Binárne vyhľadávanie - schéma • begin while x != a[stred] do begin if a[stred] < x then posuň dolnú hranicu; else posuň hornú hranicu; vypočítaj nový stred; end end Dzuriš,Pruchnerovič
MergeSort - Triedenie zlučovaním • 1945 John von Neumann • mal veľký význam v minulosti pri triedení údajov na magnetických páskach (sekvenčný prístup) • vyžaduje len malé množstvo pamäte s priamym prístupom Dzuriš,Pruchnerovič
MergeSort - princíp • rozdelenie n-prvkovej postupnosti, ktorú treba utriediť, na dve pod postupnosti dĺžky približne n/2 • rekurzívne utriedenie podpostupností použitím MergeSortu • zlúčenie dvoch utriedených podpostupností do výslednej postupnosti Dzuriš,Pruchnerovič
MergeSort - zlučovanie • obe postupností sú utriedené • stačí postupne 2 kurzormi prechádzať oboma podpostupnosťami → utriedená postupnosť • Lineárna časová zložitosť Dzuriš,Pruchnerovič
MergeSort • vizualizácia: Dzuriš,Pruchnerovič
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; Dzuriš,Pruchnerovič
MergeSort -príklad • Postupnosť: 10 2 9 5 71 3 6 4 8 10 2 * 9 5 7 10<2 →2 10 – utriedené 9 * 5 7 9 →9 5<7 → 5 7 →spajanie →5<9 →7<9 →5 7 9 Dzuriš,Pruchnerovič
MergeSort -príklad • 2 10 • 5 7 9 • Výsledok: Dzuriš,Pruchnerovič
MergeSort -príklad • 2 10 • 5 7 9 • Výsledok:2 Dzuriš,Pruchnerovič
MergeSort -príklad • 2 10 • 5 7 9 • Výsledok:2 5 Dzuriš,Pruchnerovič
MergeSort -príklad • 2 10 • 5 7 9 • Výsledok:2 5 7 Dzuriš,Pruchnerovič
MergeSort -príklad • 2 10 • 5 7 9 • Výsledok:2 5 7 9 Dzuriš,Pruchnerovič
MergeSort -príklad • 2 10 • 5 7 9 • Výsledok:2 5 7 9 10 Dzuriš,Pruchnerovič
MergeSort -príklad • 2 5 7 9 10 – utriedené • 1 3 6 4 8→1 3 4 6 8 -utriedené • Spájame: 2 5 7 9 10 + 1 3 4 6 8 • Výsledok: 1 2 3 4 5 6 7 8 9 10 Dzuriš,Pruchnerovič
MergeSort • Zložitosť v najhoršom, najlepšom aj priemernom prípade je O(n.log n) • Rekurzia: T(n) = 2T(n/2) + n, • T(n/2)-rekurzívne volanie na obe podpolia • n – zlúčenie podpoli → Podľa Master Theorem → O(n log n) Dzuriš,Pruchnerovič
Porovnanie • Priemerný prípad: • MergeSort pomalší ako Quicksort a rýchlejší ako Heapsort • Pamäťová zložitosť • MergeSort vyžaduje prídavnú pamäť • je odporúčaný najmä pre spájané zoznamy, pretože tam stačí konštantná prídavná pamäť. Dzuriš,Pruchnerovič
Použitá literatúra • Thomas H. Cormen, Charles E. Leiserson, a Ronald L. Rivest, Introduction to Algorithms (MIT Press, 2000). • Brassard, G. and Bratley, P. Fundamental of Algorithmics, Prentice-Hall, 1996. • Anany V. Levitin, Introduction to the Design and Analysis of Algorithms (Addison Wesley, 2002). • Donald E. Knuth, The Art of Computer Programming: Volume 3, Sorting and Searching , second edition (Addison-Wesley, 1998). • http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm • http://pascalsource.ic.cz/orion/viewtopic.php?t=77 • http://www.dcs.fmph.uniba.sk/bakalarky/obhajene/getfile.php/Triediace_algoritmy.pdf?id=4&fid=6&type=application%2Fpdf • Niklaus Wirth: Algoritmy a štruktúry údajov, ALFA, Bratislava, 1987 • http://en.wikipedia.org/wiki/Merge_sort • ics.upjs.sk/~galcik/files/progLS2007/EfektivneAlgoritmy.ppt • http://www.sum-it.nl/quicksort.php3 Dzuriš,Pruchnerovič