Binární soubory (datové, typované)

Podobné dokumenty
Prohledávání do šířky = algoritmus vlny

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Typové a netypové soubory

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Časová a prostorová složitost algoritmů

Dynamické programování

Anotace. Soubory a práce s nimi, rekurze podruhé, struktury (datový typ record), Martin Pergel,

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

NPRG030 Programování I, 2015/16 1 / :25:32

Anotace. Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj

Implementace LL(1) překladů

Digitální učební materiál

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

NPRG030 Programování I, 2018/19 1 / :03:07

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

Programovací jazyk Pascal

Dynamické programování

Algoritmy I, složitost

(Úlohy z MO kategorie P, 32. část)

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

Digitální učební materiál

O datových typech a jejich kontrole

INFORMATIKA. Vybrané podposloupnosti

Anotace. Dijkstrův algoritmus,

Návrh Designu: Radek Mařík

Rozklad problému na podproblémy

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

2 Strukturované datové typy Pole Záznam Množina... 4

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Úvod do programování

Maturitní otázky z předmětu PROGRAMOVÁNÍ

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

Dynamické programování

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Stromy, haldy, prioritní fronty

Metody návrhu algoritmů, příklady. IB111 Programování a algoritmizace

5. Dynamické programování

NPRG030 Programování I, 2016/17 1 / :58:13

10. Složitost a výkon

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Dynamické datové struktury III.

Rekurzivní algoritmy

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

NPRG030 Programování I, 2010/11

NPRG030 Programování I RNDr.Tomáš Holan, Ph.D. 4.patro, č

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

2. úkol MI-PAA. Jan Jůna (junajan)

Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A

Dynamické programování

Úvod do programování 10. hodina

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

dovolují dělení velkých úloh na menší = dekompozice

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Základy algoritmizace a programování

Úvod do informatiky. Miroslav Kolařík

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Příklad 1/23. Pro rostoucí spojité fukce f(x), g(x) platí f(x) Ω(g(x)). Z toho plyne, že: a) f(x) Ο(g(x)) b) f(x) Θ(g(x)) d) g(x) Ω(f(x))

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

CVIČNÝ TEST 48. OBSAH I. Cvičný test 2. Mgr. Tomáš Kotler. II. Autorské řešení 6 III. Klíč 15 IV. Záznamový list 17

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

NPRG030 Programování I, 2017/18 1 / :22:16

Algoritmizace a programování

Prioritní fronta, halda

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.

Předmět: Algoritmizace praktické aplikace

Dynamické programování UIN009 Efektivní algoritmy 1

PODPROGRAMY PROCEDURY A FUNKCE

Anotace. Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, nejdelší rostoucí podposloupnost.

5 Rekurze a zásobník. Rekurzivní volání metody

ALGORITMIZACE A PROGRAMOVÁNÍ

Třídění čísel v poli = vnitřní třídění (řazení)

12. Globální metody MI-PAA

ALGORITMY A DATOVÉ STRUKTURY

NMIN102 Programování /2 Z, Zk

Závěrečná zkouška z informatiky 2011

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

Soubory. Hung Hoang Dieu. Department of Mathematics Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague 1 / 7

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

Sada 1 - Základy programování

Texty k Programování na VŠFS. Petr Kučera () Texty k Programování na VŠFS 29. května / 117

63. ročník Matematické olympiády 2013/2014

Transkript:

Binární soubory (datové, typované) - na rozdíl od textových souborů data uložena binárně (ve vnitřním tvaru jako v proměnných programu) není čitelné pro člověka - všechny záznamy téhož typu (může být i strukturovaný) - vedle sekvenčního přístupu je možný i přímý přístup (přístup ke konkrétnímu záznamu podle pořadového čísla jako indexování ) - možnost provádět změny v souboru (operace update ) - není řádková struktura (neexistuje readln, writeln, eoln, ) Pavel Töpfer, 2019 Programování 2-7 1

1. deklarace var F: file of T; T je libovolný typ = typ ukládaných položek T může být strukturovaný, často typ záznam 2. přiřazení assign(f, S); stejné jako u textových souborů 3. otevření reset(f); soubor musí existovat, hlava na 1. záznam rewrite(f); vytváření nového souboru (starý je smazán) v obou případech je soubor otevřen pro čtení i pro zápis Pavel Töpfer, 2019 Programování 2-7 2

