Anotace. Dijkstrův algoritmus,

Podobné dokumenty
Odstranění rekurze Binární soubory Programování her. Anotace. Středník II!! Odstranění rekurze, binární soubory, programování her.

Anotace. Jednotky (tvorba a využití), struktury (typ record),

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

Další možnosti inicializace proměnných

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

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

Časová a prostorová složitost algoritmů

Anotace. pointery (pars prima). Martin Pergel,

Úvod do programování

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

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

Algoritmus pro hledání nejkratší cesty orientovaným grafem

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

Implementace LL(1) překladů

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

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

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

Anotace. Dynamické programování, diskrétní simulace.

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

O datových typech a jejich kontrole

TGH05 - aplikace DFS, průchod do šířky

Úvod do informatiky. Miroslav Kolařík

Anotace. Pointery, dynamické proměnné

Grafové algoritmy. Programovací techniky

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

Grafové algoritmy. Programovací techniky

Úvod do teorie grafů

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

TGH05 - aplikace DFS, průchod do šířky

Je n O(n 2 )? Je n 2 O(n)? Je 3n 5 +2n Θ(n 5 )? Je n 1000 O(2 n )? Je 2 n O(n 2000 )? Cvičení s kartami aneb jak rychle roste exponenciála.

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

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

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

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

bfs, dfs, fronta, zásobník, prioritní fronta, halda

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

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

Rekurzivní algoritmy

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

Vzdálenost uzlů v neorientovaném grafu

Algoritmizace prostorových úloh

Definice funkcí a procedur. Mnoho operací provozujeme opakovaně, proto je hloupé programovat je při každém použití znovu.

Digitální učební materiál

Anotace. Pointery. Martin Pergel,

PROGRAMOVÁNÍ. Cílem předmětu Programování je seznámit posluchače se způsoby, jak algoritmizovat základní programátorské techniky.

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

Algoritmy na ohodnoceném grafu

IB111 Úvod do programování skrze Python

Hranová konzistence. Arc consistency AC. Nejprve se zabýváme binárními CSP. podmínka odpovídá hraně v grafu podmínek

TGH06 - Hledání nejkratší cesty

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

TGH06 - Hledání nejkratší cesty

Dijkstrův algoritmus

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

Stromy. Jan Hnilica Počítačové modelování 14

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Stromy, haldy, prioritní fronty

opakování reprezentace grafů, dijkstra, bellman-ford, johnson

Základní datové struktury III: Stromy, haldy

Základy algoritmizace a programování

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Anotace. Objekt self, Zapouzdření, polymorfismus,

Anotace. Ordinalni typy - typ char, funkce ord, chr, succ, prev, inc, dec,

Rekurze a rychlé třídění

Digitální učební materiál

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

Prioritní fronta, halda

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

10. Složitost a výkon

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

TGH09 - Barvení grafů

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Binární vyhledávací stromy pokročilé partie

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

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

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

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

Uplatnění metod na zvolený jazyk

Programovací jazyk Pascal

Předmět: Algoritmizace praktické aplikace

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

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

Náznak ukázky syntaxe a sémantiky pro projekt. 1 Syntaktické prvky. Poslední aktualizace: 8.

3. Prohledávání grafů

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

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

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

Principy indukce a rekursivní algoritmy

Dynamické datové typy a struktury

IB111 Úvod do programování skrze Python

Sada 1 - Základy programování

Poslední nenulová číslice faktoriálu

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

Lineární spojový seznam (úvod do dynamických datových struktur)

Paralelní grafové algoritmy

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

Anotace. zpět k rekurzi: teorie her. Martin Pergel,

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

Algoritmy a datové struktury

Dynamické programování

Transkript:

Anotace Dijkstrův algoritmus, medián lineárně, odstranění rekurze, binární soubory, předání funkce v parametru.

Středník 3. května od 15:00 do 18:00.

Dijkstrův algoritmus Hledá nejkratší cestu z daného vrcholu (do všech ostatních) Vstup: Graf s nezáporně ohodnocenými hranami. Udržujeme frontu vrcholů setříděnou podle dosud nejkratší cesty do nich. Na začátku zinicializujeme vzdálenosti do všech vrcholů kromě startovního nekonečnem (tedy dost vysokou hodnotou) a vzdálenost do startu nulou. Startovní vrchol přidáme do fronty dosažitelných vrcholů. Vrchol, do kterého se dostaneme nejkratší cestou z fronty odstraníme a pokusíme se cestu jdoucí z něj rozšířit do jeho sousedů. Toto opakuj, dokud je fronta neprázdná.

