Stránka archivována (Algoritmy 1 - 2022/2023 ZS)
Základní informace
Zdroje:
- Stránky předmětu ve STAGu.
- Slidy z přednášek a další zdroje na stránkách přednášejícího.
V akademickém roce 2021/2022 vedu tato cvičení:
V případě jakýchkoliv dotazů ke cvičením nebo jejich obsahu mě neváhejte kontaktovat (kontakty zde).
Zápočtové podmínky
- První podmínkou na zápočet je získat alespoň 60% bodů ze zadaných úkolů (1 písemný test v druhé polovině semestru, 1 implementace algoritmů).
- Druhou podmínkou je docházka na alespoň 75% cvičení.
- 22.11.2022 - přeškálování bodování, aby odpovídalo již napsané písemce
- tj místo 50 bodů za písemku a 50 bodů za úkol je nyní 10 bodů za písemku a 10 bodů za úkol.
- poměry bodů za písemku a úkol (i za jednotlivé příklady na písemce a úkolu) zůstávají stejné
- započotvý požadavek 60% bodů zůstává stejný (v součtu alespoň 12 bodů z 20)
Zápočtový úkol
- 22.11.2022 - úprava škálování bodů (vizte výše)
- Za úkol lze získat maximálně 10 bodů.
- Úkoly odevzdávejte emailem na tomas.urbanec@upol.cz s předmětem “ALGO1 zápočtový úkol” (tento předmět dodržujte a používejte jej jen pro odevzdávání úkolů - emaily jsou automaticky zpracoávány).
- Termín pro odevzdání je 13.12.2022, 23:59 CET. Za každou započatou hodinu případného zpoždění přijdete o 1 bod.
- Chce-li někdo na předtermín a potřebuje zápočet dříve než v zápočtovém týdnu, ozvěte se i dalším emailem s předmětem ALGO1 zápočet předtermín.
- Na výběr máte ze dvou zadání. Jedno obsahuje více teorie a méně programování a druhé více programování a méně teorie. Odevzdat můžete řešení pouze jednoho z nich.
Zadání 1 (více teorie)
Dokažte, že O(f(n)+g(n)) = O(max(f(n),g(n))) pro f, g : ℕ → ℕ. (2 body)
Navrhněte a v pseudokódu zapište dva různé algoritmy pro výpočet hodnoty výrazu n(nn), kde n ∈ ℕ.
- První nevyužívající pomocných funkcí ani rekurze.
- Druhý, který pro výpočet nk (k ∈ ℕ) používá pomocnou rekurzivní funkci - tu rovněž navrhněte a zapište pseudokódem. U obou algoritmů určete složitost a její co nejlepší asymptotický odhad (i s postupem). (5 bodů)
V jazyce C nebo Python proveďte následující:
Ve funkci
sort_1(pole)
pro Python- nebo
int sort_1(int pole[], int velikost)
pro C
implementujte 1 z algoritmů:
- bubble sort,
- selection sort,
- insertion sort.
Třiďte vzestupně.
Ve funkci
sort_2(pole)
pro Python- nebo
int sort_2(int pole[], int velikost)
pro C
implementujte 1 z algoritmů:
- quick sort,
- merge sort,
- heap sort.
Třiďte vzestupně.
Argument
pole
je pole k setřízení. V C je navíc i argumentvelikost
obsahující počet prvků v poli pole.Za pomocí těchto funkcí poté napište malý program, který vygeneruje náhodné pole s 1000 prvků. To následně setřídí každou z dodaných funkcí a přitom změří čas běhu pro každou funkci.
Měření času v C:
#include <time.h> int main(){ clock_t start, end; double cpu_time_used; start = clock(); // kód k změření printf("Jak dlouho běžím?"); end = clock(); cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; // výpis naměřeného času printf("%f", cpu_time_used); }
- Měření času v Pythonu:
import time t = time.process_time() #kód k změření print("jak dlouho běžím?") elapsed_time = time.process_time() - t # výpis naměřeného času print(elapsed_time)
(3 body)
Zadání 2 (více programvání)
V jazyce C nebo Python implementujte funkce:
int insertion_sort_with_counting(int pole[], int velikost, int poradi)
pro C;insertion_sort_with_counting(pole, poradi)
pro Python ,int quick_sort_with_counting(int pole[], int velikost, int poradi)
pro C;quick_sort_with_counting(pole, poradi)
pro Python,int merge_sort_with_counting(int pole[], int velikost, int poradi)
pro C;merge_sort_with_counting(pole, poradi)
pro Python,
které setřídí dodané pole odpovídajícím algoritmem a přitom spočítají, kolik porovnání dvou prvků z pole algoritmus provedl - výslednou hodnotu funkce vrátí volajícímu.
- Argument
pole
je pole k setřízení, - Argument
poradi
určuje, jak má být pole setřízeno - je-liporadi
záporné číslo, třiďte sestupně, v jiném případě třiďte vzestupně. - V C je navíc i argument
velikost
obsahující počet prvků v polipole
.
Za pomocí těchto funkcí poté napište malý program, který vygeneruje náhodné pole s 1000 prvků. To následně setřídí každou z dodaných funkcí vzestupně a na standardní výstup vypíše informaci o tom, kolik porovnání mezi prvky z pole každá z funkcí provedla.
(7 bodů)
Nalezněte a dokažte alespoň pět asymptotických vztahů mezi těmito funkcemi (vztahy k dokázaní si vyberte sami; vztah funkce k sobě samé se nepočítá):
- log(log(n)),
- n!,
- n3/2,
- 10n,
- nn.
(3 body)
Zápočtová písemka
- 22.11.2022 - úprava škálování bodů (vizte výše)
- Zá písmeku lze získat maximálně 10 bodů.
- Písmeka bude na cvičení 22. a 28.11. 2022. Opravná písemka bude 6. a 12.12.2022.
- Více informací k obsahu písemky bude sděleno na cvičení týden před písemkou.
Plagiátorství
Z webu katedry:
“Pokud se student dopustí plagiátorství, opisování při písemném testu, opisování při práci na domácím úkolu nebo se jiným způsobem pokusí o podvod, zahájí s ním vedoucí katedry kárné řízení. Pokud se takové jednání studenta opakuje, vedoucí katedry navrhne děkanovi fakulty vyloučit studenta ze studia.”
Všechny úkoly budou mimo automatických testů kontrolovány i vyučujícím a MOSSem. Pokud bude odhalena příliš velká shoda, budou všichni studenti, kterých se to týká, nahlášeni vedení katedry.
Seznam cvičení
- Cvičení 20. a 26.9.2022
- Cvičení 19.9.2022 neproběhlo kvůli přednášce o úvodu do studia.
- Cvičení 27.9 a 3.10.2022
- Cvičení 4. a 10.10.202
- Cvičení 11. a 17.10.2022
- Cvičení 18. a 24.10.2022
- Cvičení 25. a 31.10.2022
- Cvičení 1. a 7.11.2022
- Cvičení 8. a 14.11.2022
- Cvičení 15. a 21.11.2022
- Cvičení 22. a 28.11.2022
- Cvičení 29.11. a 5.12.2022
- Cvičení 6. a 12.12.2022
- Cvičení 13.12.2022