Najneskorší termín odovzdania: 6.3.2022 (nedeľa) o 18:00
Odovzdávané súbory: AdamSort.java
, YouTubeSort.java
, SpravneZavazia.java
Doplňujúce požiadavky:
Riešenie tejto časti môžete nahrať vo vhodnom formáte do moodlu. Ideálne vyriešiť na papier, oskenovať/fotiť a odovzdať.
1 bod: 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:
3*d*logm+2(n) = O(log2 n)
, kde d
je deň vášho narodenia a m
je mesiac vášho narodenia.
0.5 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.
n + d6
2*n4 - m*n
2n-2
(d+3)*n + log(n)
n3*log10(n)
nm+6
+0.5 boda: Aspoň pre jednu dvojicu týchto funkcií formálne dokážte, že f = O(g).
Poznámka: Pri formálnom zdôvodnení sa očakávajú pekné dôkazy. Hodnotitelia majú základy logiky (zvládajú logické operátory a logické výrazy), pokiaľ ide o všeobecnú matematiku, tu zvládajú len na úrovni základnej školy. Takže dajte si pozor na to, čo prehlásite ako zrejmé.
Folklór je dnes opäť "in". Vedeli ste, že folklór a algoritmy nemajú od seba až tak ďaleko? Nuž pozrite si video s tanečnou vizualizáciou triedenia výberom: http://www.youtube.com/watch?v=Ns4TPTC8whw
Ako si však niektorí všimli, tanečníci implementovali trochu iný algoritmus triedenia výberom, než bol prezentovaný na prednáške. Ako by vyzeral tento algoritmus zapísaný v Jave?
Uvažujme triedu TriediaciAlgoritmus
z cvičenia.
Prekrytím abstraktnej metódy utried
vytvorte triedu YouTubeSort
, ktorá bude implementovať algoritmus triedenia výberom podľa uvedeného videa na YouTube.
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.
2 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.
Máme n
závaží usporiadaných od najľahšieho po najťažšie (ich hmotnosti sú v poli zavazia
). Viacero závaží môže mať rovnakú hmotnosť. Kvôli jednoduchosti predpokladáme, že hmotnosť každého závažia je celé číslo v gramoch. Implementujte metódu, ktorá vráti, či vieme vybrať nejaké 2 závažia tak, že súčet ich hmotností je presne h
.
Úlohu ide riešiť v čase O(n2)
jednoducho 2 vnorenými cyklami. Chceme ale samozrejme asymptoticky lepšie riešenia.
Počet bodov záleží od asymptotickej časovej zložitosti riešenia a argumentácie (komentároch) o funkčnosti kódu a jeho zložitosti. V prípade rovnakej asymptotickej časovej zložitosti rozhoduje aj čas nameraný pri evaluácii a kvalita argumentov dokazujúcich, že algoritmus je korektný.