Najneskorší termín odovzdania: 4.3.2012 (nedeľa) o 21:00 (resp. časť 6.3.2012, 10:00)
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-1
2*n3 - m*n
(d+5)*n + log(n)
n + d3
2*n2*log5(n)
Riešenie tejto úlohy odovzdajte v písomnej podobe svojmu cvičiacemu/cvičiacej najneskôr na začiatku praktického cvičenia dňa 6.3.2012.
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)
. Zhliadnutie videa s prezidentom Obamom bola pre neho jasná výzva. 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.