Rozšíření cesty Rozšíření cesty vypadá tak, že pro vrchol v ve vzdálenosti d(v) zkusíme pro každou hranu {v,w}, zda d(w) > d(v)+delka({v,w}). Pokud ano, d(w) := d(v)+delka({v,w}) a oprav pozici vrcholu w ve frontě.

Analýza Algoritmus je popsán a dokázán v mnoha knihách (a skriptech), kupř. Kapitoly z diskrétní matematiky nebo Algebraické algoritmy (Kučera, Nešetřil)... Konečnost: V každé iteraci odstraníme z fronty jeden vrchol, který se v ní už neobjeví (protože mezi vrcholy ve frontě měl nejmenší vzdálenost od startu a vzdálenosti jsou nezáporné). Parciální správnosti pomůže invariant: V každém kroku evidujeme nejkratší cesty ze startu používající pouze vrcholy již odstraněné z fronty. Z invariantu plyne korektnost. Jde jen o modifikovaný algoritmus vlny, tedy hledání do šířky! Složitost významně závisí na reprezentaci grafu a na reprezentaci fronty!

Poznámky Pokud jde o graf neohodnocený (délka všech hran je 1), potom se z Dijkstrova algoritmu stane obyčejný algoritmus vlny. Aplikace grafových algoritmů: Zde začíná teoretická informatika. :-) Příklady využití grafových algoritmů: Thesseus a Minotaurus, Král (či jiné figurky) na šachovnicích různých tvarů s různě pozakazovanými poĺıčky,...

Medián v lineárním čase Kdysi byl algoritmus Quicksort. Problémem bylo, jak volit pivot. Voĺıme-li špatně, děláme mnoho iterací rekurze. Hledáme-li pivot dlouho, nepříjemně to trvá. Jak hledat medián v lineárním čase? Ve skutečnosti nebudeme hledat medián, ale k-tý nejmenší prvek.

Medián v lineárním čase Rozděl vstup na pětice, v každé pětici najdi medián, najdi medián mediánů (tedy medián mezi mediány pětic), rozděl vstup na menší a větší, zjisti, zda se k-tý nejmenší nachází mezi většími nebo menšími pokračuj s hledáním příslušné hromádce.

