. predáška 19..018) Od triedeia) k zložitosti 1
Hľadaie ihly v kope sea 8 kariet, pod každou je jedo číslo... Úloha: Ako a ajmeej otočeí kariet zistiť, či je a iektorej z kariet zadaé číslo? Najlepší prípad: Ak máme šťastie, tak ho ájdeme a prvý pokus. Najhorší prípad: Ak tam číslo ie je, tak musíme azrieť pod každú kartu. pri kartáh po aajvýš krokoh vieme dať odpoveď
Hľadaie ihly v kope sea aajvýš opakovaí for it i=0; i<pole.legth; i++) if pole[i] == hladaecislo) retur true; retur false; 3
Hľadaie ihly v kope sea 8 kariet, pod každou je jedo číslo... Úloha: Ako a ajmeej otočeí kariet zistiť, či je a iektorej z kariet zadaé číslo? Bous: čísla pod kartami tvoria eklesajúu postuposť... Pomôže to ejako? 4
Hľadaie ihly v kope sea Hľadaé číslo 45 3 Zmešeie problému: z 8 kariet a 4 karty Ak je číslo 45 pod iektorou kartou, tak iba pod iektorou z týhto... Ak vyberáme kartu približe v strede, tak problém veľkosti redukujeme a problém veľkosti / 5
Ako harakterizovať problém? odidx stredidx poidx Problém = možiu kariet, ktorú prehľadávame, môžeme popísať číslami: idex prvej karty kde úsek začía) idex posledej karty kde úsek kočí) 6
Biáre vyhľadávaie publi boolea jevpoliit[] pole, it odidx, it poidx, it islo) { if odidx > poidx) retur false; Ak máme 0 kariet Vypočítame stred } it stredidx = odidx + poidx) / ; if pole[stredidx] == islo) retur true; if islo < pole[stredidx]) else retur jevpolipole, odidx, stredidx-1, islo); retur jevpolipole, stredidx+1, poidx, islo); Overíme, či v strede ie je to, čo hľadáme Rozhodeme sa, či v hľadaí pokračujeme vľavo alebo vpravo Nerekurzíva verzia a vičeiah 7
Je biáre vyhľadávaie lepšie? Najhorší prípad: 1 krok: kariet krok: / kariet 3 krok: polovia z / kariet = /4 = / = / 3-1 4 krok: polovia z /4 kariet = /8 = / 3 = / 4-1 k-ty krok: / k-1 kariet kedy skočíme? posledý krok: ostala 1 karta v iformatike: log = log / k-1 1 k-1 log k-1 1+log k Po aajvýš 1+log krokoh kočíme! 8
Je biáre vyhľadávaie lepšie? Lieáre vyhľadávaie Biáre vyhľadávaie 10 10 4 100 100 7 1000 1000 10 1000000 1000000 0 1000000000 1000000000 30 1000000000000 1000000000000 40 Oplatí sa mať vei usporiadaé a vďaka tomu môť použiť biáre vyhľadávaie. 9
Ako dať vei a správe miesto? Kartičkový experimet... 10
Bublikové triedeie Kým ie sú všetky susedé prvky v poli v správom poradí, opakuj: ájdi dva susedé prvky v zlom poradí a avzájom ih vymeň publi stati void bubblesortit[] p) { boolea bolavymea; Hľadáme susedé prvky, do { ktoré sú v zlom poradí bolavymea = false; } for it i=0; i<p.legth-1; i++) if p[i] > p[i+1]) { vymep, i, i+1); bolavymea = true; } } while bolavymea); it pom = p[i]; p[i] = p[i+1]; p[i+1] = pom; Pozačíme si, že sme ašli v poli iečo zlé 11
Bublikové triedeie Pozorovaie: od koa poľa sa postupe vytvára vybubláva) usporiadaá podpostuposť vylepšeie: pri hľadaí zlýh susedov emusíme ísť do koa poľa, -1, -, -3, ) vylepšeá verzia a vičeiah... Koľko krát sa zopakuje do-while yklus? v ajlepšom prípade usporiadaé pole): 1 krát v ajhoršom prípade: krát 1
Bubliky a počet porovaí Aký je počet porovaí, ktoré vykoá algoritmus? v ajlepšom prípade: -1 1 iteráia do-while yklu v ajhoršom prípade: -1) = - -1 porovaí v jedej iteráii do-while yklu aajvýš iteráií do-while yklu 13
Triedeie výberom SeletioSort, MiSort Stratégia pre pole veľkosti : ak je pole veľkosti 1, tak už je usporiadaé a môžeme skočiť iak ) ájdi ajmešie číslo vymeň ajmešie číslo s číslom a začiatku poľa prvé číslo v poli igoruj a usporiadaj zvyšok poľa zvyšýh -1 čísel) rovakým postupom 14
Triedeie výberom publi stati it idexnajmesiehoit[] p, it odidx, it poidx) { } it ajidx = odidx; for it i = odidx + 1; i <= poidx; i++) if p[i] < p[ajidx]) ajidx = i; retur ajidx; publi stati void vymeit[] p, it idx1, it idx) { } it pom = p[idx1]; p[idx1] = p[idx]; p[idx] = pom; ájdi ajmešie číslo vymeň ajmešie číslo s číslom a začiatku poľa prvé číslo v poli igoruj a usporiadaj zvyšok poľa zvyšýh N-1 čísel) rovakým postupom 15
Triedeie výberom publi stati void seletiosortit[] p, it odidx, it poidx) { if odidx == poidx) retur; Rekurzíva myšlieka ezameá rekurzívy program! } vymep, odidx, idexnajmesiehop, odidx, poidx)); seletiosortp, odidx + 1, poidx); Zmešeie problému o 1 ájdi ajmešie číslo vymeň ajmešie číslo s číslom a začiatku poľa prvé číslo v poli igoruj a usporiadaj zvyšok poľa zvyšýh N-1 čísel) rovakým postupom 16
Triedeie výberom publi stati void seletiosortit[] p) { for it i = 0; i < p.legth - 1; i++) { } } it miidx = i; for it j = i + 1; j < p.legth; j++) if p[j] < p[miidx]) miidx = j; it pom = p[i]; p[i] = p[miidx]; p[miidx] = pom; Nájdi idex ajmešieho prvku v podpoli začíajúom a idexe i. Vymeň prvok a idexe i a ajmeší prvok v podpoli od idexu i. 17
Triedeie výberom a porovaia publi stati void seletiosortit[] p) { for it i = 0; i < p.legth - 1; i++) { it miidx = i; for it j = i + 1; j < p.legth; j++) if p[j] < p[miidx]) miidx = j; p.legth = 8 i=0 7 i=1 6 i= 5 i=3 4 i=4 3 } } vymep, i, miidx); Počet porovaí pri poli veľkosti : i=5 i=6 1 1) )... 1 1 k 1 k 1) Počet porovaí 18
Bubliky vs. výber Počet porovaí V ajlepšom prípade V ajhoršom prípade BubbleSort -1-1) Vylepšeý BubbleSort -1-1)/ SeletioSort -1)/ -1)/ A čo ďalšie operáie v algoritmoh výmey, priradeia, ++, )? Ktorý z algoritmov je rýhlejší? 19
Korektosť: Robí algoritmus vždy to, čo má? Časová zložitosť: Aký rýhly je algoritmus? Pamäťová zložitosť: Aalýza algoritmov Koľko pamäte potrebuje algoritmus pri svojom behu?... komuikačá zložitosť, áročosť a prostriedky a zdroje,... 0
Ktorý algoritmus je rýhlejší? Naprogramujem a pomerám čas: a rôzyh počítačoh rôze operáie trvajú rôze dlho CISC vs. RISC, ahovaie, via a priípoh počítačov,...) algoritmus eoverím a všetkýh vstupoh čo ak som algoritmus etestoval práve a vstupe, a ktorom algoritmus počíta ajdlhšie čo ak algoritmus potrebujem pre také veľké vstupy, že le otestovaie akéhokoľvek z ih trvá iekoľko dí? Riešeie: teoretiká aalýza 1
Elemetára operáia: 1 krok Aalýza časovej zložitosti čo je elemetára operáia záleží od uvažovaého výpočtového modelu áš pohľad: každá jedoduhá operáia v Jave ako porovaie, priradeie,... pozor: jede príkaz ie je vždy jede krok, apr. volaie metódy môže skrývať možstvo krokov počet elemetáryh operáií je priamoúmerý času Aalýza časovej zložitosti algoritmu = počítaie počtu krokov algoritmu bez toho, aby sme ho spustili
Koľko ste sa dozvedeli? Aalýza časovej zložitosti Algoritmus a poli {5, 1, 5, } vykoal 131 krokov a a poli {6, 7, 1, 3, 1, 9} vykoal 19 krokov. Algoritmus A a poli veľkosti vykoá aajvýš 3* -+19 krokov a algoritmus B vykoá prese * +33*- krokov. ktorý je rýhlejší? Čo ás aozaj zaujíma? 3
Aalýza časovej zložitosti Presý počet krokov algoritmu záleží od kokréteho vstupu Ak je vstup väčší, počet krokov algoritmu by mal byť väčší časová zložitosť by mala byť fukiou od veľkosti vstupu ak je veľkosť vstupu, potom časová zložitosť je vyjadreá ako T) apr. maximály počet krokov, ktoré potrebuje algoritmus a vstupe veľkosti. Zvyčaje ás zaujíma horé ohraičeie počtu krokov poskytuje garaie trvaia) 4
Na čom záleží? Čo ak by sme každému z ih zvýšili mesačý príjem o... + 5% + 5% + 5% +1 +1 +1 Žiada z týhto operáií zásade ezmeí zaradeie človeka do ejakej príjmovej kategórie. 5
Na čom záleží? Aký ajväčší vstup dokáže algoritmus s daým počtom operáií spraovať za určitý čas? 6
Na čom záleží? Pri počítači, ktorý spraví 10 9 operáií za sekudu a 1,, 3, 1000, operáiáh avyše ezáleží... -ásobe via operáií vyrieši -krát rýhlejší počítač apr. vs. ) Z predhádzajúej tabuľky: rozdiel medzi a 3, či 3 a žiade koštaté zrýhleie počítača evyrieši pre všetky vstupy Výzva: Vieme algoritmy a základe časovej zložitosti rozdeliť do ejakýh kategórií tak, aby v každej z ih boli podobe časovo áročé algoritmy? 7
Asymptotiká zložitosť Zaujíma ás, ako rastie zložitosť algoritmu, ak veľkosť vstupu rastie do ekoeča ) Algoritmus A: T A ) = 3-4+100 Algoritmus B: T B ) = 300 +10 Algoritmus C: T C ) = 3 + Zložitosť algoritmov A a B rastie rovako. B vs. A: C vs. B: TB ) 300 10 lim lim T ) 3 4 100 A 3 TC ) lim lim ) T 300 10 B 100 Zložitosť C rastie eporovateľe rýhlejšie ako B 8
9 Theta Θ ako kategorizátor T A ) = 3-4+100 T B ) = 300 +10 Θg)) možia všetkýh fukií, ktoré sú z hľadiska rastu porovateľé s fukiou g) Do Θ ) patria 300 +10, ++log, 0.5, T A ) a T B ) sú z hľadiska rastu porovateľé. Pozorovaie: a multiplikatívej a aditívej koštate ezáleží. ) ) ),,,, ) )) 1 0 0 1 g f g N R f g
30 Theta Θ ) ) ),,,, ) )) 1 0 0 1 g f g N R f g
31 Príklad s Theta Θ ) 100 4 3 1 0 0 1 100 4 3,, 0,, ) 100 4 3 N Dokážte: Dôkaz: Zvoľme 1 =, =3, 0 =5. Potrebujeme ukázať, že platí: 5 3 100 4 3 pre 4) 100 4 100 100 4 3 5 4 100 3 100 4 3 ) ) ),,,, ) )) 1 0 0 1 g f g N R f g
3 Príklad: Theta Θ ) 3 3 1 0 0 1 3,, 0,, ) N Dokážte: Dôkaz sporom): 1 0 0 1,, 0,, N ) ) ),,,, ) )) 1 0 0 1 g f g N R f g Spor, eplatí pre > max, 0 ) Dôsledok: ) ) ) ) 3 3 3 3 Dá sa ukázať, že sú avyše aj disjukté.
Časová zložitosť BubbleSort-u publi stati void bubblesortit[] p) { boolea bolavymea; do { bolavymea = false; } for it i=0; i<p.legth-1; i++) if p[i] > p[i+1]) { vymep, i, i+1); bolavymea = true; } } while bolavymea); Počet všetkýh krokov algoritmu možo zhora aj zdola ohraičiť koštatým ásobkom počtu porovaí. 1.# porovaí) <= # krokov <=.# porovaí) 33
Θ a triedeia Počet porovaí V ajlepšom prípade V ajhoršom prípade BubbleSort -1-1) Vylepšeý BubbleSort -1-1)/ SeletioSort -1)/ -1)/ 1-1) aj -1)/ patria do Θ ) BubbleSort aj SeletioSort majú rovakú asymptotikú časovú zložitosť v ajhoršom prípade! Spomeuté triediae algoritmy patria do rovakej kategórie 34
A čo vieme povedať o každom behu? Počet porovaí V ajlepšom prípade V ajhoršom prípade BubbleSort -1-1) Vylepšeý BubbleSort -1-1)/ SeletioSort -1)/ -1)/ Časová zložitosť každého behu BubbleSort-u je medzi približe -1 a -1) Každý beh SeletioSort-u spraví Θ ) krokov. Čo vieme povedať o časovej zložitosti každého behu t.j. iele v ajhoršom prípade) algoritmu BubbleSort? 35
V praxi: Horé ohraičeie ako garaia sú dôležité garaie typu ebude to trvať dlhšie ako... pri aalýze algoritmov je iekedy často?) problém zaradiť časovú zložitosť algoritmu do Θ-možiy ejakej pekej fukie,, log,, log ) O 36
O-otáia O g )) f ) R, 0 N, 0, f ) g ) Og)) všetky fukie, ktoré sú asymptotiky zhora ohraičeé fukiou g) 37
O-otáia príklady O g )) f ) R, 0 N, 0, f ) g ) O ) =1, 0 =1 O ) =, 0 =1 O ) =1, 0 =1 +4 O ) =3, 0 =4 013 O ) =013, 0 =1 f ) g )) f ) O g )) g )) O g )) 38
A čo vieme povedať o každom behu? Počet porovaí V ajlepšom prípade V ajhoršom prípade BubbleSort -1-1) Vylepšeý BubbleSort -1-1)/ SeletioSort -1)/ -1)/ Cieľom aalýzy asymptotikej časovej zložitosti algoritmu je ájsť čo ajpomalšie rastúu fukiu f) takú, že časová zložitosť algoritmu je Of)) Časová zložitosť každého behu algoritmu BubbleSort je: O ) 39
Divá koveia? Matematiky korekte: g) Of)) g) Θf)) Čo sa používa: g) = Of)) g) = Θf)) 3- = O) Fukia Možia fukií 40
Sumarizáia o zložitosti Asymptotiká aalýza časovej zložitosti: zahyuje ako rastie čas výpočtu počet krokov) algoritmu v závislosti od toho, ako rastie veľkosť vstupu do ekoeča) abstrahuje sa od tehikýh detailov aditíve a multiplikatíve koštaty sa igorujú umožňuje idetifikovať rôze porovateľé triedy časovej zložitosti Θ - asymptotiky tesé hraičeie O asymptotiké ohraičeie zhora väčšiou stačí, keďže poskytuje garaie o maximálom trvaí behu algoritmu/výpočtu 41
O1) koštatá zložitosť Olog ) logaritmiká zložitosť Zaujímavé triedy zložitosti biáre vyhľadávaie v -prvkovej usporiadaej postuposti O) lieára zložitosť lieáre vyhľadávaie v -prvkovej eusporiadaej postuposti hľadaie miimálej hodoty v skutočosti Θ)) O ) kvadratiká zložitosť bublikové triedeia, triedeie výberom,... O 3 ) kubiká zložitosť O) expoeiála zložitosť kresleie Kohovej krivky úrove Na vičeiah: Ktorá trieda je lepšia? 4
Ω-otáia g )) f ) R, 0 N, 0, f ) g ) Ωg)) všetky fukie, ktoré sú asymptotiky zdola ohraičeé fukiou g) dolé ohraičeia sa používajú ie pri aalýze algoritmov, ale problémov 43
Ω-otáia Problém hľadaia miima v eusporiadaom v -prvkom poli má časovú zložitosť Ω) žiade algoritmus emôže ájsť miimum v poli bez toho, aby pozrel všetkýh hodôt, t.j. potrebuje aspoň krokov jeho časová zložitosť je teda Ω) Krása asymptotikýh ohraičeí zdola: Umožňujú dokázať ie to, že ľudia doposiaľ evymysleli rýhlejší algoritmus, ale že rýhlejší algoritmus ejde vymyslieť. Algoritmus je asymptotiky optimály pre ejaký problém, ak jeho časová zložitosť je Of)) a dolé ohraičeie pre problém je Ωf)). 44
Príklad a záver publi boolea metodait[] p) { for it i = 0; i < p.legth - 1; i++) for it j = i + 1; j < p.legth; j++) if p[i] == p[j]) retur true; } retur false; Aká je časová zložitosť metódy? 45
Potrebujeme to vôbe vedieť? Dokumetáie k.net Frameworku 4 od Mirosoftu: Kvalitá dokumetáia obsahuje iformáie o časovej zložitosti vykoávaia metódy efektívosti implemetáie). 46
Ď ť 47