Předávání parametrů z příkazové řádky OS (1) Spustitelnému programu mohou být z příka-zové řádky OS předány vstupní parametry Každý parametr musí být oddělen mezerou nebo tabulátorem Např. Prumer /g 10 20 1 15 4 8 5 Prumer značí spustitelný program: odkaz na soubor Prumer.exe 01/06/2018
Předávání parametrů z příkazové řádky OS (2) Zbývající část potom tvoří jednotlivé vstup-ní parametry Parametry zapsané na příkazové řádce OS jsou předávány funkci main Hlavička funkce main musí být zapsána ve tvaru: int main(int argc, char *argv[]) 01/06/2018
Předávání parametrů z příkazové řádky OS (3) argc: udává celkový počet řetězců (ukazatelů), které jsou obsaženy v poli argv (počet předávaných paramet-rů plus jedna) argv: představuje pole řetězců, v němž: argv[0]: obsahuje jméno spouštěného programu argv[1] až argv[argc-1]: obsahují jednotlivé předávané parametry 01/06/2018
Složitost algoritmů (1) Na začátku minulého století vzniká pochyb-nost o tom, zda některé algoritmy vůbec existují V této době totiž vznikla také potřeba najít matematický ekvivalent doposud intuitivně chápaného pojmu algoritmus Tato formalizace se uskutečnila kolem roku 1936 a přinesla důkaz, že existují nerozhod-nutelné (neřešitelné) algoritmické problémy 01/06/2018
Složitost algoritmů (2) Teorie, která vznikla formalizací pojmu algo-ritmus a které se často říká teorie algoritmů je v podstatě teorií vyčíslitelnosti, teorií existen-ce algoritmů a teorií nerozhodnutelných prob-lémů Existence rychlých počítačů vytvořila podmín-ky a potřebu pro vznik teorie, která věnuje po-zornost problematice: analýzy a efektivity algoritmů (programů) složitosti algoritmů hledání optimálních algoritmů 01/06/2018
Složitost algoritmů (3) Má to následující důvody: nalezení efektivnějšího algoritmu často umožňu-je řešit předtím prakticky neřešitelné problémy nalezení efektivnějšího algoritmu může přinést více než realizovatelné zrychlení počítačů i malé zefektivnění velmi často prováděných algoritmů (programů) může přinést výrazný ča-sový a ekonomický efekt. Toto je zvláště důležité při: tvorbě základního programového vybavení (firmwa-re, OS, ovladače zařízení) při práci s velkým množstvím dat 01/06/2018
Asymptotická složitost alg. (1) Při konstrukci algoritmu se snažíme obvykle najít co nejlepší algoritmus a k tomu potře-bujeme kritérium, které by dovolilo vzájem-né porovnání algoritmů Z praktického i teoretického hlediska má v tomto směru velký význam složitost: časová: udává jak roste čas, který algoritmus potřebuje ke své činnosti v závislosti na rozsahu problému (veli-kosti vstupních dat) 01/06/2018
Asymptotická složitost alg. (2) paměťová: udává jak roste kapacita paměti, kterou algoritmus potřebuje ke své činnosti v závislosti na rozsahu problému (velikosti vstupních dat) Detailní vyjádření těchto závislostí je větši-nou velmi komplikované, těžko určitelné a také velmi nepřehledné Proto je užitečné zaměřit se na vyjádření tzv. asymptotické složitosti algoritmu 01/06/2018
Asymptotická složitost alg. (3) Nás bude především zajímat časová asymp-totická složitost Vstupní údaje problému charakterizujeme jediným přirozeným číslem n: tzv. rozsah problému jistým způsobem reprezentuje rozsah (velikost) vstupních dat – např. délku posloupnosti, počet uzlů grafu, rozměr matice atd. 01/06/2018
Asymptotická složitost alg. (4) Je-li A algoritmus řešení daného problému, označme fA(n) funkci udávající maximální počet základních operací charakteristických pro daný problém, např. srovnání pro třídící algoritmy násobení u násobení matic které algoritmus provede při řešení problé-mu rozsahu n 01/06/2018
Asymptotická složitost alg. (5) Jsou-li f(n) a g(n) dvě funkce (které přiřazují přirozeným číslům reálná čísla), píšeme: f (n) = O (g (n)) jestliže existují přirozená čísla n0 a k tak, že pro každé n ł n0 platí: f (n) Ł k.g (n) Je-li fA (n) = O (g (n)), říkáme, že funkce fA (n) (až na multiplikativní konstantu) z asymptotic-kého hlediska neroste rychleji než g (n) 01/06/2018
Asymptotická složitost alg. (6) Funkci g (n) nazýváme časovou asymptotic-kou složitostí algoritmu A O algoritmu A řekneme, že jeho časová slo-žitost je: polynomiální: jestliže fA (n) = O (Pm (n)), kde Pm(n) je polynom nějakého pevného stupně m exponenciální: v opačném případě 01/06/2018
Polynomiální algoritmy Čas, který potřebují ke zpracování vstupních dat algoritmy považované za rychlé bývá zpravidla shora omezen funkcemi typu n, n.log (n), n2 a n3 Jako horní hranici lze vždy použít polynom Proto se těmto algoritmům říká polynomiál-ní nebo také prakticky použitelné 01/06/2018
Exponenciální algoritmy (1) Pomalé (prakticky nepoužitelné) algoritmy užívají metodu „hrubé síly“, kterou probírají všechny možnosti Je-li dána n prvková množina a probírají-li se všechny její: podmnožiny: je potřeba alespoň 2n kroků permutace: je potřeba alespoň n! kroků zobrazení do sebe: je potřeba alespoň nn kroků Odhad počtu kroků je alespoň exponenciální 01/06/2018
Exponenciální algoritmy (2) Příklad: Problém obchodního cestujícího je dán seznam n měst a pro každou dvojici měst je známa jejich vzdálenost (výše jízdného). Určete nejkratší (nejlevnější) cestu procházející všemi městy daného seznamu Algoritmus, který systematicky vyčísluje všechny permutace je exponenciální, jeho časová složitost je O (n!) 01/06/2018
Srovnání algoritmů (1) Následující tabulka uvádí maximální rozsah problému, který je možné řešit jednotlivými algoritmy v čase 1sekunda, 1 minuta a 1 hodina Základní časová jednotka, tj. délka trvání základní operace je jedna milisekunda 01/06/2018
Srovnání algoritmů (2) Max. rozsah problému 1 sec. 1 min. 1 hod. A1 n 1000 60 000 3 600 000 A2 n + log (n) 990 59 984 3 599 978 A3 n.log (n) 140 4 893 200 000 A4 10n 100 6 000 360 000 A5 n2 31 244 1 897 A6 100n2 3 24 189 A7 n3 10 39 153 A8 n3 + n2 + 10n 3 9 38 153 2 A9 2n 9 15 21 01/06/2018
Srovnání algoritmů (3) V následující tabulce je uveden čas potřeb-ný ke zpracování vstupních dat rozsahu n, jestliže počet operací, které je nutné provést, je dán funkcí f (n) Provedení jedné operace trvá jednu mikrosekundu 01/06/2018
Srovnání algoritmů (4) n f(n) 20 40 60 80 100 200 500 1 000 n 20 ms n.log (n) 86 ms 0,2 ms 0,35 ms 0,5 ms 0.7 ms 1,5 ms 4,5 ms 10 ms n2 0,4 ms 1,6 ms 3,6 ms 6,4 ms 10,0 ms 40 ms 0,25 s 1 s n3 8,0 ms 64 ms 0,22 s 0,5 s 1 s 8 s 125 s 17 min n4 0,16 s 2,56 s 13 s 41 s 100 s 27 min 17 h 11,6 dní 2n 1,00 s 11,7 dní 36 600 let 3,6.109 let n! 77 000 let 01/06/2018
Srovnání algoritmů (5) Následující tabulka ukazuje zvětšení rozsa-hu zpracovatelných úloh, které odpovídá zvětšení výpočetní rychlosti použitého počítače 10 x, 100 x a 1 000 x Hodnoty v tabulce vychází z předpokladu, že původně bylo možno v daném časovém limitu zpracovat vstupní data o rozsahu n = 100 01/06/2018
Srovnání algoritmů (6) f(n) 1 x 10 x 100 x 1000 x n 100 1 000 10 000 100 000 n.log (n) 100 702 5 362 43 150 n2 100 316 1 000 3 162 n3 100 215 464 1 000 n4 100 177 316 562 2n 100 103 106 109 n! 100 100 100 101 01/06/2018