Medián lineárně detaily Jak najít mediány pětic? Hrubou silou (v konstantním čase, opakujeme lineárně-krát). Jak najít medián mediánů? Rekurzívně (zavolej se na pole mediánů pětic). Jak pokračovat na příslušné hromádce? Rekurzívně (zavolej se bud to na menší hromádku a hledej k-tý nejmenší, nebo máme-li hledat v hromádce větších hodnot budiž l počet prvků na menší hromádce a hledej v hromádce větších k l-tý nejmenší.

Proč je algoritmus lineární? Protože: mediánů pětic je přibližně pětina délky vstupu, hromádka menších čísel stejně jako hromádka větších čísel bude mít velikost aspoň 3/10, tudíž každá z hromádek bude mít též velikost nejvýš 7/10. Zbytek je jen indukce.

Indukce: Složitost algoritmu vede k rekurenci: T(n) = T ( n 5) +T ( ) 7 10 n +kn. Ukážeme, že existuje l takové, že T(n) ln: a tedy stačí volit l 10k. T(n) ln 5 + 7ln 10 +kn = kn+ 9 10 ln

Odstranění rekurze obecně Rekurze je pěkná věc, ale podle teorie lze každý program napsat v podobě jednoho jediného cyklu (while) bez volání dalších funkcí. Sice takový program není k přečtení, ale jedná se o zajímavý teoretický závěr. Jak to udělat? Uděláme totéž, co za nás udělá překladač, když spustíme rekurzi, tedy...

Odstranění rekurze Vyrobíme nové lokální proměnné, skočíme na správné místo programu a zapamatujeme si, kam se máme vrátit. Ve skutečnosti si jen (na zásobník) uložíme údaje o dosavadních datech, nahradíme daty zarekurzenými a údaj odkud jsme se zavolali a skočíme na začátek funkce. Při odrekurzení poznamenáme návratové údaje, vytáhneme ze zásobníku původní obsahy lokálních proměnných a údaj odkud jsme se zavolali (a skočíme tam).

Quicksort s logaritmickou pamětí Quicksort může vytvořit velkou a malou část. Pak potřebujeme lineárně paměti při klasickém rekurzívním řešení. Při třídění druhé části nepotřebujeme návratové údaje. Proto napřed setřídíme část, která je menší (co do množství dat). A problém můžeme řešit hybridně, tedy na první část se rekurzívně zavolat (i když i v tomto případě umíme rekurzi odbourat, neumíme odbourat její pamět ové nároky). Tím, že rekurzi (nebo její náhražku) spustíme jen na menší část, pracujeme v i-té úrovni rekurze nejvýše s n 2 i hodnotami.

Quicksort s omezenou rekurzí Hybridní implementace v pseudokódu procedure quicksort(levy,pravy); begin while (levy<>pravy) do begin index pivota:=rozdel; if(index pivota>(pravy-levy)/2) then begin quicksort(index pivota+1,pravy); pravy:=levy+index pivota end else begin quicksort(levy,index pivota); levy:=levy+index pivota+1; end; end; end;

Textové a binární soubory Zhodnocení situace V zimě jsme se učili pracovat s textovými soubory. Proměnnou typu text jsme napojili na soubor, otevřeli jsme, četli, zapisovali a zavřeli. Široká použitelnost, občas ale chceme naprogramovat například databázi (knih v knihovně). K tomu by se hodil soubor úplně jiných vlastností, ve kterém půjde lépe vyhledávat. K tomu přesně lze použít binární soubory. Jedná se o soubor sestávající z prvků popsané struktury, které můžeme číst resp. zapisovat. Jelikož známe velikost dotyčné struktury, můžeme i vyhledávat.

Technické prostředky Většinou se shodují s textovými soubory, nicméně: Uděláme proměnnou typu file of nacitany typ. Například: var f:file of nesmysl; Funkce assign, reset, rewrite, read, write a close fungují úplně stejně (tedy jako první argument jim předáme příslušnou proměnnou typu file. Pozor na append! Hlavní rozdíl: filesize zjistí počet záznamů v souboru, seek nastaví ukazatel na příslušné místo.

Příklad telefonní seznam type zaznam=record jmeno:string[100]; cislo:string[20]; end; var f:file of zaznam;

Příklad přidání do binárního souboru procedure pridej; var zazn:zaznam; begin readln(zazn.jmeno); readln(zazn.cislo); assign(f, databaze.bin ); {$I-} reset(f); {$I+} if IOResult<>0 then rewrite(f); seek(f,filesize(f)); write(f,zazn); close(f); end;

Výpis souboru procedure vypis; var i:integer; zazn:zaznam; begin assign(f, databaze.bin ); reset(f); for i:=1 to filesize(f) do begin read(f,zazn); writeln( Jmeno:,zazn.jmeno,, cislo:,zazn.cislo); end; close(f); end;

Mazází v binárním souboru Funkce truncate Zbytek binárního souboru můžeme smazat pomocí funkce truncate. Jako parametr jí předáme proměnnou typu file (napojenou na nějaký soubor). Příklad: reset(f); truncate(f); smaže dosavadní obsah souboru podobně jako by udělalo rewrite(f), ovšem pro neexistující soubor by to nový nezaložilo! Jak zrušit jeden záznam? Přepsat ho posledním a poslední zrušit.

Předání funkce parametrem Různé datové typy porovnáváme různě (string, integer). Chceme-li univerzální funkci, která bude třídit cokoliv se jí dostane do ruky, potřebujeme předat porovnávající funkci. Syntakticky postupujeme tak, že vytvoříme datový typ tuto funkci nesoucí. Do proměnné příslušného typu můžeme odpovídající funkci přiřadit a pak můžeme tuto funkci zavolat. Syntax: type jmeno typu=function (argumenty:typy):navratovy typ; var funkcni promenna:jmeno typu; function porovnej(argumenty:typy);... funkcni promenna=porovnej; funkcni promenna(parametry);

Příklad type porovfce=function (a,b:integer):boolean; var p:porovfce; function cmp(a,b:integer):boolean; begin cmp:=(a<b); end; procedure por(c:porovfce;a,b:integer); begin if(c(a,b)) then writeln( Prvni vetsi! ); end; begin p:=cmp; if(p(10,20)) then writeln( Prvni vetsi ); por(cmp,10,20); end.