Najneskorší termín odovzdania: 4.3.2013 (pondelok) o 9:50
Odovzdávané súbory: AdamSort.java
Doplňujúce požiadavky:
2 body: Na cvičeniach vám cvičiaci spomínali, že pri asymptotickej časovej zložitosti na základe logaritmu nezáleží. Aby ste sa o tom presvedčili, formálne dokážte:
(d+50)*logm+2(n) = O(log2 n)
, kde d
je deň vášho narodenia a m
je mesiac vášho narodenia.
1 bod: Zoraďte jednotlivé funkcia podľa O-notácie tak, aby ak je funkcia f
pred funkciou g
, potom f = O(g)
. Hodnotu d
nahraďte dňom vášho narodenia a hodnotu m
mesiacom vášho narodenia.
2n-2
3*n3 - m*n
(d+5)*n + log(n)
n + d5
2*n2*log10(n)
Riešenie tejto úlohy odovzdajte v písomnej podobne svojmu cvičiacemu alebo najneskôr 4.3.2013 pred prednáškou.
Adam sa zúčastnil 2. prednášky z PAZ1b, kde bolo prezentované binárne vyhľadávanie v usporiadanej postupnosti v čase O(log n)
, triedenie výberom a bublikové triedenie bežiace v čase O(n2)
.
Adam bol fascinovaný triediacimi (usporadúvacími) algoritmami. Začal googliť a na YouTube našiel aj tieto videá:
Keď ich tak pozeral, chytrý algoritmus analyzujúci "divákov" na YouTube sa rozhodol Adamovi odporučiť na pozretie aj toto video: http://www.youtube.com/watch?v=k4RRi_ntQc8 Jeho pozretie výrazne zmenilo Adamov život (teda aspoň na pár najbližších hodín). Keď Obama tvrdí, že BubbleSort (bublinkové triedenie) nie je ta správna cesta ako "sortovať", znamená to, že musí existovať niečo lepšie (čo určite FBI, CIA, NSA a ktovie kto ešte pred svetom dôkladne strážia). Pred Adamom teraz stála jasná výzva: nájsť lepší algoritmus. Po intenzívnom rozmýšľaní prišiel s geniálnou stratégiou pre triediaci algoritmus, ktorý by mal mať asymptoticky lepšiu časovú zložitosť ako triedenie výberom, či bublinkové triedenie. Jeho stratégia vychádzala z tejto úvahy:
Predpokladajme, že máme utriediť n
čísel. Riešme teda menší problém a nejako rekurzívne utrieďme n-1
čísel. Konkrétne, rekurzívne utrieďme prvých n-1
čísel v poli a číslo na poslednom indexe nechajme tak. Aby sme dostali utriedenú postupnosť n
čísel, ostáva nám už len umiestniť číslo na poslednom indexe na správne miesto. Nuž a toto miesto (index) vieme predsa nájsť binárnym vyhľadávaním v čase O(log n)
. Celková zložitosť algoritmu by tak mala byť lepšia, pretože to, čo vlastne robíme je, že n
krát vkladáme číslo (najprv na indexe 0
, potom 1
, 2
, ..., n-1
) do nejakej už utriedenej postupnosti s využitím binárneho vyhľadávania s logaritmickou časovou zložitosťou.
4 body: Na základe Adamovej myšlienky implementujte nerekurzívny triediaci algoritmus (metóda utried
v nižšie uvedenej triede AdamSort
).
1 bod: Analyzujte Adamov algoritmus. Bude jeho stratégia fungovať, t.j. budú sa dať nejako takto utriediť čísla? Akú časovú zložitosť bude mať algoritmus založený na tejto stratégii? Je pravda, že sa mu podarí skonštruovať algoritmus, ktorý bude asymptoticky lepší ako triedenie výberom alebo bublinkové triedenie? Svoje odpovede zdôvodnite a podporte argumentami. V písomnej podobe ich odovzdajte cez Moodle (ako komentár k odoslanej implementácii triedy AdamSort
alebo ako samostatný textový súbor).
Poznámka: Ako odpovedať stručne na otázky o časovej zložitosti (samozrejme v prípade, že algoritmus funguje)?
O(T(n))
, pretože ...
T(n) = n2
, potom Adamov algoritmus má rovnakú asymptotickú zložitosť ako triedenia z prednášky.
T(n)
nie je v O(n2)
, potom Adamov algoritmus má asymptoticky horšiu časovú zložitosť ako algoritmy z prednášky.
n2
nie je v O(T(n))
, potom Adamov algoritmus má asymptoticky lepšiu časovú zložitosť než algoritmy z prednášky.