4. operace vstupu a výstupu read(f, X); write(f, X); X je proměnná odpovídajícího typu T procedury read, write mají vždy právě dva parametry po provedení se posune čtecí hlava (default sekvenční přístup) funkce typu boolean eof(f) konec souboru? přímý přístup: seek(f, n) nastavení hlavy na záznam číslo n (záznamy se číslují od 0) FilePos(F) aktuální číslo záznamu (kde je čtecí hlava) FileSize(F) počet záznamů v souboru 5. zavření close(t); stejné jako u textových souborů Pavel Töpfer, 2019 Programování 2-7 3

Příklady využití přímého přístupu: Změna záznamu číslo N v souboru F: seek(f, N); read(f, X); úprava hodnoty proměnné X seek(f, N); - nutno vrátit čtecí hlavu na původní místo!!! write(f, X); Přidání nového záznamu X na konec souboru: seek(f, FileSize(F)); write(f, X); - záznamy se číslují od 0, takže FileSize(F) je číslo prvního volného místa za posledním platným záznamem v souboru F - je to zároveň nejvyšší povolená hodnota druhého parametru procedury seek Pavel Töpfer, 2019 Programování 2-7 4

Dynamické programování Programovací technika pro řešení takových optimalizačních úloh, u nichž platí, že úloha se dá rozložit na menší podúlohy, z jejichž optimálních řešení se skládá optimální řešení celé původní úlohy. Slouží k tvorbě časově efektivních algoritmů, zpravidla za cenu jistého zvýšení paměťových nároků - čas i paměť polynomiální (nahradí backtracking s exponenciální časovou složitostí). Princip: Rozklad úlohy na menší podúlohy stejného charakteru, z jejichž řešení se sestaví řešení původní úlohy podobné jako u techniky Rozděl a panuj. Na rozdíl od techniky Rozděl a panuj nemusejí být podúlohy navzájem nezávislé širší možnosti použití. Pavel Töpfer, 2019 Programování 2-7 5

Postup řešení dvě možnosti: 1. shora dolů rekurzivní rozklad problému shora, do pomocného pole si přitom průběžně ukládáme všechny již jednou spočítané hodnoty, aby se nepočítaly opakovaně znovu, až budou opět potřeba chytrá rekurze, memoizace 2. zdola nahoru postupujeme naopak iteračně zdola od elementárních úloh ke složitějším, výsledky řešení všech podúloh si ukládáme (zpravidla do pole) pro další použití při řešení složitějších podúloh Příklad: Fibonacciho čísla (bylo v ZS) Pavel Töpfer, 2019 Programování 2-7 6

Paměťové nároky: Oproti primitivnímu rekurzivnímu řešení potřebujeme paměť navíc pro uložení výsledků všech dílčích podúloh při iteračním postupu zdola dokonce často i těch, které nakonec nebudeme vůbec potřebovat (ale předem nevíme, které dílčí výsledky později potřebovat budeme a které ne, takže si počítáme a ukládáme systematicky všechny). Tyto dodatečné paměťové nároky mohou být velikosti O(N), velmi často bývají O(N 2 ) tedy dvourozměrné pole. V každém případě jsou polynomiální. Pavel Töpfer, 2019 Programování 2-7 7

Časová efektivita: Díky ukládání výsledků všech menších podúloh máme zajištěno, že se žádná podúloha nebude počítat opakovaně vícekrát může se jen vícekrát použít její výsledek uložený již jednou v poli. Proto nemusejí být podúlohy na sobě navzájem nezávislé a přesto je zaručena polynomiální časová složitost výpočtu. Počet provedených operací = počet řešených podúloh (počet prvků pole určeného pro uložení všech dílčích výsledků) x náročnost řešení každé jednotlivé podúlohy (s využitím toho, že už známe výsledky podúloh menších). Příklad: N 2 x N = N 3 časová složitost O(N 3 ) Pavel Töpfer, 2019 Programování 2-7 8

