ALGORITMIZACE A DATOV STRUKTURY 14 ASD 13 cvien

  • Slides: 49
Download presentation
ALGORITMIZACE A DATOVÉ STRUKTURY (14 ASD) 13. cvičení

ALGORITMIZACE A DATOVÉ STRUKTURY (14 ASD) 13. cvičení

Pokročilé programování • rekurze • backtracking • hladový algoritmus • rozděl a panuj •

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

Rekurze • programovací technika, kdy se uvnitř algoritmu volá tentýž algoritmus • přímá 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 - Karel rovně dojde ke zdi

Algoritmus Dojdi. Ke. Zdi – pomocí rekurze

Algoritmus Dojdi. Ke. Zdi – pomocí rekurze

Příklad – výchozí stav

Příklad – výchozí stav

Příklad – konečný stav

Příklad – konečný stav

Algoritmus Dojdi. Ke. Zdi_Vrat. Se. Do. Pulky – robot Karel dojde ke zdi a

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

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 – počáteční stav

Příklad – stav před 1. rekurzivním voláním

Příklad – stav před 1. rekurzivním voláním

Příklad – stav po 1. rekurzivním voláním

Příklad – stav po 1. rekurzivním voláním

Příklad – konečný stav

Příklad – konečný stav

Příklad rekurze – Fibonacciho číslo • f 0=0 • f 1=1 • # deklarace

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

Hladový algoritmus hledá řešení celé úlohy po jednotlivých krocích a splňuje následující dvě podmínky:

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,

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,

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,

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

Backtracking • „metoda pokusu a omylu“ • postupně se zkouší všechny možnosti, jak vyřešit

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č

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

Ř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

Příklad na Backtracking

ROZDĚL A PANUJ

ROZDĚL A PANUJ

Rozděl a panuj 1. rozděl - rozdělí úlohu na a (nezávislých) podúloh stejné velikosti

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

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

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

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

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

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Í

Dynamické programování • dynamicky se (za běhu programu) postupně staví řešení jednodušších problémů, která

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

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

Ř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

bez použití pole s použitím pole