ALGORITMIZACE A DATOV STRUKTURY 14 ASD 13 cvien

















































- Slides: 49
ALGORITMIZACE A DATOVÉ STRUKTURY (14 ASD) 13. cvičení
Pokročilé programování • rekurze • backtracking • hladový algoritmus • rozděl a panuj • dynamické programování https: //ksp. mff. cuni. cz/kucharky/zakladni-algoritmy/
REKURZE
Rekurze • programovací technika, kdy se uvnitř algoritmu volá tentýž algoritmus • přímá rekurze - algoritmus A přímo volá algoritmus A • nepravá neboli nepřímá rekurze - algoritmus A volá algoritmus B a algoritmus B volá algoritmus A • rekurze musí někdy skončit!!!
Algoritmus Dojdi. Ke. Zdi - Karel rovně dojde ke zdi
Algoritmus Dojdi. Ke. Zdi – pomocí rekurze
Příklad – výchozí stav
Příklad – konečný stav
Algoritmus Dojdi. Ke. Zdi_Vrat. Se. Do. Pulky – robot Karel dojde ke zdi a vrátí se do půlky cesty • Úvaha: dopředu udělá dva kroky, při cestě zpět na dva kroky připadne krok pouze jeden.
Algoritmus Dojdi. Ke. Zdi_Vrat. Se. Do. Pulky – robot Karel dojde ke zdi a vrátí se do půlky cesty
Příklad – počáteční stav
Příklad – stav před 1. rekurzivním voláním
Příklad – stav po 1. rekurzivním voláním
Příklad – konečný stav
Příklad rekurze – Fibonacciho číslo • f 0=0 • f 1=1 • # deklarace funkce fib v jazyce Python • fn=fn-1+fn-2 • f 2=f 1+f 0 • f 3=f 2+f 1 • f 4=f 3+f 2 • f 5=f 4+f 3 • atd. # volání funkce fib hodnota = fib(20)
HLADOVÝ ALGORITMUS
Hladový algoritmus hledá řešení celé úlohy po jednotlivých krocích a splňuje následující dvě podmínky: • v každém kroku se zvolí lokálně nejlepší řešení • provedené rozhodnutí se již nikdy neodvolává
Příklad na hladový algoritmus • Automat na jídlo by měl vracet peníze nazpět tak, aby vrátil daný obnos v co možná nejmenším počtu mincí. Pro náš měnový systém (máme mince hodnot 1, 2, 5, 10, 20 a 50 Kč) lze tuto úlohu řešit hladovým algoritmem – v každém kroku algoritmu vrátíme tu největší minci, kterou můžeme.
Příklad na hladový algoritmus • Automat na jídlo by měl vracet peníze nazpět tak, aby vrátil daný obnos v co možná nejmenším počtu mincí. Pro náš měnový systém (máme mince hodnot 1, 2, 5, 10, 20 a 50 Kč) lze tuto úlohu řešit hladovým algoritmem – v každém kroku algoritmu vrátíme tu největší minci, kterou můžeme.
Příklad na hladový algoritmus • Automat na jídlo by měl vracet peníze nazpět tak, aby vrátil daný obnos v co možná nejmenším počtu mincí. Pro náš měnový systém (máme mince hodnot 1, 2, 5, 10, 20 a 50 Kč) lze tuto úlohu řešit hladovým algoritmem – v každém kroku algoritmu vrátíme tu největší minci, kterou můžeme. pokud bychom měli jen mince hodnoty 20, 10 a 4 Kč
BACKTRACKING
Backtracking • „metoda pokusu a omylu“ • postupně se zkouší všechny možnosti, jak vyřešit nějaký problém
Příklad na Backtracking • hledání rozkladu zadané částky na mince o hodnotách 5 Kč a 3 Kč • tzn. částka = 3*x + 5*y • např. 7 Kč nejde složit z mincí o hodnotě 5 Kč a 3 Kč • např. 21 = 3*2 + 5*3
Řešení příkladu na Backtracking • V každém kroku zkusíme nejdříve použít pětikorunovou minci a zavoláme stejnou funkci na zbylou částku, a když náš rozklad nevyjde, zkusíme v tomto kroku použít ještě tříkorunu. Takto se rozhodujeme v každém kroku rekurze a případně se vracíme z neúspěšných větví výpočtu a zkoušíme další možnosti. • Je využita rekurze
Příklad na Backtracking
ROZDĚL A PANUJ
Rozděl a panuj 1. rozděl - rozdělí úlohu na a (nezávislých) podúloh stejné velikosti n/a 2. vyřeš - vyřeší podúlohy a to buď přímo pro dostatečně malé, nebo rekurzivně pro větší 3. sjednoť - sjednotí řešení podúloh do řešení původní úlohy velikosti n
Merge sort • řadicí algoritmus 1. Rozdělí neseřazenou množinu dat na dvě podmnožiny o přibližně stejné velikosti. 2. Seřadí obě podmnožiny. 3. Spojí seřazené podmnožiny do jedné seřazené množiny.
https: //upload. wikimedia. org/wikipedia/commons/thumb/e/e 6/Merge_sort_algorithm_di agram. svg/1200 px-Merge_sort_algorithm_diagram. svg. png
Vyhledávání binárním půlením Algoritmus je aplikovatelný pouze na neklesající posloupnost prvků (pole), případně po modifikaci na nerostoucí posloupnost prvků. Rekurzivně se opakuje porovnání hledaného prvku X s prvkem uprostřed pole a[i] (i=n/2 nebo i=(n+1)/2). Pokud se hodnota obou prvků shoduje pak je prvek nalezen. Pokud X<a[i], algoritmus se aplikuje na polovinu menších prvků, jinak na polovinu větších prvků. http: //www. algoritmy. net/article/21/Binarni-vyhledavani
Hledá se číslo 3 1 2 3 4 5 6 7 1 2 3 4 5 9 10
Hledá se číslo 40 1 2 3 4 5 6 7 8 9 10 11 12 1 5 7 13 14 22 23 24 35 49 55 99 Hledané číslo nenalezeno.
DYNAMICKÉ PROGRAMOVÁNÍ
Dynamické programování • dynamicky se (za běhu programu) postupně staví řešení jednodušších problémů, která jsou následně použita pro řešení složitějších • hlavní podstatou je ukládání a opětovné použití již jednou vypočtených údajů • Hodí se na úlohy, které se dají dělit na podúlohy, které jsou si podobné a mohou se opakovat. Výsledky takovýchto podúloh si poté ukládáme a při dotazu na stejnou podúlohu vrátíme jen uložený výsledek a výpočet již neprovádíme.
Příklad – Fibonacciho číslo • f 0=0 • f 1=1 • fn=fn-1+fn-2
Řešení • ukládat si výsledky vypočtených Fibonacciho čísel a již jednou vypočtená čísla znovu nepočítat
bez použití pole s použitím pole