Příklady Fibonacciho čísla (již známe) Určení N-tého Fibonacciho čísla rekurzivní funkcí chybně použitý princip metody Rozděl a panuj, vznikající podúlohy byly závislé exponenciální časová složitost X Určení N-tého Fibonacciho čísla rekurzivní funkcí doplněnou polem pro ukládání již spočítaných hodnot, takže každá hodnota se počítá jen jednou lineární časová složitost Určení N-tého Fibonacciho čísla postupným počítáním zdola v cyklu nic se nepočítá opakovaně vícekrát lineární časové složitost Pavel Töpfer, 2019 Programování 2-7 9

Trojúhelník z čísel N řádků, obsahují 1, 2, 3,, N čísel zadán na vstupu Příklad pro N=5: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Úkol: nalézt cestu z vrcholu na základnu s maximálním součtem čísel, smí se jít vždy jen šikmo směrem dolů. Řešení: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Pavel Töpfer, 2019 Programování 2-7 10

Postup řešení 1. Neefektivní: - uložit všechna čísla do pole paměť O(N 2 ) - backtrackingem postupně zkoušet všechny cesty čas O(2 N ) Pavel Töpfer, 2019 Programování 2-7 11

2. Dynamické programování: - načíst a uložit vždy jen jeden řádek čísel, spočítat a uložit maximální součet čísel na cestě vedoucí do každého z nich paměť O(N) [ některé z těchto údajů se ve výsledku neuplatní, ale ještě nevíme které, tak počítáme a ukládáme všechny! ] - další řádek spočítat vždy z předchozího, každé číslo má jen dva možné předchůdce a součty maximálních cest do nich vedoucích máme uloženy - výsledkem je maximální spočítaná hodnota v posledním řádku - počítáme tedy řádově N 2 čísel, každé určíme v konstantním čase časová složitost O(N 2 ) Pavel Töpfer, 2019 Programování 2-7 12

3. Nalezení cesty: - předchozí řešení určilo pouze hodnotu cesty s maximálním součtem čísel, neznáme zatím ale cestu samotnou - pokud chceme určit i průběh cesty, musíme si do pole ukládat všechna čísla a s každým také informaci, zda jsme do něj přišli z předchozího řádku zleva nebo zprava paměť O(N 2 ) [ opět platí: některé z těchto údajů se ve výsledku neuplatní, ale ještě nevíme které, tak počítáme a ukládáme všechny! ] - průběh cesty poté snadno zrekonstruujeme zpětným chodem zdola nahoru (jdeme po předchůdcích, podobně jako při určování nejkratší cesty při procházení do šířky) - časová složitost zůstává O(N 2 ) Pavel Töpfer, 2019 Programování 2-7 13

4. Jiný postup dynamickým programováním zdola: - čteme řádky čísel postupně zdola, pro každé z čísel můžeme spočítat a uložit maximální součet čísel na cestě vedoucí z tohoto čísla až dolů [ některé z těchto údajů se opět ve výsledku neuplatní, ale ještě nevíme které, tak počítáme a ukládáme všechny! ] - řádek spočítáme vždy z řádku následujícího pod ním, každé číslo má jen dva možné následníky a součty maximálních cest z nich vedoucích máme uloženy - výsledkem je spočítaná hodnota v prvním řádku - počítáme tedy řádově N 2 čísel, každé určíme v konstantním čase opět časová složitost O(N 2 ) - lze opět doplnit nalezení cesty Pavel Töpfer, 2019 Programování 2-7 14

Arpád (počet různých cest minimální délky) T[i, j] počet cest z [1, 1] do [i, j] hledáme T[N, M] platí vztah T[i, j] = T[i-1, j] + T[i, j-1] (ještě ošetřit okraje a rozkopané křižovatky!) 1. primitivní řešení rekurzí voláme rekurzivní funkci R(N, M), která implementuje uvedený vztah opakované výpočty, exponenciální časová složitost 2. dynamické programování shora dolů voláme rekurzivní funkci R(N, M), která implementuje uvedený vztah a využívá dvojrozměrné pole T velikosti N x M známých hodnot nejsou opakované výpočty, časová složitost v nejhorším případě O(NM) Pavel Töpfer, 2019 Programování 2-7 15

