Texty k Programování na VŠFS. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
|
|
- Renata Králová
- před 8 lety
- Počet zobrazení:
Transkript
1 Texty k Programování na VŠFS Petr Kučera 29. května 2006 Petr Kučera () Texty k Programování na VŠFS 29. května / 117
2 Obsah Základní informace k předmětu Dynamicky alokovaná paměť Jednoduché dynamicky alokované datové struktury Stromy Grafy Vstup a výstup do souboru Rekurze Třídící algoritmy Petr Kučera () Texty k Programování na VŠFS 29. května / 117
3 Základní informace k předmětu www: Zápočet: Zkouška: Literatura: kucerap@kti.ms.mff.cuni.cz kucerap/vsfs/programovani Dostatečná účast (chybět nejvýš čtyři vyučovací hodiny), nebo zápočtový program (postup jako minulý semestr.) Praktická, naprogramování zadané úlohy nebo úloh. Töpferová Dana, Töpfer Pavel Sbírka úloh z programování, Grada 1992 Töpfer Pavel Algoritmy a programovací techniky, Prometheus 1995 Petr Kučera () Texty k Programování na VŠFS 29. května / 117
4 Část I Dynamicky alokovaná paměť Petr Kučera () Texty k Programování na VŠFS 29. května / 117
5 Typ ukazatel Proměnná typu ukazatel na typ obsahuje adresu dat daného typu. Deklarace: var p:^typ; type typ ukazatele = ^typ; Například: var p: ^string[32]; type pstr32 = ^string[32]; type ppstr32 = ^pstr32; Porovnání ukazatelů: =, <> Hodnota nil, má-li ukazatel hodnotu nil, znamená to, že nikam neodkazuje. Vždy testovat. Dereferenční operátor ^ (ukazatel^), použití například: writeln (pˆ); Petr Kučera () Texty k Programování na VŠFS 29. května / 117
6 Dynamická alokace paměti new Někdy je užitečné říct si o paměť až za běhu programu, například, když na začátku nevíme, kolik jí budeme potřebovat, nebo chceme prostě šetřit pamětí. Alokace, procedura new (ukazatel). Například: new (p); Velikost paměti, která se alokuje, je daná typem ukazatele. Pokud se nepodaří paměť alokovat, program skončí s chybou. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
7 Uvolnění paměti dispose Dealokace, uvolnění paměti, procedura dispose (ukazatel). Například: dispose (p); Po dispose má ukazatel nedefinovanou hodnotu. Okamžitě přiřadit nil. Pokud p a q jsou ukazatelé ukazující na stejný objekt a zavoláme dispose (p);, hodnota q se nemění. Pokud je p=nil, dojde po dispose (p); k chybě a ukončení programu. Testovat! Pokud paměť neuvolníte a ztratíte na ni ukazatel, zůstane zabraná až do konce programu. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
8 Poznámky k paměti V pascalu je paměť běžícího programu organizována ve čtyřech segmentech: Code segment, v němž je uložen kód programu. Data segment, v němž jsou uložena staticky alokovaná data (tj. na začátku programu). Stack segment, v němž jsou uloženy aktivační záznamy při volání procedur a funkcí (tj. kam se vrátit po jejich ukončení, kam vrátit hodnotu apod.) a hlavně lokální proměnné v procedurách a funkcích. Heap segment, čili halda, zde se přiděluje dynamicky alokovaná paměť. Velikosti jednotlivých segmentů mohou být omezeny. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
9 Příklad program ukazatel (input, output); var p: ^string[32]; type pstring32 = ^string[32]; begin new (p); p^ := Ahoj světe! ; writeln (p^); dispose (p); p := nil; end. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
10 Lineární spojový seznam Lineární spojový seznam je posloupnost záznamů stejného typu seřazených za sebe a spojených pomocí ukazatelů. Každý uzel seznamu obsahuje nějaká data a odkaz na následníka. Data Data Data Data NIL Petr Kučera () Texty k Programování na VŠFS 29. května / 117
11 Lineární seznam v Pascalu Typ ukazatel na záznam R může být deklarován před deklarací typu R, ale v rámci jednoho bloku type. (Jinak by nešlo realizovat.) Deklarace typu spojového seznamu (data jsou například jedno číslo): type PLSeznam = ^TLSeznam; TLSeznam = record data : integer; dalsi : PLSeznam; end; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
12 Manipulace s lineárním spojovým seznamem (cvičení) I 1 function vytvor(n: integer): PLSeznam; Funkce vytvoří seznam s N prvky a vrátí odkaz na první prvek z tohoto seznamu (nil, pokud N <= 0). V položkách data budou uložena čísla 1... N vzestupně od začátku do konce. 2 function najdi(s: PLSeznam; d: integer): PLSeznam; Funkce najde prvek v seznamu, který má položku data shodnou s d a vrátí odkaz na něj, nebo nil, pokud prvek v seznamu není. 3 function najdipredchudce(s, p: PLSeznam): PLSeznam; Funkce najde předchůdce prvku p v seznamu s a vrátí na něj odkaz. Pokud se p v seznamu nevyskytuje, vrátí nil, je-li p první, vrátí p. 4 function konec(s: PLSeznam): PLSeznam; Vrátí odkaz na poslední prvek seznamu. 5 procedure vypis(s: PLSeznam); Vypíše na obrazovku čísla v pořadí, v jakém jsou v seznamu. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
13 Manipulace s lineárním spojovým seznamem (cvičení) II 1 procedure vlozzaprvek(p, q: PLSeznam); Vloží prvek q za prvek p. 2 procedure pridejnazacatek(var s: PLSeznam; p: PLSeznam); Vloží prvek p na začátek seznamu s. 3 procedure pridejnakonec(var s: PLSeznam; p: PLSeznam); Vloží prvek p na konec seznamu s. 4 function smaz(var s: PLSeznam; p: PLSeznam): PLSeznam; Smaže prvek p ze seznamu s. Buď si nejprve vymění data s následníkem, nebo nejprve najde předchůdce. Vrací odkaz na smazaný prvek, v položce dalsi bude mít nil. Pokud jej nebudete už používat, nezapomeňte po smaz na dispose. 5 procedure zrus(var s: PLSeznam); Projde seznam a pomocí dispose zruší jeho prvky, s bude po ukončení obsahovat nil. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
14 Část II Jednoduché dynamicky alokované datové struktury Petr Kučera () Texty k Programování na VŠFS 29. května / 117
15 Jednoduché datové struktury Lineární spojový seznam. Obousměrný spojový seznam Seznam s hlavou Petr Kučera () Texty k Programování na VŠFS 29. května / 117
16 Obousměrný spojový seznam Obousměrný spojový seznam je lineární seznam, v němž má každý prvek odkaz nejen na následníka, ale i na předchůdce. Data Data Data Data NIL NIL Petr Kučera () Texty k Programování na VŠFS 29. května / 117
17 Obousměrný seznam v Pascalu type POSeznam = ^TOSeznam; TOSeznam = record data : integer; dalsi : POSeznam; pred : POSeznam; end; Funkce a procedury přistupující k obousměrnému seznamu jsou implementované podobně jako pro lineární seznam. Něco je jednodušší, například vkládání, mazání, protože máme odkaz na předchůdce. Ale musíme hlídat i odkazy na předchůdce, proto je implementace poněkud pracnější. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
18 Seznam s hlavou Seznam libovolného typu si reprezentujeme hlavou, což je struktura, která teprve odkazuje na skutečný seznam. Hlava může obsahovat i jiné položky, například odkaz na konec, počet prvků a podobně. Příklad čtyřprvkového lineárního seznamu s hlavou: 4 Hlava Data Data Data Data NIL Petr Kučera () Texty k Programování na VŠFS 29. května / 117
19 Seznam s hlavou v Pascalu Příklad pro lineární seznam s hlavou s odkazy na začátek a počtem prvků: type THLSeznam = record pocet : integer; zac : PLSeznam; kon : PLSeznam; end; Manipulace je shodná s manipulací s lineárním seznamem, ale musíme upravovat počet a oba odkazy v hlavě. Hlava může být alokovaná staticky. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
20 Zásobník Datová struktura řídící se pravidlem: Poslední dovnitř, první ven. (Anglicky Last In First Out, zkráceně LIFO.) Dno Vrchol Přistupujeme k němu obvykle pomocí těchto procedur a funkcí: top Vrací prvek na vrcholu zásobníku. push Uloží prvek na vrchol zásobníku. pop Smaže prvek z vrcholu zásobníku a vrátí jej. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
21 Zásobník pomocí pole Například zásobník celých čísel: const MAX_ZAS_VEL = 100; type TZasobnikA = record zasobnik : array [1..MAX_ZAS_VEL] of integer; vrchol : integer; end; procedure ZAInit (var z : TZasobnikA); {Inicializace} function ZATop (var z : TZasobnikA) : integer; procedure ZAPush (var z : TZasobnikA; cis : integer); function ZAPop (var z : TZasobnikA) : integer; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
22 Zásobník pomocí pole (poznámky) Položka vrchol vlastně vždy obsahuje počet prvků v zásobníku. Přístupové procedury a funkce pouze aktualizují hodnotu položky vrchol a přistupují jen k zasobnik [vrchol]. Pozor na přetečení nebo podtečení (nutno kontrolovat). ZATop zásobník nemění, předání odkazem použito, aby se nekopírovalo celé pole. Výhodou implementace pomocí pole je rychlost. Nevýhodou je, že musíme dopředu dobře odhadnout maximální velikost zásobníku a to, že zásobník zabírá stále stejně paměti, i když obsahuje jen jeden či dva prvky. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
23 Zásobník pomocí seznamu s hlavou Přidáváme i odebíráme ze začátku seznamu. Výhody a nevýhody opačně než u implementace pomocí pole. Opět zásobník celých čísel: type TZasobnikLS = record zac : PLSeznam; end; procedure ZLSInit (var z : TZasobnikLS); {Inicializace} function ZLSTop (var z : TZasobnikLS) : integer; procedure ZLSPush (var z : TZasobnikLS; cis : integer); function ZLSPop (var z : TZasobnikLS) : integer; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
24 Fronta Datová struktura řídící se pravidlem: První dovnitř, první ven. (Anglicky First In First Out, zkráceně FIFO.) Vstup Výstup Přistupujeme k němu obvykle pomocí těchto procedur a funkcí: first Vrací první prvek fronty. put Uloží prvek na konec fronty. get Smaže prvek ze začátku fronty a vrátí jej. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
25 Fronta pomocí pole Například fronta celých čísel: const MAX_FR_VEL = 100; type TFrontaA = record fronta : array [1..MAX_FR_VEL] of integer; zac, kon : integer; pocet : integer; end; procedure FAInit (var z : TFrontaA); {Inicializace} function FAFirst (var z : TFrontaA) : integer; procedure FAPut (var z : TFrontaA; cis : integer); function FAGet (var z : TFrontaA) : integer; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
26 Fronta pomocí pole (poznámky) Při posunu indexů zac a kon počítáme modulo MAX VELIKOST FRONTY, jako by bylo pole do kolečka. Vyhneme se tím přesunu prvků, kdybychom došli na konec pole. Abychom poznali přetečení a podtečení, musíme si pamatovat počet prvků (a kontrolovat jej). Výhody a nevýhody jako u zásobníku pomocí pole. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
27 Fronta pomocí seznamu s hlavou Přidáváme na konec seznamu, odebíráme ze začátku. Výhody a nevýhody jako u zásobníku pomocí seznamu. Fronta celých čísel: type TFrontaLS = record zac, kon : PLSeznam; end; procedure FLSInit (var z : TFrontaLS); {Inicializace} function FLSTop (var z : TFrontaLS) : integer; procedure FLSPush (var z : TFrontaLS; cis : integer); function FLSPop (var z : TFrontaLS) : integer; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
28 Varianty fronty Oboustraná fronta Přidávání i odebírání z obou konců, implementace nejsnáze pomocí obousměrně vázaného seznamu. Prioritní fronta Prvky jsou odebírány podle priorit (pokud mají stejnou prioritu, bere se jako normální fronta). Pokud je různých priorit málo, třeba d, můžeme implementovat pomocí d různých seznamů nebo polí. Pokud je priorit hodně, bývá implementace pomocí pole nebo seznamu pomalá (kvůli třídění), lepší je halda (o té možná jindy). Petr Kučera () Texty k Programování na VŠFS 29. května / 117
29 Cvičení 1 Implementujte zásobník celých čísel pomocí pole i dynamicky pomocí seznamu. 2 Implementujte frontu celých čísel pomocí pole i dynamicky pomocí seznamu. 3 Implementujte prioritní frontu celých čísel, která upřednostňuje sudá čísla před lichými. 4 Implementujte oboustranou frontu. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
30 Část III Stromy Petr Kučera () Texty k Programování na VŠFS 29. května / 117
31 Stromy 6 Co je to strom 7 Reprezentace stromu 8 Binární vyhledávací stromy 9 Cvičení Petr Kučera () Texty k Programování na VŠFS 29. května / 117
32 Co je to strom... Formálně: Acyklický graf. Neformálně: Struktura skládající se z vrcholů (uzlů). Jeden je význačný, nazývá se kořen, ten reprezentuje přístup ke stromu. Kořen má několik následníků neboli synů. Každý z nich je kořenem menšího stromu, tj. má další syny atd. V binárním stromě má každý vrchol nejvýš dva syny (levého a pravého). Strom Binární strom Petr Kučera () Texty k Programování na VŠFS 29. května / 117
33 Reprezentace binárního stromu S vrcholem mohou být asociována data (v příkladu celé číslo). Ve vrcholu se občas hodí mít kromě odkazu na syny i odkaz na otce (v příkladu chybí). type PBinVrchol = ^TBinVrchol; TBinVrchol = record levy, pravy : PBinVrchol; data : integer; end; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
34 Reprezentace obecného stromu I Je-li maximální počet synů omezený a ne příliš velký, můžeme odkazy na ně uchovávat v poli. const MAX_POCET_SYNU = 20; type PVrchol = ^TVrchol; TVrchol = record syn : array [1..MAX_POCET_SYNU] of PVrchol; data : integer; end; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
35 Reprezentace obecného stromu II Jinou možností je uchovávat odkazy na syny ve spojovém seznamu. type PSeznamSynu = ^TSeznamSynu; PVrchol = ^TVrchol; TSeznamSynu = record syn : PVrchol; dalsi : PSeznamSynu; end; TVrchol = record syn : PSeznamSynu; data : integer; end; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
36 Reprezentace obecného stromu III Dalším způsobem je pamatovat si jen odkaz na prvního syna a svého dalšího bratra. Chceme-li se dozvědět všechny syny, přejdeme do prvního a projdeme postupně všechny jeho bratry. Obecný strom jsme vlastně nahradili binárním. type PVrchol = ^TVrchol; TVrchol = record syn, bratr : PVrchol; data : integer; end; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
37 Binární vyhledávací strom (BVS) je binární strom, v němž navíc asociujeme s každým vrcholem tzv. klíč (například číslo). Navíc pro každý vrchol v platí, že všechny prvky v podstromu levého syna (není-li nil) mají klíč menší než klíč v a všechny prvky v podstromu pravého syna (není-li nil) mají klíč větší než klíč v Petr Kučera () Texty k Programování na VŠFS 29. května / 117
38 Reprezentace BVS Binární strom, liší se jen položkou klíč. Položka data pro jednoduchost vynechána. type PBVSVrchol = ^TBVSVrchol; TBVSVrchol = record levy, pravy : PBVSVrchol; klic : integer; end; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
39 Vyhledávání v BVS function najdi (PBVSVrchol : koren; x : integer):pbvsvrchol Hledáme prvek s klíčem x. Začínáme v kořeni Porovnáme hodnotu x s klíčem aktuálního vrcholu, je-li x stejný jako klíč, končíme, je-li x větší, změníme aktuální klíč na pravého syna, je-li x menší, změníme aktuální klíč na levého syna. x= Petr Kučera () Texty k Programování na VŠFS 29. května / 117
40 Vkládání do BVS procedure vloz (var PBVSVrchol : koren; x : integer) Nejprve postupujeme stejně jako ve funkci najdi, dokud nenarazíme na nil. (Pokud prvek najdeme, tak ohlásíme chybu.) Tím jsme našli místo, kde by vrchol byl, kdyby byl ve stromě. Vytvoříme nový vrchol se zadaným klíčem a přidáme jej na nalezené místo. x= Petr Kučera () Texty k Programování na VŠFS 29. května / 117
41 Mazání z BVS procedure smaz (var PBVSVrchol : koren; x : integer) Nejprve stejně jako ve funkci najdi nenajdeme prvek v, při hledání v najdeme rovnou i jeho otce o. Nemá-li vrchol v syna, prostě v, s využitím odkazu na o, odstraníme. Má-li vrchol v jediného syna s, smažeme v a s připojíme jako syna o (toho, kterým byl v). Pokud má vrchol v dva syny,... viz následující slide. x=46 50 x= o o 67 6 v v s Petr Kučera () Texty k Programování na VŠFS 29. května / 117
42 Mazání z BVS (dokončení) Má-li v dva syny l a r, najdeme nejbližší menší prvek w, což je největší prvek z levého podstromu. Ten najdeme tak, že jdeme z l stále doprava, všimněte si, že w nikdy nemá pravého syna. Vyměníme datové a klíčové položky w a v. Poté w smažeme tak, jak bylo popsáno. Analogicky lze použít nejbližší větší prvek. x=23 v 23 6 l r 43 o 50 x=23 50 o v 6 l r w 1 23 w Petr Kučera () Texty k Programování na VŠFS 29. května / 117
43 Cvičení Implementujte funkce a procedury pro vyhledávání, vkládání a mazání v binárním vyhledávacím stromě. Implementujte funkce, které najdou největší a nejmenší prvek z binárního vyhledávacího stromu. Implementujte funkci, která vypíše prvky uložené v binárním vyhledávacím stromě od nejmenšího do největšího, nepoužívejte přitom rekurzi, o které si řekneme později. Jako nápověda může sloužit, že se zde využije zásobník. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
44 Část IV Grafy Petr Kučera () Texty k Programování na VŠFS 29. května / 117
45 Grafy 10 Co je to graf 11 Reprezentace grafu 12 Průchod stromu a grafu 13 Průchod stromu do hloubky 14 Průchod stromu do šířky 15 Průchod grafu do hloubky 16 Průchod grafu do šířky 17 Cvičení Petr Kučera () Texty k Programování na VŠFS 29. května / 117
46 Co je to graf... Graf je struktura skládající se z vrcholů a hran mezi těmito vrcholy. (Například silniční síť.) Orientovaný graf hrany jsou orientované, tj. u každé je dáno, že vede z jednoho vrcholu do jiného a ne naopak. Neorientovaný graf hrany nejsou orientované, tj. každá vede jakoby oběma směry. Sousedi či následníci vrcholy jsou ty vrcholy, do nichž z něj vede hrana. Cesta je posloupnost vrcholů v 1,..., v k, že mezi dvěma následujícími vždy vede hrana a žádný vrchol se neopakuje. Cyklus je cesta, která začíná i končí ve stejném vrcholu. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
47 Co je to graf... Neorientovaný graf Orientovaný graf b f d h b f d h c c a g e a g e Cesta a, b, c, d, e Petr Kučera () Texty k Programování na VŠFS 29. května / 117
48 Matice sousednosti Matice sousednosti grafu s n vrcholy je matice A velikosti n n booleovských hodnot. b Deklarace: var A: array [1..N, 1..N] of boolean; A[i, j] = true, právě když je v grafu hrana z vrcholu i do vrcholu j. a f c g d e h a b c d e f g h a b c d e f g h Petr Kučera () Texty k Programování na VŠFS 29. května / 117
49 Matice incidence b Matice incidence grafu s n vrcholy a m hranami je matice I velikosti m n booleovských hodnot. a Deklarace: var I: array [1..M, 1..N] of boolean; I [i, j] = true, právě když vrchol j je prvkem hrany i. f c g d e h a b c d e f g h Petr Kučera () Texty k Programování na VŠFS 29. května / 117
50 Seznam sousedů Seznam sousedů grafu s n vrcholy a m hranami se skládá z pole V délky n, v němž si ke každému vrcholu i pamatujeme odkaz na seznam vrcholů, do nichž z i vede hrana. Seznamy buď dynamicky pomocí lineárního spojového seznamu. Hodí se pokud se často mění struktura grafu. Nebo pomocí druhého pole E délky m. V [i] pak obsahuje index v poli E, na němž začíná seznam sousedů vrcholu i, seznam končí na V [i + 1] 1. Pro jednoduchost přidáme vrchol N + 1, abychom mohli k vrcholům přistupovat jednotným způsobem. Z téhož důvodu i M + 1 v jako rozsah v deklaraci V. Deklarace: var V: array [1..N+1] of 1..M+1; E: array [1..M] of 1..N; Petr Kučera () Texty k Programování na VŠFS 29. května / 117
51 Seznam sousedů příklad b f d h c a g e a b c d e f g h? V E b g a c f d g e c h h Petr Kučera () Texty k Programování na VŠFS 29. května / 117
52 Průchod stromu nebo grafu Chceme navštívit všechny vrcholy a něco s nimi udělat. Navíc máme požadavky na pořadí, v jakém je navštívíme. Například chceme vypsat uzly binárního vyhledávacího stromu uspořádané podle klíčů. Nebo chceme v grafu pro daný počáteční vrchol spočítat délku nejkratší cesty (co do počtu hran) do ostatních vrcholů. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
53 Průchod stromu do hloubky Konkrétní úloha: Vypsat uzly binárního vyhledávacího stromu uspořádané podle klíčů. Postupujeme tak, že v daném vrcholu v nejprve vypíšeme všechny uzly v podstromu levého syna, potom vrchol v, potom všechny uzly v podstromu pravého syna. Uzly v obou podstromech zpracováváme analogicky. Realizace buď pomocí rekurze (později), nebo pomocí zásobníku. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
54 Průchod stromu do hloubky algoritmus 1 Z prázdný zásobník 2 v kořen stromu 3 zezasobniku false 4 Dokud není v nil, opakuj následující kroky: 1 Má-li v levého syna l a zezasobniku = false 1 push(z, v) 2 v l 3 zezasobniku false 4 pokračuj další smyčkou cyklu 2 vypiš v 3 Má-li v pravého syna r 1 v r 2 zezasobniku false 3 pokračuj další smyčkou cyklu 4 v pop(z) 5 zezasobniku true Petr Kučera () Texty k Programování na VŠFS 29. května / 117
55 Průchod stromu do hloubky varianty Podle pořadí zpracovávaných vrcholů rozeznáváme tři varianty průchodu do hloubky. preorder Zpracuj vrchol v, zpracuj levý podstrom vrcholu v, zpracuj pravý podstrom vrcholu v. inorder Zpracuj levý podstrom vrcholu v, zpracuj vrchol v, zpracuj pravý podstrom vrcholu v. postorder Zpracuj levý podstrom vrcholu v, zpracuj pravý podstrom vrcholu v, zpracuj vrchol v. Předešlý algoritmus zařídí výpis v pořadí inorder. Ostatní varianty lze provést snadnou modifikací, my si je ukážeme později v části o rekurzi. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
56 Průchod stromu do šířky Konkrétní úloha: Vypsat uzly binárního stromu v pořadí podle jejich hloubky. Realizace pomocí fronty (tady nejde rekurzi moc dobře použít). Petr Kučera () Texty k Programování na VŠFS 29. května / 117
57 Průchod stromu do šířky algoritmus 1 F prázdná fronta 2 put(f, kořen stromu) 3 Dokud není F prázdná, opakuj následující kroky: 1 v get(f ) 2 vypiš v 3 Má-li v levého syna l, put(f, l). 4 Má-li v pravého syna r, put(f, r). Petr Kučera () Texty k Programování na VŠFS 29. května / 117
58 Průchod grafu do hloubky Chceme navštívit každý vrchol grafu právě jednou a to tak, že jsme-li ve vrcholu v, který má následníky u 1,..., u k, chceme nejprve navštívit všechny vrcholy, do nichž vede cesta z u 1, potom všechny vrcholy, do nichž vede cesta z u 2 atd. Stejně jako při průchodu stromem, použijeme zásobník. Například chceme zjistit komponenty souvislosti grafu (komponenta souvislosti je množina vrcholů, které jsou všechny spojené cestami. Navíc už je maximální, nejde k ní tedy nic přidat.) Petr Kučera () Texty k Programování na VŠFS 29. května / 117
59 Průchod grafu do hloubky Tento algoritmus označí (nastaví K[i] na 1) všechny vrcholy, do nichž vede cesta z vrcholu s. N označuje počet vrcholů. 1 Z prázdný zásobník 2 push(z, počáteční vrchol s) 3 K: array [1..N] of integer 4 K[i] 0 pro i = 1... N. 5 K[s] 1 6 Dokud není Z prázdný, opakuj následující kroky: 1 v pop(z) 2 Pro každého následníka u vrcholu v, pro nějž K[u] = 0, proveď: 1 push(z, u). 2 K[u] 1 Petr Kučera () Texty k Programování na VŠFS 29. května / 117
60 Průchod grafu do hloubky poznámky Graf je vhodné reprezentovat pomocí seznamu následníků. Pokud chceme najít všechny komponenty, voláme tento algoritmus, dokud je pro nějaký vrchol K[v] = 0 s tím, že jako počáteční vrchol použijeme vrchol v. Číslo komponenty postupně zvyšujeme, v algoritmu bylo 1. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
61 Průchod grafu do šířky Chceme navštívit každý vrchol grafu právě jednou a to tak, že jsme-li ve vrcholu v, který má následníky u 1,..., u k, chceme nejprve navštívit vrcholy u 1,..., u k a pak teprve jejich následníky atd. Stejně jako při průchodu stromem, použijeme frontu. Například vycházíme z vrcholu s a chceme najít pro každý vrchol v délku nejkratší cesty (co do počtu hran) z s do v. Případně i tuto cestu. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
62 Průchod grafu do šířky algoritmus Tento algoritmus spočítá pro každý vrchol délku nejkratší cesty (počet hran) z vrcholu s. Délku uloží do pole D, předchůdce na této cestě do P. 1 F prázdná fronta 2 put(f, počáteční vrchol s) 3 D, P: array [1..N] of integer 4 D[i] N + 1, P[i] N + 1 pro i = 1... N. 5 D[s] 0 6 Dokud není F prázdná, opakuj následující kroky: 1 v get(f ) 2 Pro každého následníka u vrcholu v, pro nějž D[u] = N + 1, proveď: 1 put(f, u). 2 D[u] D[v] P[u] v Petr Kučera () Texty k Programování na VŠFS 29. května / 117
63 Průchod grafu do šířky poznámky Vhodnou reprezentací grafu je opět seznam sousedů. Cestu do vrcholu zrekonstruujeme pomocí předchůdců. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
64 Cvičení 1 Implementujte algoritmus pro vypsání uzlů binárního vyhledávacího stromu uspořádané podle klíče. 2 Implementujte průchod stromem do šířky. 3 Implementujte průchod grafem do hloubky a hledání komponent souvislosti grafu. 4 Implementujte průchod grafem do šířky a počítání nejkratších cest ze zadaného vrcholu (co do počtu hran). 5 Implementujte průchod stromem v pořadí preorder, inorder, postorder. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
65 Část V Vstup a výstup do souboru Petr Kučera () Texty k Programování na VŠFS 29. května / 117
66 Vstup a výstup do souboru 18 Typy souborů 19 Otevření a uzavření souboru 20 Pohyb v souboru 21 Textové soubory 22 Netextové soubory 23 Cvičení Petr Kučera () Texty k Programování na VŠFS 29. května / 117
67 Typy souborů Soubor s udaným typem, např.: var f1: file of integer; Soubor bez udaného typu, základní položkou je byte, např.: var f2: file; Textový soubor, čte se obvykle po znacích nebo po řádcích, např.: var f3: text; Standardní vstup, obvykle jde o vstup z klávesnice, je to textový soubor jen pro čtení, který je vždy otevřený po spuštění programu. Čte z něj pomocí funkcí read, readln a podobných, u nichž se nespecifikuje soubor parametrem. Standardní výstup, obvykle jde o výstup na obrazovku, je to textový soubor jen pro zápis, který je vždy otevřený po spuštění programu. Zapisuje se do něj pomocí funkcí write, writeln a podobných. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
68 Otevření a uzavření souboru Nejprve je nutné asociovat soubor se jménem: assign (f1, "cisla"); Poté je možné soubor otevřít: reset soubor musí existovat, textové soubory jsou otevřeny pouze pro čtení. rewrite pokud soubor existoval, smaže nejprve jeho obsah, pokud neexistoval, vytvoří jej. append otevírá textový soubor pro zápis, soubor musí existovat a zapisovaný text bude přidáván na konec souboru. Například: reset (f1); rewrite (f2); append (f3); Nakonec je slušné soubor zavřít. close (f1); Další manipulace se soubory a adresáři viz. nápověda a dokumentace. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
69 Pohyb v souboru V každý okamžik je program v souboru na určité pozici, tj. za nějakým znakem, či složkou daného typu. Funkce eof vrací true, pokud je tato pozice na konci souboru, false jinak. Pohyb je vykonáván jednak přirozeně čtením a zápisem, jednak pomocí dalších funkcí, které se liší podle typu souboru. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
70 Pohyb v textovém souboru U všech funkcí pro textové soubory, pokud není udán soubor, míní se standardní vstup případně výstup. eoln vrací true, pokud je pozice souboru na znaku konce řádku, jinak false. seekeof má stejný význam jako eof, ale ignoruje všechny mezery, tabelátory a znaky konce řádku. Změní pozici na první znak za těmito znaky a pak vrátí, co by vrátilo eof. seekeoln má stejný význam jako eoln, ale ignoruje všechny mezery a tabelátory. Změní pozici na první pozici za těmito znaky a pak vrátí, co by vrátilo eoln Petr Kučera () Texty k Programování na VŠFS 29. května / 117
71 Čtení z textového souboru Procedury read, readln. Prvním parametrem může být textový soubor, jinak se bere standardní vstup. Další parametry mohou být typu char, celočíselného, reálného nebo string, ze souboru se přečte příslušná hodnota (znak, reprezentace čísla nebo řetězec příslušné délky) a načte se do daného parametru. readln se liší jen tím, že nakonec přejde na nový řádek. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
72 Zápis do textového souboru Procedury write, writeln Prvním parametrem může být opět textový soubor, jinak se míní standardní výstup. Další parametry mohou být stejného typu jako u read. Parametry je možné zadat pomocí: hodnota [ : minšířka [ : početmíst]] Potom: minšířka specifikuje, na kolik pozic se má výstup zarovnat. početmíst specifikuje počet desetinných míst je za desetinnou tečkou (jen reálné parametry). writeln se liší jen tím, že na konec přidá znak konce řádku. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
73 Buffery Všechny operace se bufferují. Velikost bufferu je možné změnit pomocí settextbuf. flush vyprázdní buffer a přitom zapíše dosud nezapsané znaky na disk. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
74 Příklad práce s textovým souborem (začátek) program textsoub; var vstup: text; vystup: text; soucet: integer; scitanec: integer; begin assign (vstup, vstup.txt ); assign (vystup, vystup.txt ); reset (vstup); rewrite (vystup); Petr Kučera () Texty k Programování na VŠFS 29. května / 117
75 Příklad práce s textovým souborem (dokončení) while not seekeof (vstup) do begin soucet := 0; while not seekeoln (vstup) do begin read (vstup, scitanec); soucet := soucet + scitanec; end; writeln (vystup, soucet:10); readln (vstup); end; close (vstup); close (vystup); end. Petr Kučera () Texty k Programování na VŠFS 29. května / 117
Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz
Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz (2 + 5) * (13-4) * + - 2 5 13 4 - listy stromu obsahují operandy (čísla) - vnitřní uzly obsahují operátory (znaménka)
VíceBinární soubory (datové, typované)
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
VíceNPRG030 Programování I, 2018/19 1 / :03:07
NPRG030 Programování I, 2018/19 1 / 20 3. 12. 2018 09:03:07 Vnitřní třídění Zadání: Uspořádejte pole délky N podle hodnot prvků Měřítko efektivity: * počet porovnání * počet přesunů NPRG030 Programování
VíceProgramovací jazyk Pascal
Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce
VíceProhledávání do šířky = algoritmus vlny
Prohledávání do šířky = algoritmus vlny - souběžně zkoušet všechny možné varianty pokračování výpočtu, dokud nenajdeme řešení úlohy průchod stromem všech možných cest výpočtu do šířky, po vrstvách (v každé
VíceVISUAL BASIC. Práce se soubory
VISUAL BASIC Práce se soubory Práce se soubory 1/2 2 Vstupní data pro programy bývají uloženy do souborů Vstupy pro výpočet, nastavení vzhledu aplikace Výsledky práce programu je potřeba uchovat uložit
VíceTest prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem
Test prvočíselnosti Úkol: otestovat dané číslo N, zda je prvočíslem 1. zkusit všechny dělitele od 2 do N-1 časová složitost O(N) cca N testů 2. stačí zkoušet všechny dělitele od 2 do N/2 (větší dělitel
VíceProgramová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í 3. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015 Umíme z minulé hodiny Implementace zásobníku a fronty pomocí
VíceDatové typy a struktury
atové typy a struktury Jednoduché datové typy oolean = logická hodnota (true / false) K uložení stačí 1 bit často celé slovo (1 byte) haracter = znak Pro 8-bitový SII kód stačí 1 byte (256 možností) Pro
VíceObecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012
Obecná informatika Přednášející Putovních přednášek Matematicko-fyzikální fakulta Univerzity Karlovy v Praze Podzim 2012 Přednášející Putovních přednášek (MFF UK) Obecná informatika Podzim 2012 1 / 18
Více1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5
Obsah Obsah 1 Programovací jazyk Pascal 1 1.1 Struktura programu v Pascalu.................... 1 2 Proměnné 2 2.1 Vstup a výstup............................ 3 3 Operátory a některé matematické funkce 5
VíceÚvod do teorie grafů
Úvod do teorie grafů Neorientovaný graf G = (V,E,I) V množina uzlů (vrcholů) - vertices E množina hran - edges I incidence incidence je zobrazení, buď: funkce: I: E V x V relace: I E V V incidence přiřadí
VíceMaturitní otázky z předmětu PROGRAMOVÁNÍ
Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti
VíceVýhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.
Kapitola Reprezentace grafu V kapitole?? jsme se dozvěděli, co to jsou grafy a k čemu jsou dobré. rzo budeme chtít napsat nějaký program, který s grafy pracuje. le jak si takový graf uložit do počítače?
VícePrioritní fronta, halda
Prioritní fronta, halda Priority queue, heap Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 2018 1 / 26 Prioritní fronta Halda Heap sort 2 / 26 Prioritní fronta (priority queue) Podporuje
Více1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10
Úlohy- 2.cvičení 1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10 2. Převeďte dané desetinné číslo do dvojkové soustavy (DEC -> BIN): a) 0,8125 10 b) 0,35 10
VíceProgramování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.
Programování 2 (NMIN102) Soubory RNDr. Michal Žemlička, Ph.D. Soubor abstrakce vstupního, výstupního či vstupně výstupního zařízení textová, typovaná a netypovaná varianta základní operace: otevření, čtení/zápis,
VíceALGORITMIZACE A PROGRAMOVÁNÍ
Metodický list č. 1 Algoritmus a jeho implementace počítačovým programem Základním cílem tohoto tematického celku je vysvětlení pojmů algoritmus a programová implementace algoritmu. Dále je cílem seznámení
VíceAlgoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová
VíceŘešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C
Hanojské věže - 3 kolíky A, B, C - na A je N disků různé velikosti, seřazené od největšího (dole) k nejmenšímu (nahoře) - kolíky B a C jsou prázdné - úkol: přenést všechny disky z A na B, mohou se odkládat
VíceImplementace LL(1) překladů
Překladače, přednáška č. 6 Ústav informatiky, FPF SU Opava sarka.vavreckova@fpf.slu.cz Poslední aktualizace: 30. října 2007 Postup Programujeme syntaktickou analýzu: 1 Navrhneme vhodnou LL(1) gramatiku
VíceInovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Typové a netypové soubory
Střední průmyslová škola a Vyšší odborná škola technická Brno, Sokolská 1 Šablona: Název: Téma: Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Typové a netypové
VíceGrafové algoritmy. Programovací techniky
Grafové algoritmy Programovací techniky Grafy Úvod - Terminologie Graf je datová struktura, skládá se z množiny vrcholů V a množiny hran mezi vrcholy E Počet vrcholů a hran musí být konečný a nesmí být
VíceImplementace seznamů do prostředí DELPHI pomocí lineárního seznamu
Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu Ukazatel a dynamické datové struktury v prostředí DELPHI Důležitým termínem a konstrukčním programovým prvkem je typ UKAZATEL. Je to vlastně
VíceDobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3
DobSort Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 V roce 1980 navrhl Dobosiewicz variantu (tzv. DobSort),
Více2) 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.
Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus
VíceStromy, haldy, prioritní fronty
Stromy, haldy, prioritní fronty prof. Ing. Pavel Tvrdík CSc. Katedra počítačů FEL České vysoké učení technické DSA, ZS 2008/9, Přednáška 6 http://service.felk.cvut.cz/courses/x36dsa/ prof. Pavel Tvrdík
VíceNMIN102 Programování /2 Z, Zk
NMIN102 Programování 2 --- 2/2 Z, Zk Pavel Töpfer Katedra softwaru a výuky informatiky MFF UK MFF Malostranské nám., 4. patro, pracovna 404 pavel.topfer@mff.cuni.cz http://ksvi.mff.cuni.cz/~topfer Pavel
VícePascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7
Pascal Katedra aplikované kybernetiky Ing. Miroslav Vavroušek Verze 7 Proměnné Proměnná uchovává nějakou informaci potřebnou pro práci programu. Má ve svém oboru platnosti unikátní jméno. (Připadne, musí
VíceAlgoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová
Více1. D Y N A M I C K É DAT O V É STRUKTUR Y
1. D Y N A M I C K É DAT O V É STRUKTUR Y Autor: Petr Mik Abychom se mohli pustit do dynamických datových struktur, musíme se nejdřív podívat na datový typ ukazatel. 1. D AT O V Ý TYP U K A Z AT E L Datové
VíceMaturitní téma: Programovací jazyk JAVA
Maturitní téma: Programovací jazyk JAVA Insert Sort (třídění vkládáním) 1. Jako setříděnou část označíme první prvek pole. Jako nesetříděnou část označíme zbytek pole. 2. Vezmeme první (libovolný) prvek
VíceDynamické datové struktury I.
Dynamické datové struktury I. Seznam. Fronta. Zásobník. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz
VíceČasová a prostorová složitost algoritmů
.. Časová a prostorová složitost algoritmů Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Hodnocení algoritmů Programovací techniky Časová a prostorová
VíceDa D to t v o é v ty t py IB111: Datové typy
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 provádět? Navržení práce s daty je velice důležité
Vícepřirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:
Metody řazení ve vnitřní a vnější paměti. Algoritmy řazení výběrem, vkládáním a zaměňováním. Heapsort, Shell-sort, Radix-sort, Quicksort. Řazení sekvenčních souborů. Řazení souborů s přímým přístupem.
VíceLineární spojový seznam (úvod do dynamických datových struktur)
Lineární spojový seznam (úvod do dynamických datových struktur) Jan Hnilica Počítačové modelování 11 1 Dynamické datové struktury Definice dynamické struktury jsou vytvářeny za běhu programu z dynamicky
VíceObsah prezentace. Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest
Obsah prezentace Základní pojmy v teorii o grafech Úlohy a prohledávání grafů Hledání nejkratších cest 1 Základní pojmy Vrchol grafu: {množina V} Je to styčná vazba v grafu, nazývá se též uzlem, prvkem
VíceLineární datové struktury
Lineární datové struktury doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB TUO) Lineární datové
VíceGrafové algoritmy. Programovací techniky
Grafové algoritmy Programovací techniky Grafy Úvod - Terminologie Graf je datová struktura, skládá se z množiny vrcholů V a množiny hran mezi vrcholy E Počet vrcholů a hran musí být konečný a nesmí být
VíceVyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.
Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky
VíceAlgoritmizace řazení Bubble Sort
Algoritmizace řazení Bubble Sort Cílem této kapitoly je seznámit studenta s třídícím algoritmem Bubble Sort, popíšeme zde tuto metodu a porovnáme s jinými algoritmy. Klíčové pojmy: Třídění, Bubble Sort,
VícePole a kolekce. v C#, Javě a C++
Pole a kolekce v C#, Javě a C++ C# Deklarace pole typ_prvku_pole[] jmeno_pole; Vytvoření pole jmeno_pole = new typ_prvku_pole[pocet_prvku_pole]; Inicializace pole double[] poled = 4.8, 8.2, 7.3, 8.0; Java
VíceVyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky
Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové
VíceBinární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620
Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620 1. Vymezení pojmů Strom: Strom je takové uspořádání prvků - vrcholů, ve kterém lze rozeznat předchůdce - rodiče a následovníky - syny.
VíceProgramování v C++, 2. cvičení
Programování v C++, 2. cvičení 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 Operátory new a delete 2 3 Operátory new a delete minule
VíceStromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy
Stromy úvod 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 Neorientovaný strom Orientovaný strom Kořenový orientovaný
VíceZákladní datové struktury III: Stromy, haldy
Základní datové struktury III: Stromy, haldy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní
Více5 Rekurze a zásobník. Rekurzivní volání metody
5 Rekurze a zásobník Při volání metody z metody main() se do zásobníku uloží aktivační záznam obsahující - parametry - návratovou adresu, tedy adresu, kde bude program pokračovat v metodě main () po skončení
VíceZákladní datové struktury
Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013
VíceNPRG030 Programování I, 2016/17 1 / :58:13
NPRG030 Programování I, 2016/17 1 / 31 10. 10. 2016 10:58:13 Podmínka = něco, co JE, nebo NENÍ splněno typ Boolean hodnoty: TRUE pravda FALSE lež domluva (optimistická): FALSE < TRUE NPRG030 Programování
VíceAlgoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010
Dynamické programování Jiří Vyskočil, Marko Genyg-Berezovskyj 2010 Rozděl a panuj (divide-and-conquer) Rozděl (Divide): Rozděl problém na několik podproblémů tak, aby tyto podproblémy odpovídaly původnímu
VíceRekurzivní algoritmy
Rekurzivní algoritmy prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA) ZS
VíceNPRG030 Programování I, 2010/11
Podmínka = něco, co JE, nebo NENÍ splněno typ Boolean hodnoty: TRUE pravda FALSE lež domluva (optimistická): FALSE < TRUE když X, Y jsou (číselné) výrazy, potom X = Y X Y X < Y X > Y X = Y jsou
VíceDynamické datové typy a struktury
.. a Programovací techniky doc. Ing. Jiří Rybička Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Programovací techniky a 2 / 18 Uchovávají adresu v paměti Programovací techniky a 2 / 18 Uchovávají
Vícebfs, dfs, fronta, zásobník, prioritní fronta, halda
bfs, dfs, fronta, zásobník, prioritní fronta, halda Petr Ryšavý 19. září 2017 Katedra počítačů, FEL, ČVUT prohledávání grafů Proč prohledávání grafů Zkontrolovat, zda je sít spojitá. Hledání nejkratší
VíceAlgoritmizace a programování
Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech
Více- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku
Znaky - standardní typ char var Z, W: char; - znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku - v TP (často i jinde) se používá kódová
VíceČtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:
Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury
VíceABSTRAKTNÍ DATOVÉ TYPY
Jurdič Radim ABSTRAKTNÍ DATOVÉ TYPY Veškeré hodnoty, s nimiž v programech pracujeme, můžeme rozdělit do několika skupin zvaných datové typy. Každý datový typ představuje množinu hodnot, nad kterými můžeme
VíceAnotace. Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj
Anotace Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj Direktivy překladače Překladač kontroluje plno věcí, například: zda nekoukáme za konec
VíceRekurze. Pavel Töpfer, 2017 Programování 1-8 1
Rekurze V programování ve dvou hladinách: - rekurzivní algoritmus (řešení úlohy je definováno pomocí řešení podúloh stejného charakteru) - rekurzivní volání procedury nebo funkce (volá sama sebe přímo
VíceVzdálenost uzlů v neorientovaném grafu
Vzdálenosti a grafy Vzdálenost uzlů v neorientovaném grafu Je dán neorientovaný neohodnocený graf G = (V,E,I) vzdálenost uzlů u a v v neorientovaném souvislém grafu G je délka nejkratší cesty spojující
VíceAnotace. Soubory a práce s nimi, rekurze podruhé, struktury (datový typ record), Martin Pergel,
Anotace Soubory a práce s nimi, rekurze podruhé, struktury (datový typ record), základní třídicí algoritmy. Soubory a práce s nimi Dnes budou pouze soubory textové. Textový soubor ovládáme pomocí proměnné
VíceStromy. Jan Hnilica Počítačové modelování 14
Stromy Jan Hnilica Počítačové modelování 14 1 Základní pojmy strom = dynamická datová struktura, složená z vrcholů (uzlů, prvků) propojených hranami hrany chápeme jako orientované, tzn. vedou z uzlu A
VíceAlgoritmy I, složitost
A0B36PRI - PROGRAMOVÁNÍ Algoritmy I, složitost České vysoké učení technické Fakulta elektrotechnická v 1.01 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená??
Vícetype Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;
Vícerozměrné pole type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik; M[2,3] := 3145; - počet indexů není omezen (v praxi obvykle nejvýše tři) - více indexů pomalejší přístup k prvku (počítá
VíceSTROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta
STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach vlož do fronty kořen opakuj, dokud není fronta prázdná 1. vyber uzel z fronty a zpracuj jej 2. vlož do fronty levého následníka
VíceNáplň. v.0.03 16.02.2014. - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění
Náplň v.0.03 16.02.2014 - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění Spojení dvou samostatně setříděných polí void Spoj(double apole1[], int adelka1, double
VíceO datových typech a jejich kontrole
.. O datových typech a jejich kontrole Programovací techniky doc. Ing. Jiří Rybička, Dr. ústav informatiky PEF MENDELU v Brně rybicka@mendelu.cz Typová kontrola Programovací techniky O datových typech
VíceAlgoritmy a datové struktury
Algoritmy a datové struktury Stromy 1 / 32 Obsah přednášky Pole a seznamy Stromy Procházení stromů Binární stromy Procházení BS Binární vyhledávací stromy 2 / 32 Pole Hledání v poli metodou půlení intervalu
VíceZákladní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy
Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou
VíceVyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.
Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 12. září 2016 Jiří Dvorský (VŠB TUO) Vyhledávání 201 / 344 Osnova přednášky
VíceSada 1 - Základy programování
S třední škola stavební Jihlava Sada 1 - Základy programování 17. Řadící algoritmy Digitální učební materiál projektu: SŠS Jihlava šablony registrační číslo projektu:cz.1.09/1.5.00/34.0284 Šablona: III/2
VíceAlgoritmy na ohodnoceném grafu
Algoritmy na ohodnoceném grafu Dvě základní optimalizační úlohy: Jak najít nejkratší cestu mezi dvěma vrcholy? Dijkstrův algoritmus s t Jak najít minimální kostru grafu? Jarníkův a Kruskalův algoritmus
VíceAnotace. Pointery, dynamické proměnné
Anotace Třídění, Pointery, dynamické proměnné Radix- alias bucketsort Třídíme-li celá (přirozená) čísla, jejichž velikost je omezena, můžeme využít toho, že v desítkovém zápisu je na každé pozici jen jedna
VíceTGH05 - aplikace DFS, průchod do šířky
TGH05 - aplikace DFS, průchod do šířky Jan Březina Technical University of Liberec 31. března 2015 Grafová formulace CPM (critical path method) Orientovaný acyklický graf (DAG) je orientovaný graf neobsahující
VíceDatové struktury. alg12 1
Datové struktury Jedna z klasických knih o programování (autor prof. Wirth) má název Algorithms + Data structures = Programs Datová struktura je množina dat (prvků, složek, datových objektů), pro kterou
Více1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
VíceCílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti.
Seznamy a stromy Cílem kapitoly je seznámit studenta se seznamem a stromem. Jejich konstrukci, užití a základní vlastnosti. Klíčové pojmy: Seznam, spojový seznam, lineární seznam, strom, list, uzel. Úvod
VíceZdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.
1 3 4 5 6 7 8 9 10 11 1 13 14 15 16 17 18 19 0 1 3 4 5 6 7 8 9 30 31 3 Zdůvodněte, proč funkce f(n) = n log(n) 1 n 1/ roste rychleji než funkce g(n) = n. Zdůvodněte, proč funkce f(n) = n 3/ log(n) roste
VíceDatový typ prioritní fronta Semestrální práce z předmětu 36PT
Datový typ prioritní fronta Semestrální práce z předmětu 36PT Martin Tůma Cvičení 113, Út 18:00 22. května 2004 Specifikace problému Často potřebujeme přístup k informacím, tak aby tyto byly seřazeny podle
VíceKolekce, cyklus foreach
Kolekce, cyklus foreach Jen informativně Kolekce = seskupení prvků (objektů) Jednu již známe pole (Array) Kolekce v C# = třída, která implementuje IEnumerable (ICollection) Cyklus foreach ArrayList pro
VíceStromy. Příklady. Rekurzivní datové struktury. Základní pojmy
Základní pojmy Stromy doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Graf uzly hrany orientované / neorientované Souvislý
VícePředmět: Algoritmizace praktické aplikace
Předmět: Algoritmizace praktické aplikace Vytvořil: Roman Vostrý Zadání: Vytvoření funkcí na stromech (reprezentace stromu haldou). Zadané funkce: 1. Počet vrcholů 2. Počet listů 3. Součet 4. Hloubka 5.
VíceAbstraktní datové typy FRONTA
Abstraktní datové typy FRONTA Fronta je lineární datová struktura tzn., že ke každému prvku s výjimkou posledního náleží jeden následník a ke každému prvku s výjimkou prvního náleží jeden předchůdce. Do
VíceAnotace. Pointery. Martin Pergel,
Anotace Pointery K čemu jsou dynamické proměnné? K mnoha algoritmům bychom potřebovali pole proměnlivé délky nebo aspoň jinou datovou strukturu proměnlivé délky. Jak implementovat frontu a zásobník? Použijeme
VíceHomer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace:
Fronta Fronta je sekvence first-in-first-out (první do fronty první z fronty) prvků. Prvky mohou být vkládány pouze nakonec (rear) fronty a odstraňovány pouze zpočátku (front) fronty Délka fronty je počet
VíceAlgoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Třídění, vyhledávání Daniela Szturcová
VíceAlgoritmy II. Otázky k průběžnému testu znalostí
Algoritmy II Otázky k průběžnému testu znalostí Revize ze dne 19. února 2018 2 Lineární datové struktury 1 1. Vysvětlete co znamená, že zásobník představuje paměť typu LIFO. 2. Co je to vrchol zásobníku?
VíceDynamické datové struktury III.
Dynamické datové struktury III. Halda. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované
VíceÚvod do informatiky. Miroslav Kolařík
Úvod do informatiky přednáška desátá Miroslav Kolařík Zpracováno dle R. Bělohlávek, V. Vychodil: Diskrétní matematika 2, http://phoenix.inf.upol.cz/esf/ucebni/dm2.pdf P. Martinek: Základy teoretické informatiky,
VíceImplementace binárního stromu směrníky
Téma: Vypracoval: Zdeněk Alčer Implementace binárního stromu směrníky 1. Teorie stromu: Pojem strom je datová struktura, která je v teorii grafů formálně definována jako zvláštní případ grafu bez cyklů.
VíceTGH05 - aplikace DFS, průchod do šířky
TGH05 - aplikace DFS, průchod do šířky Jan Březina Technical University of Liberec 28. března 2017 Grafová formulace CPM (critical path method) Orientovaný acyklický graf (DAG) je orientovaný graf neobsahující
Více- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.
Základní symboly - písmena A B C Y Z a b c y z - číslice 0 1 2 9 - speciální symboly + - * / =., < > = a další - klíčová slova and array begin case const a další Klíčová slova jsou chráněnými útvary,
VíceB3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11
333LP - lgoritmy a programování - Zkouška z předmětu 333LP Jméno Příjmení Už. jméno Marek oháč bohacm11 Zkouškový test Otázka 1 Jaká je hodnota proměnné count po vykonání následujícího kódu: data=[4,4,5,5,6,6,6,7,7,7,7,8,8]
VíceZáklady algoritmizace a programování
Základy algoritmizace a programování Složitost algoritmů. Třídění Přednáška 8 16. listopadu 2009 Který algoritmus je "lepší"? Různé algoritmy, které řeší stejnou úlohu zbytek = p % i; zbytek = p - p/i*i;
Vícea) b) c) Radek Mařík
2012-03-20 Radek Mařík 1. Čísla ze zadané posloupnosti postupně vkládejte do prázdného binárního vyhledávacího stromu (BVS), který nevyvažujte. Jak bude vypadat takto vytvořený BVS? Poté postupně odstraňte
VíceALGORITMY A DATOVÉ STRUKTURY
Název tématického celku: Cíl: ALGORITMY A DATOVÉ STRUKTURY Metodický list č. 1 Časová složitost algoritmů Základním cílem tohoto tematického celku je vysvětlení potřebných pojmů a definic nutných k popisu
Více- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku
Znaky - standardní typ char var Z, W: char; - znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku - v TP (často i jinde) se používá kódová
Více