Algoritmizace
Algoritmus
- Přesný návod či postup, kterým lze vyřešit daný typ úlohy.
- Měl by být co nejednoduší
- Pojem algoritmus se nejčastěji objevuje při programování, kdy se jím myslí teoretický princip řešení problému
- Obecně se ale algoritmus může objevit v jakémkoli jiném vědeckém odvětví. Jako jistý druh algoritmu se může chápat i např. kuchařský recept. Zpravidla však na algoritmy klademe určitá omezení.
Vlastnosti
- Jednoduchost (elementárnost)
- Skládá se z konečného počtu jednoduchých kroků
- Konečnost (rezultativnost)
- Každý algoritmus musí skončit v konečném počtu kroků.
- Počet kroků může být libovolně velký, ale musí být vždy konečný
- Postupy, které tuto podmínku nesplňují se mohou nazývat výpočetní metody (např. reaktivní proces, který průběžně reaguje s okolním prostředím)
- Obecnost
- algoritmus řeší všechny úlohy daného typu
- má širokou množinu možných vstupů
- Určitost (determinovanost)
- Každý krok algoritmu musí být jednoznačně a přesně definován
- V každé situaci musí být naprosto zřejmé, co a jak se má provést, jak má provádění algoritmu pokračovat.
- Korektnost
- algoritmus skončí pro libovolná (korektní) data správným výsledkem v konečném množství kroků.
- Výstup
- Algoritmus má alespoň jeden výstup, veličinu, která je v požadovaném vztahu k zadaným vstupům, a tím tvoří odpověď na problém, který algoritmus řeší
Metody návrhu
- Shora dolů – postup řešení rozkládáme na jednodušší operace
- Zdola nahoru – z elementárních kroků vytváříme prostředky, které nakonec umožní zvládnout požadovaný problém.
- Kombinace obou – obvyklý postup shora dolů doplníme “částečným krokem” zdola nahoru tím, že se například použijí knihovny funkcí, vyšší programovací jazyk nebo systém pro vytváření programů.
Dělení algoritmů
Iterativní a rekurzivní algoritmy
- Iterativní algoritmy
- Iterativní algoritmus je takový, který spočívá v opakování určité své části (bloku).
- Rekurzivní algoritmy
- Rekurzivní algoritmus naproti tomu opakuje kód prostřednictvím volání sebe sama
- Každý rekurzivní algoritmus lze převést do iterativní podoby.
- Výhoda rekurzivních algoritmů je v jejich snadno čitelném a kompaktním zápisu. Nevýhodou je spotřeba dodatečných systémových prostředků pro udržení jednotlivých rekurzivních volání.
Deterministické a nedeterministické algoritmy
- Deterministický algoritmus – Algoritmus, který má v každém svém kroku právě jednu možnost, jak pokračovat. Nedeterministický jich má více.
Sériové, paralelní a distribuované algoritmy
- Sériový algoritmus vykonává všechny kroky v sérii (jeden po druhém)
- Paralelní algoritmus tyto kroky vykonává zároveň (ve více vláknech)
- Distribuovaný algoritmus kroky vykovává zároveň na více strojích
Asymptotická složitost algoritmu
- Charakterizuje počet provedených operací v závislosti na velikosti dat
Způsoby zapsání algoritmu
- Písemně
- Postup se napíše slovně na kus papíru
- Diagramem
- Grafické znázornění jednotlivých kroků, pracovního postupu nebo nějakého procesu
- Programovacím jazykem
- Zápis algoritmů, jež mohou být provedeny na počítači
- Nazývá se program
Typy programovacích jazyků
Dle míry abstrakce
- Vyšší programovací jazyky (většina jazyků)
- Procedurální (imperativní)
- Strukturované (např. C, BASIC, Cobol)
- Objektově orientované (např. Smalltalk, Java)
- Neprocedurální (deklarativní)
- Funkcionální (např. Lisp, Haskell)
- Logické (např. Prolog, Gödel)
- Nižší programovací jazyky (např. jazyk symbolických adres, částečně VHDL)
Dle způsobu překladu a spuštění
-
Kompilované programovací jazyky (např. Pascal, C, Java, Cobol)
- Před spuštěním jsou nejprve kompletně přeloženy kompilátorem
- Výsledkem je větší rychlost, ale také větší náročnost na správně zapsaný kód
-
Interpretované programovací jazyky (např. BASIC, Perl, Python, shell, Ruby)
- Pouze interpretované (z toho důvodu jsou pomalejší – proto většina jazyků má alespoň nějakou jinou možnost, pokud nejsou stejně zpomalované něčím jiným, jako třeba shell)
- Překládané do mezikódu, nikoli do strojového kódu počítače (např. Java, Python)
- Překládané do strojového kódu - po spuštění za běhu programu počítače (např. Java, pokud se použije systém JIT)
Toto členění není absolutní, řada programovacích jazyků existuje v implementaci jak interpretované, tak kompilované (například zmíněná Java). Navíc jsou oba postupy někdy kombinovány, zdrojový kód je nejprve kompilován do mezikódu, který je poté interpretován.