3. dynamické programování zdola nahoru po řádcích vyplňujeme dvojrozměrné pole T velikosti N x M známých hodnot podle uvedeného vztahu nejsou opakované výpočty, časová složitost v každém případě O(NM) Nevýhoda postupu shora dolů: opakovaná volání rekurzivní funkce Výhoda postupu shora dolů: nepočítáme nepotřebné hodnoty, takže výpočet může být rychlejší, v tomto případě až O(N+M) Pavel Töpfer, 2019 Programování 2-7 16

Délka nejdelší rostoucí vybrané podposloupnosti 1. hladově lineární průchod s postupným prodlužováním špatně! 2. primitivní řešení rekurzí zkouší všechny vybrané podposloupnosti exponenciální složitost 3. dynamické programování (zdola) - pole T[i] délka maximální rostoucí podposloupnosti vybrané z počátečního úseku A[1], A[2],, A[i] délky i a zakončené prvkem A[i] - postupně počítáme T[1], T[2],, T[N] - hledaným výsledkem je maximum z hodnot v poli T - každý prvek T[i] určíme v čase O(N) na základě už známých hodnot uložených v poli T celková časová složitost O(N 2 ) Pavel Töpfer, 2019 Programování 2-7 17

program VybranaRostouci; const MaxN = 1000; var A: array[1..maxn] of integer; {zadaná posloupnost} T: array[1..maxn] of integer; {počítané hodnoty} N: integer; {počet čísel v posloupnosti} Max: integer; {výsledek} i, j: integer; begin read(n); for i := 1 to N do read(a[i]); T[1] := 1; Max := 1; for i := 2 to N do begin T[i] := 1; for j := 1 to i-1 do if (A[j] < A[i]) and (T[j] + 1 > T[i]) then T[i] := T[j] + 1; if T[i] > Max then Max := T[i] end; write(max) end. Pavel Töpfer, 2019 Programování 2-7 18

Určení prvků nejdelší rostoucí vybrané podposloupnosti var P: array[1..maxn] of integer; {předchůdci} k: integer; {index maximální hodnoty v poli T} begin read(n); for i := 1 to N do read(a[i]); T[1] := 1; P[1] := 0; Max := 1; k := 1; for i := 2 to N do begin T[i] := 1; P[i] := 0; for j := 1 to i-1 do if (A[j] < A[i]) and (T[j] + 1 > T[i]) then begin T[i] := T[j] + 1; P[i] := j end; if T[i] > Max then begin Max := T[i]; k := i end; end; Pavel Töpfer, 2019 Programování 2-7 19

writeln(max); {délka max. rostoucí vybrané podposloupnosti} write(k, ' '); while P[k] <> 0 do begin k := P[k]; write(k, ' ') end; {vypsal ODZADU indexy všech prvků vybrané podosloupnosti} writeln end. Pavel Töpfer, 2019 Programování 2-7 20

4. poznámka: jde to i lépe s časovou složitostí O(N.log N) idea: - definujeme hodnoty M[j] = minimální dosud známá hodnota posledního prvku vybrané rostoucí posloupnosti délky j - přepočítáváme je postupně pro A[1], A[2],, A[N] (rozmyslete sami nebo viz cvičení) Pavel Töpfer, 2019 Programování 2-7 21

Délka nejdelší společné vybrané podposloupnosti jsou dány posloupnosti A[1..N], B[1..M] T[i, j] délka nejdelší společné podposlouposti vybrané z počátečních úseků A[1], A[2],, A[i], resp. B[1], B[2],, B[j], hledáme T[N, M] platí: když i=0 nebo j=0, pak T[i, j] = 0 jinak když A[i]=B[j], pak T[i, j] = T[i-1, j-1] + 1 jinak T[i, j] = max(t[i, j-1], T[i-1, j]) dynamické programování (zdola): tabulku T vyplňujeme po řádcích, každou hodnotu T[i, j] spočítáme v konstantním čase celková časová složitost O(NM) poznámka: v případě postupu shora dolů může být časová složitost algoritmu O(N) pokud jsou obě posloupnosti shodné Pavel Töpfer, 2019 Programování 2-7 22