Úvod do programování 11. hodina

Slides:



Advertisements
Podobné prezentace
Grafové algoritmy.
Advertisements

CIT Paměti Díl X.
Modulární systém dalšího vzdělávání pedagogických pracovníků JmK v přírodních vědách a informatice CZ.1.07/1.3.10/ Průchod grafu do šířky.
Stavový prostor. • Existují úlohy, pro které není k dispozici univerzální algoritmus řešení • různé hry • problém batohu, problém obchodního cestujícího.
Tabulky v MS ACCESS Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Mgr. Jiří Novák.
Programovací jazyk C++
1 – Informatika Nauka (tj. věda) o informacích, tj. o zápisu (kódování (angl.)), přenosu (transfer (angl.)), zpracování (procesování (angl.)) informací.
Přednáška 11 Jiří Šebesta
Cvičení Úloha 1: Rozhodněte zda posloupnost znaků v poli délky n tvoří palindrom (slovo, které je stejné při čtení zprava i zleva). Př.: [a,l,e,l,a] [a,n,n,a]
10. Dynamické datové struktury
Zásobník (LiFo) Fronta (FiFo)
Semestrální práce KIV/PT Martin Kales Hana Hůlová.
Aplikace teorie grafů Základní pojmy teorie grafů
Operační systémy. OPERAČNÍ SYSTÉMY pomoc operátorovi, podpora vlastností reálného času, víceuživatelských a více úlohových systémů.
ALGO – Algoritmizace 1. cvičení
Algoritmy I Cvičení č. 5.
Alg51 Rozklad problému na podproblémy Postupný návrh programu rozkladem problému na podproblémy –zadaný problém rozložíme na podproblémy –pro řešení podproblémů.
Přednáška 12 Diferenciální rovnice
Algoritmy I Cvičení č. 4.
Algoritmy I Cvičení č. 3.
ADT Strom.
PHP – zasílání dat z formuláře
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
TI 7.1 NEJKRATŠÍ CESTY Nejkratší cesty - kap. 6. TI 7.2 Nejkratší cesty z jednoho uzlu Seznámíme se s následujícími pojmy: w-vzdálenost (vzdálenost na.
Algoritmy a programovací techniky
Algoritmy vyhledávání a řazení
Algoritmizace a programování Třídící algoritmy - 12
Další abstraktní datové typy
Ukázka odstranění rekurze Přemysl Tišer
JavaScript Podmínky, cykly a pole.
Datové typy a struktury
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Tento výukový materiál vznikl v rámci Operačního programu Vzdělávání pro konkurenceschopnost 1. KŠPA Kladno, s. r. o., Holandská 2531, Kladno,
Sorty Bubble, Insert a Quick
Dokumentace informačního systému
MATICE ODPOVĚDNOSTI Matice odpovědnosti představuje jasné a konkrétní vymezení kompetencí osob z týmu za konkrétní projektové činnosti (úkoly), např. koordinaci.
Rozklad problému na podproblémy, rekurze
ALGO – Algoritmizace 4. cvičení 1.ročník, ZS Ing. Zdena DOBEŠOVÁ, Ph.D.
Rozpoznávání v řetězcích
Práce s řetězci Řetězec je libovolný text nebo libovolná skupina znaků. Řetězec se také označuje jako string. Činnosti prováděné s řetězci: Počítání znaků.
Sylabus V rámci PNV budeme řešit konkrétní úlohy a to z následujících oblastí: Nelineární úlohy Řešení nelineárních rovnic Numerická integrace Lineární.
Vyhledávání vzorů (template matching)
Datové typy IB111: Datové typy. Data a algoritmizace jaká data potřebuji pro vyřešení problému? jak budu data reprezentovat? jaké operaci s nimi potřebuji.
Programování 3. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015.
Programování 4. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015.
Hledání silně souvislý komponent Silně souvislá komponenta orientovaného grafu G= (V,E) je maximální množina uzlů UV taková že ∀ u,v ∈ V : u je dosažitelné.
Úvod do programování 10. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015.
Algoritmizace a programování Algoritmy 2 – Vývojové diagramy (sekvence)
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
Úvod do programování 12. hodina
Úvod do programování 4. hodina
MATEMATIKA – ARITMETIKA 6
ZAL – 6. cvičení 2016.
Název projektu: Moderní výuka s využitím ICT
Úvod do programování 6. hodina
Algoritmizace a programování
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Úvod do programování 11. hodina
VY_32_INOVACE_pszczolka_ Registry - test
Výukový materiál zpracován v rámci projektu
Abstraktní datové typy
Dynamické proměnné (1) Proměnné, jejichž počet a (nebo) velikost pa-měti využívané těmito proměnnými se v prů-běhu programu mění Dynamické proměnné lze.
Podprogramy.
ALG 07 Selection sort (Select sort) Insertion sort (Insert sort)
Fronta (1) Dynamická datová struktura typu FIFO (First In First Out)
Algoritmizace a datové struktury (14ASD)
ZAL – 7. cvičení 2016.
Definiční obory. Množiny řešení. Intervaly.
Algoritmizace a datové struktury (14ASD)
Algoritmizace a datové struktury (14ASD)
Transkript prezentace:

Ú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

Ú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

Ú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

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

Ú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

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

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

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

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

Ú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

Ú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

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

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

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

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

Ú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

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

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

Ú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

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

Ú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

Ú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

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

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

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 900000 vs 4096 čísel Jan Lánský Úvod do programování 11. hodina

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

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

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

Ú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

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í: +7+5+6-11-4+2+5-9+1 +7+5-6+11-4+2-5-9+1 +7+5-6-11+4-2-5+9+1 . . . Hledáme znaménka, aby aritmetický výraz měl hodnotu 2 Jan Lánský Úvod do programování 11. hodina

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

Ú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 http://goo.gl/forms/WxkZqBsZLs Jan Lánský Úvod do programování 11. hodina