I. Algoritmus, prostředky pro zápis algoritmu, algoritmické konstrukce. Složitost algoritmu, příklady algoritmů, algoritmicky neřešitelné problémy. Flashcards
Co je to algoritmus?
Postup při řešení určité třídy úloh, který je tvořen seznamem jednoznačně definovaných příkazů a zaručuje, že pro každou přípustnou kombinaci vstupních dat se po provedení konečného počtu kroků dospějě k požadovaným výsledkům.
Algoritmus pracuje se vstupy, veličinami, které jsou mu předány před započetím jeho provádění nebo v průběhu jeho činnosti. Vstupy mají definované množiny hodnot, jichž mohou nabývat.
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, jenž algoritmus řeší.
Jaké jsou vlastnosti algoritmu?
Vlastnosti:
● Hromadnost - měnitelná vstupní data
● Determinovanost - každý krok je jednoznačně definován
● Konečnost a resultativnost - pro přípustná vstupní data se po provedení konečného počtu kroků dojde k požadovaným výsledkům
Jaké jsou prostředky pro zápis algoritmu?
Prostředky pro zápis algoritmu:
● Programovací jazyk
● Slovní popis
● Vývojový diagram
● UML action diagram
● Strukturogramy
● Datově orientované diagramy HIPO
● Rozhodovací tabulky
● Pseudokód
Programovací jazyk (podotázka Jaké jsou prostředky pro zápis algoritmu?)
Porgram je předpis pro provedení určitých akcí počítačem zapsaný v programovacím jazyku (formální jazyk s definovanou syntaxí a sémantikou, který je zcela jednoznačný). Programovací jazyky mohou být kompilované (do strojového kódu) nebo interpretované pomocí jiného programu (například shell, JVM)
Slovní popis (podotázka Jaké jsou prostředky pro zápis algoritmu?)
Slovní popis - slovní popis v přirozeném jazyce
Vývojový diagram (podotázka Jaké jsou prostředky pro zápis algoritmu?)
Vývojový diagram - grafické znázornění algoritmu řešení úlohy jednotnými značkami a zkratkami
Strukturogramy (podotázka Jaké jsou prostředky pro zápis algoritmu?)
Strukturogramy - strukturogram je grafické znázornění algoritmu pomocí 3 základních programových struktur (posloupnost, opakování a větvení).
Datově orientované diagramy HIPO (podotázka Jaké jsou prostředky pro zápis algoritmu?)
Datově orientované diagramy HIPO - (z angl. hierarchical input process output model) je grafickým vyjádřením funkčního členění problému, struktury dat a postupu řešení problému při různém stupni podrobnosti.
Rozhodovací tabulky (podotázka Jaké jsou prostředky pro zápis algoritmu?)
Rozhodovací tabulky - používané při složitých větveních. Např. obrázek - Rozhodovací tabulka se smíšenou volbou
Pseudokód (podotázka Jaké jsou prostředky pro zápis algoritmu?)
Pseudokód je neformální způsob zápisu algoritmu, který používá strukturní konvence programovacích jazyků, avšak nezahrnuje detailní syntaxi, jako jsou deklarace proměnných, podprocedury nebo jiné konstrukce specifické pro konkrétní programovací jazyk. Zápis je pro srozumitelnost částečně doplněn popisy podrobností v přirozeném jazyce nebo kompaktně vyjádřeným matematickým zápisem.
Příklady pseudokódu
Následující příklad ilustruje rozdíl mezi pseudokódem a programovacím jazykem:
Programovací jazyk PHP:
if(je_platne($cislo_kk)) { spust_prenos($cislo_kk, $objednavka);
} else { zobraz_chybu();
}
?>
- Pseudokód:*
- *pokud** je číslo kreditní karty platné
proveď přenos, založený na číslech kreditní karty a objednávky
jinak
zobraz chybové hlášení
konec podmínky
Základní konstrukce algoritmu
- Strukturované programování
- Rekurze
- Princip seznamů
Popište strukturováné kédování (podotázka základní konstrukce algoritmu)
Strukturované programování
Podstatou je to, že rozklad úlohy na podúlohy se omezuje pouze na tři konstrukce, na sekvenci, selekci a iteraci - a žádné jiné konstrukce rozkladu nejsou použity.
Selekce = úloha se rozloží na dvě (nebo několik) podúloh, úloha se vyřeší tím, že se provede právě jedna podúloha (v závislosti na nějaké podmínce). Příklad: v závislosti na hodnotě diskriminantu počítám buď reálné, nebo komplexní kořeny.
Sekvence = úloha se rozloží na podúlohy, které se provádějí postupně za sebou. Příklad: kvadratickou rovnici vyřeším, když nejdříve vypočtu diskriminant a pak vypočtu kořeny.
Iterace = řešení úlohy sestává z opakovaného provádění podúlohy. Příklad: chůze je iterace kroků.
Tento koncept je vhodný pro větší kompaktní programy. Konstrukce rozkladu odpovídají řídicím konstrukcím programovacích jazyků, takže syntéza je jednoduchá - těžiště práce leží na tom, kdo provádí rozklad.
Rekurze (podotázka základní konstrukce algoritmu)
V programování rekurze představuje opakované vnořené volání stejné funkce (podprogramu), v takovém případě se hovoří o rekurzivní funkci (funkce volá sama sebe). Nedílnou součástí rekurzivní funkce musí být ukončující podmínka určující, kdy se má vnořování zastavit. Jelikož bývá nejčastějším zdrojem chyb, je třeba ji navrhnout dostatečně robustním způsobem a prověřit veškeré možné stavy. Pro uplatnění rekurzivních algoritmů je zapotřebí, aby programovací jazyk umožňoval volání podprogramu ještě před ukončením jeho předchozího volání. Po každém kroku volání sebe sama musí dojít ke zjednodušení problému. Pokud nenastane koncová situace, provede se rekurzivní krok. Každý algoritmus využívající rekurzi lze přepsat do nerekurzivního tvaru při použití zásobníku nebo jiné paměťové struktury.
Nepřímá rekurze -> Alespoň 2 podprogramy R a S. Podprogram R volá S a ten opět volá R.
Přímá rekurze -> Např. Výpočet faktoriálu nebo nejvyššího spol. Dělitele (NSD) => podprogram volá sám sebe
Rekurzi používáme
- Prohledávání do hloubky (backtracking) – řešení grafových úloh Metoda „rozděl a panuj“
- Některé třídící algoritmy (quicksort, mergesort), Hanojské věže
- Aritmetické výrazy
Princip seznamů (podotázka základní konstrukce algoritmu)
Princip seznamů
Seznam je základní dynamická datová struktura. Je to posloupnost záznamů stejného typu, které jsou navzájem lineárně provázány vzájemnými odkazy pomocí ukazatelůnebo referencí.Aby byl seznam lineární, nesmí existovat cykly ve vzájemných odkazech. Lineární seznamy mohou existovat jednosměrné a obousměrné. V jednosměrném seznamu odkazuje každá položka na položku následující a v obousměrném seznamu odkazuje položka na následující i předcházející položky. Zavádí se také ukazatel nebo reference na aktuální (vybraný) prvek seznamu. Na konci (a začátku) seznamu musí být definována zarážka označující konec seznamu.
Lineárně spojové seznamy
Lineární spojové seznamy
Základní dynamickou datovou strukturou je lineární spojový seznam. Je to posloupnost záznamů stejného typu seřazených za sebe. V programech zastává často podobnou funkci jako jednorozměrné pole. Na rozdíl od pole nám neumožňuje přímý přístup k jednotlivým položkám pomocí indexů, LSS musíme vždy procházet sekvenčně od začátku.
Druhy lineárně spojových seznamů
Druhy:
-
Jednosměrný
- Do každého uzlu seznamu je uložena hodnota a jeden ukazatel ukazuje na následující uzel.
- Poslední ukazatel ukazuje na hodnotu nil, která signalizuje konec seznamu.
-
Obousměrný
- Každý ukazatel obsahuje dva ukazatele – na svého předchůdce a na následníka v seznamu.
- Paměťově náročnější, ale umožňuje zato procházet seznamem oběma směry a snáze se také provádí některé další akce (vypouštění prvků).
Nejčastěji používanými spojovými seznamy jsou tzv. zásobníky, fronty a uspořádané seznamy. Liší se především způsobem rozšiřování (přidávání prvků) a zkracování (odebírání prvků).
Přidání prvku do zásobníku -> na začátek, do fronty -> na konec.
Nelineární jsou pak stromy a grafy