Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Úvod do programování 11. hodina
RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015
2
Úvod do programování 11. hodina
Umíme z minulé hodiny Rekurze Faktoriál Přetečení, nekonečná rekurze Převod z desítkové do dvojkové soustavy Vztah rekurze a cyklu Fibonacciho čísla Verze s dynamickým programováním Binární vyhledávání Hanojské věže Kochova vločka Jan Lánský Úvod do programování 11. hodina
3
Úvod do programování 11. hodina
Cíle hodiny Zásobník Create, Push, Pop, Top, IsEmpty Fronta Create, Enqueue, Dequeue, Front, IsEmpty Cyklická fronta, fronta s posunem, prioritní fronta Backtracking - úvod N-ciferná čísla (variace s opakováním) doplnění znamének Jan Lánský Úvod do programování 11. hodina
4
Zásobník Datová struktura umožňující vkládat o odebírat prvky
Stack Datová struktura umožňující vkládat o odebírat prvky Implementace pomocí struktury obsahující pole LIFO - last in first out Prvek, který byl vložen jako první, bude odebrán jako poslední. Prvek, který byl vložen jako poslední, bude odebrán jako první Příklady použití Zásobník volání funkcí Při odstraňování rekurze Prohledávání do hloubky (DFS) Papíry na pracovním stole Pokud předávám zásobník jako parametr funkce, která bude vkládat nebo odebírat prvky, musí se předat reference Jan Lánský Úvod do programování 11. hodina
5
Úvod do programování 11. hodina
Zásobník: funkce Create – vytvoří prázdný zásobník Push – vloží prvek na vrchol zásobníku Pop – odebere prvek z vrcholu zásobníku a vrátí jeho hodnotu Top – vrátí hodnotu prvku z vrcholu zásobníku, aniž by ho odebral IsEmpty – zda je zásobník prázdný Jan Lánský Úvod do programování 11. hodina
6
Zásobník: implementace I.
Maximální počet prvků v zásobníku Pole pro uchování prvků uložených v zásobníku Index vrcholu zásobníku v poli Vytvoříme pole o velikosti maximálního počtu prvků V zásobníku není žádný prvek, vrchol bude před začátkem pole Jan Lánský Úvod do programování 11. hodina
7
Zásobník: implementace II.
Nutná reference Zvýšíme vrchol zásobníku Zapíšeme hodnotu do pole na pozici nového vrcholu Nutná reference Z pole vyzvedneme hodnotu na pozici vrcholu Snížíme vrchol zásobníku Jan Lánský Úvod do programování 11. hodina
8
Zásobník: Push a Pop Pop: hodnoty prvků se v poli nevymažou, ale jsou pro nás neplatné, zobrazeny jako prázdný prvek Index pole Stav zásobníku po jednotlivých operacích 3 2 8 1 4 5 -1 Zelená: vrchol zásobníku Oranžová: odebíraný prvek ze zásobníku Jan Lánský Úvod do programování 11. hodina
9
Zásobník: implementace III.
Vrátíme prvek na pozici vrcholu Vrchol je před začátkem pole = prázdný zásobník Výpis na obrazovku pro ladění Vypisujeme směrem z vrcholu na dno. Na obrazovce bude dno dole Jan Lánský Úvod do programování 11. hodina
10
Úvod do programování 11. hodina
Fronta Queue [kjů] Pokud předávám frontu jako parametr funkce, která bude vkládat nebo odebírat prvky, musí se předat reference Datová struktura umožňující vkládat o odebírat prvky Implementace: pole FIFO - first in first out Prvek, který byl vložen jako první bude odebrán jako první Příklady použití Správa procesů v OS Vyrovnání rychlostí dvou datových toků (sledování videa na internetu) Prohledávání do šířky (DFS) Fronta v obchodě Jan Lánský Úvod do programování 11. hodina
11
Úvod do programování 11. hodina
Fronta: funkce Create – vytvoří prázdnou frontu Enqueue – vloží prvek na konec fronty Dequeue – odebere prvek ze začátku fronty a vrátí jeho hodnotu Front – vrátí hodnotu prvku ze začátku fronty IsEmpty – zda je fronta prázdná Jan Lánský Úvod do programování 11. hodina
12
Fronta: Implementace I.
Maximální počet prvků ve frontě Pole pro uchování prvků uložených ve frontě Index prvního prvku ve frontě Index posledního prvku ve frontě Vytvoříme pole o velikosti maximálního počtu prvků Ve frontě není žádný prvek. Konec fronty bude před začátkem pole. Začátek fronty je za koncem fronty, indikuje prázdnou frontu Jan Lánský Úvod do programování 11. hodina
13
Fronta: Implementace II.
… jako Push u zásobníku Posuneme konec fronty Na nový konec fronty přidáme prvek Z pole vyzvedneme hodnotu na začátku fronty Začátek fronty posuneme na další prvek U prázdné fronty vrátíme nesmysl. U prázdného zásobníku došlo k pádu programu Jan Lánský Úvod do programování 11. hodina
14
Fronta: Enqueue a Dequeue
Pop: hodnoty prvků se v poli nevymažou, ale jsou pro nás neplatné, zobrazeny jako prázdný prvek 4 2 3 5 8 -1 1 Zelená: konec fronty Oranžová: začátek fronty Modrá: odebíraný prvek Index pole Jan Lánský Úvod do programování 11. hodina
15
Fronta: Implementace III.
Vrátíme prvek na začátku fronty. U prázdné fronty se vrátí nesmysl Začátek fronty je za koncem fronty = prázdný zásobník Výpis na obrazovku pro ladění Vypisujeme směrem zleva (začátek fronty) do prava (konec fronty) Jan Lánský Úvod do programování 11. hodina
16
Úvod do programování 11. hodina
Fronta: problém Odebíráním prvků z fronty vzniká v poli místo, které již nevyužijeme Konec fronty dosáhne maximální délky pole, přestože fronta není plná Dvě možná řešení Poté, co konec fronty dosáhne maximální délky pole, posunout frontu, aby první prvek fronty začínal na začátku pole Cyklická fronta – po posledním prvku pole následuje první prvek pole. Je nutné pamatovat počet prvků fronty. Jan Lánský Úvod do programování 11. hodina
17
Fronta: posun Přidávání prvku: Pokud je jsme na konci pole, přesuneme prvky z konce pole na začátek a změníme indexy začátku a konce fronty 7 2 4 1 3 5 6 8 9 Zelená: konec fronty Oranžová: začátek fronty Index pole Jan Lánský Úvod do programování 11. hodina
18
Cyklická fronta 4 3 2 1 8 5 6 7 9 Nutno pamatovat počet prvků fronty.
Po prvku pole[max] následuje prvek pole[0] konec++; if (konec == max) konec = 0; 4 3 2 1 8 5 6 7 9 Zelená: konec fronty Oranžová: začátek fronty Index pole Jan Lánský Úvod do programování 11. hodina
19
Úvod do programování 11. hodina
Prioritní fronta Priorita prvku je malé celé číslo 1 až d Při odebírání prvku se vybere první z prvků s nejvyšší prioritou, která ve frontě je Implementace pro každou hodnotu priority samostatná dílčí fronta. Prioritní fronta obsahuje pole front. Je nutné definovat převod mezi indexem fronty (v poli front) a její prioritou Př.: Správa procesů v OS Jan Lánský Úvod do programování 11. hodina
20
Prioritní fronta Příklad: čísla s vyšším zbytkem po dělení 3 mají přednost před čísly s nižším zbytkem po dělení 3. Dequeue: Nemáme žádný prvek v dílčí frontě pro nejvyšší prioritu, v druhé nejvyšší prioritě je první prvek 7 2 -1 1 4 7 13 9 3 d z k 5 Index fronty Zelená: konec fronty Oranžová: začátek fronty Index pole Jan Lánský Úvod do programování 11. hodina
21
Úvod do programování 11. hodina
Backtracking I. česky: zpětné prohledávání; prohledávání s návratem Speciální případ: DFS Deep First Search (Prohledávání grafů do hloubky) Prohledání všech potenciálních řešení dokud nenalezneme správné řešení (případně všechna správná řešení) Vede k rekurzi; využití zásobníku Exponenciální časová složitost použitelné pro malé velikosti instance problému Paměťová složitost lineární k počtu zanoření rekurze Jen pokud neznáme efektivnější algoritmus Jan Lánský Úvod do programování 11. hodina
22
Úvod do programování 11. hodina
Backtracking II. Řešení problému lze rozložit na n částí x1, …, xn a zároveň každá část může nabývat pouze konečného počtu hodnot Pro všechna k od 1 do n postupně testujeme zda kandidát na řešení xk = x1, …, xk má šanci být řešením Nemůžeme-li vyloučit jeho kandidaturu na řešení, prodloužíme kandidáta o další člen xk+1 Můžeme-li vyloučit jeho kandidaturu na řešení, ukončíme kandidáta xk. Vrátíme se o krok zpět na člen xk-1 a otestujeme jiné jeho prodložení x'k Takto projdeme postupně prodloužení xk-1 o všechna možná x'k Rekurze Ořezávání cyklus Jan Lánský Úvod do programování 11. hodina
23
N-ciferná čísla Lze vymyslet jinou množinu cifer (0 až 9) Lze přidat další omezující podmínky na hledané řešení Do zadaného souboru vypište všechna N-ciferná čísla, která obsahují pouze takové číslice, které jsou prvočísly. Číslice M = { 2, 3, 5, 7}, |M| = 4 Počet řešení |M|N Př.: 2-ciferná čísla: 22, 23, 25, 27, 32, 33, 35, 37, 52, 53, 55, 57, 72, 73, 75, 77 Počet řešení 42 = 16 N-ciferná čísla jsou příkladem variace s opakováním Jan Lánský Úvod do programování 11. hodina
24
N-ciferná čísla: cykly
Pro konkrétní počet cifer musí být N zanořených cyklů. 4-ciferná čísla Není použitelné obecně Jan Lánský Úvod do programování 11. hodina
25
N-ciferná čísla: trik Cyklem projdeme celá čísla 10^(N-1) až 10^N
Omezeno rozsahem celočíselného datového typu Každé číslo rozložíme na cifry a pro každou cifru otestujeme, zda je v hledané množině. Projdeme 9*10^(N-1) čísel místo optimálních 4^N čísel Pro N = 6 projdeme vs 4096 čísel Jan Lánský Úvod do programování 11. hodina
26
N-ciferná čísla: backtracking I.
Omezíme se na tyto cifry. Mohou tu být libovolné prvky, písmena, slova Zásobník pro uložení kandidáta na řešení Zavoláme rekurzivní funkci, které předáme otevřený soubor, zásobník, vypisované cifry a délku čísel 4-ciferná čísla Jan Lánský Úvod do programování 11. hodina
27
N-ciferná čísla: backtracking II.
Obvykle zde budou další omezující podmínky, vylučující kandidáty na řešení Jsme na konci rekurze, známe všechny cifry Kandidát na řešení je řešením. Vypíšeme jednotlivé cifry uložené v zásobníku směrem ze dna na vrchol (big endian) Projdeme jednotlivé povolené cifry Prodloužíme kandidáta na řešení Rekurzivní volání, chceme znát n-1 cifer Zkrátíme kandidáta na řešení, v další iteraci cyklu bude prodloužen o jinou cifru Jan Lánský Úvod do programování 11. hodina
28
N-ciferná čísla: rekurze
N = 3, prvky = { 2, 5} Zásobník: červená Pop, zelená Push Posloupnost volání funkcí: CislaRek(…, 1) Start 2 5 CislaRek(…, 2) pokračuje CislaRek(…, 1) Konec CislaRek(…, 0) Výpis 225 CislaRek(…, 1) Pokračuje CislaRek(…, 0) Výpis 222 CislaRek(…, 2) Start CislaRek(…, 3) Start Jan Lánský Úvod do programování 11. hodina
29
Úvod do programování 11. hodina
Doplnění znamének Mezi zadaná čísla doplňte znaménka + a - tak, aby výsledný aritmetický výraz měl zadanou hodnotu. Najděte všechna řešení Vstup: pole čísel Výstup: aritmetické výrazy, jejichž hodnota se rovná zadané hodnotě, vypište do souboru Bude nutné vyzkoušet všech 2n možnosti, není možné vyloučit žádného kandidáta dokud nejsou doplněna všechna znaménka Jan Lánský Úvod do programování 11. hodina
30
Doplnění znamének: backtrackig I.
Volání rekurzivní funkce s požadovanou hodnotou aritmetického výrazu a dalším prvkem pole ke zpracování 19 řešení: . . . Hledáme znaménka, aby aritmetický výraz měl hodnotu 2 Jan Lánský Úvod do programování 11. hodina
31
Doplnění znamének: backtrackig I.
Řešení: po projití pole má sum hodnotu 0 Jsme za koncem pole čísel, rekurze končí Aritmetický výraz má požadovanou hodnotu, vypíšeme ho Nejprve zkusíme plus: požadovanou hodnotu výrazu zmenšíme o přičítané číslo. Rekurze. Druhé zkusíme minus Nezapomenout na Pop při návratu z rekurze Jan Lánský Úvod do programování 11. hodina
32
Úvod do programování 11. hodina
Zpětná vazba Objevili jste ve slajdech chyby? Včetně pravopisných Nechápete nějaký slajd? Je příliš obtížný, nesrozumitelný? Máte nějaký nápad na vylepšení? Anonymní formulář Odeslání za pár vteřin Jan Lánský Úvod do programování 11. hodina
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.