Protože pi každém volání funkce ff se zavolá funkce abc() práv jednou, je poet volání funkce abc() práv 7. Platí varianta d).

Rozměr: px
Začít zobrazení ze stránky:

Download "Protože pi každém volání funkce ff se zavolá funkce abc() práv jednou, je poet volání funkce abc() práv 7. Platí varianta d)."

Transkript

1 1. void ff(int x) { if (x > 0) ff(x 1) ; abc(x); if (x > 0) ff(x 1) ; Daná funkce ff je volána s parametrem 2: ff(2);. Funkce abc(x) je tedy celkem volána a) 1 krát b) 3 krát c) 5 krát d) 7 krát e) 8 krát Jedno volání funkce reprezentujeme uzlem ve stromu rekurzivního volání, hodnotou uzlu bude hodnota parametru funkce v daném volání. Protože pi každém volání funkce ff se zavolá funkce abc() práv jednou, je poet volání funkce abc() práv 7. Platí varianta d). 2. void ff(int x) { if (x >= 0) ff(x-2) ; abc(x); if (x >= 0) ff(x-2) ; Daná funkce ff je volána s parametrem 2: ff(2);. Funkce abc(x) je tedy celkem volána a) 1 krát b) 3 krát c) 5 krát d) 7 krát e) 8 krát Jedno volání funkce reprezentujeme uzlem ve stromu rekurzivního volání, hodnotou uzlu bude hodnota parametru funkce v daném volání. Protože pi každém volání funkce ff se zavolá funkce abc() práv jednou, je poet volání funkce abc() práv 7. Platí varianta d).

2 3. Funkce int ff(int x, int y) { if (x > 0) return ff(x-1,y)+y; return 0; a) sítá dv libovolná pirozená ísla b) násobí dv libovolná pirozená ísla c) násobí dv pirozená ísla, pokud je první nezáporné d) vrací nulu za všech okolností e) vrací nulu nebo y podle toho, zda x je kladné nebo ne (Zde došlo k peklepu, místo slova pirozená má být všude slovo celá, nicemén respondenti takto zamaskovanou správnou odpov pesto odhalili.) Pi každém návratu z funkce (krom prvního s nulou) je vrácena hodnota pedchozího volání zvtšená o hodnotu y, která se bhem jednotlivých volání nemní. Celkem je tedy vrácen vícenásobný souet hodnoty y, takže se jedná o násobení. Jediná podmínka ve funkci zárove také uruje, že násobení probhne pouze pi nezáporném prvním parametru, takže správná je varianta c). 4. Funkce int ff(int x, int y) { if (x > 0) return ff(x-1, y)-1; return y; a) pro kladná x vrací 0, jinak vrací y b) odete x od y, pokud x je nezáporné c) odete y od x, pokud x je nezáporné d) vrací y pro kladné x, jinak vrací y e) spote zbytek po celoíselném dlení y%x První návrat z volání funkce vrátí hodnotu y, která se bhem všech volání nemní. Každý další návrat odete od výsledku jedniku, poet vnoených volání je roven hodnot x. Tudíž výsledkem bude hodnota y x. Celé to nastane ovšem pouze tehdy, když poátení hodnota x bude nezáporná. Tomuto popisu vyhovuje práv varianta b). 5. Funkce int ff(int x, int y) { if (x < y) return ff(x+1,y); return x; a) bu hned vrátí první parametr nebo jen do nekonena volá sama sebe b) vrátí maximální hodnotu z obou parametr c) vrátí souet svých parametr

3 d) vrátí x+1 e) neprovede ani jednu z pedchozích možností Když je x vtším (nebo stejným) z obou parametr, jeho hodnota je vrácena ihned. V opaném pípad se v rekurzivním volání jeho hodnota zvtšuje tak dlouho, dokud nedosáhne hodnoty y tedy pvodn vtšího z obou parametr. Pi návratu z rekurze již k žádným zmnám nedochází, opt je tedy vrácena hodnota vtšího z obou parametr. Platí možnost b). 6. Funkce int ff(int x, int y) { if (y>0) return ff(x, y-1)+1; return x; a) sete x a y, je-li y nezáporné b) pro kladná y vrátí y, jinak vrátí x c) spote rozdíl x y, je-li y nezáporné d) spote rozdíl y x, je-li y nezáporné e) vrátí hodnotu svého vtšího parametru Pro y záporné nebo nulové vrátí fukce hodnotu x, Pro kladné y volá sama sebe. Poet volání je roven hodnot y (nebo tento parametr se pi každém volání o jedniku zmenší) a pi návratu z rekurze se návratová hodnota z vtšuje pkaždé o 1. Poet volání je y, nejvnitnjší volání vrátí hodnotu x, takže návrat z rekurze pite k x ješt hodnotu y. Správná odpov je a). 7. Pi volání rekurzivní funkce f(n) vznikne binární pravidelný ideáln vyvážený strom rekurzivního volání s hloubkou log 2 (n). Asymptotická složitost funkce f(n) je tedy a) Θ(log 2 (n)) b) Θ(n log 2 (n)) c) Ο(n) d) Ο(log 2 (n)) e) Ω(n) Celkem je známo, že hloubka vyváženého stromu s n uzly je zhruba log 2 (n). To je i pípad stromu z našeho zadání. Funkce f pi své rekurzivní innosti navštíví každý uzel tohoto stromu, takže vykoná alespo konst n operací. Možná, že má práce v každém uzlu (= pi každém svém volání) ješt více, takže celková doba její innosti je bu úmrná n, nebo je asymptoticky ješt vtší. Práv to je vyjádeno pátou možností e). Tetí možnost nepipouští, že by práce v každém jednom uzlu mohlo být mnoho, zbylé možnosti jsou vbec nesmysl, vata, vycpávka.

4 8. Pi volání rekurzivní funkce f(n) vznikne binární pravidelný ideáln vyvážený strom rekurzivního volání s hloubkou n. Asymptotická složitost funkce f(n) je tedy a) Θ(n) b) Ο(n) c) Θ(log 2 (n)) d) Ω(2 n ) e) Ο(n!) Když má dotyný strom nap. m uzl, jeho hloubka je úmrná log 2 (m). Tudíž, když má hloubku n, jeho poet uzl je úmrný 2 n. Symbolicky: n log 2 (m) 2 n m. Nevíme ovšem, co pi každém rekurzivním volání (= v uzlu stromu rekurze) funkce dlá, teba tam eší nco složitého, takže celkem její složitost mže být i vtší než Θ(2 n ). Jiná možnost než d) prost není, všechny ostatní jsou jsou pouhé koví bez jakéhokoli nároku (a úmyslu!) na podobnost s realitou. 9. Vypotte, kolik celkem asu zabere jedno zavolání funkce rekur(4); za pedpokladu, že provedení pikazu xyz(); trvá vždy jednu milisekundu a že dobu trvání všech ostatních akcí zanedbáme. void rekur(int x) { if (x < 1) return; rekur(x-1); xyz(); rekur(x-1); Strom rekurzivního volání funkce rekur je binární vyvážený strom. pi volání rekur(4) bude mít tento strom hloubku 5, uzly posledního (=nejhlubšího) patra však budou odpovídat pouze provedení ádku if (x < 1) return; a píkaz xyz() se tu neprovede. V každém uzlu stromu rekurzivního volání do hloubky 4 bude tedy jednou proveden píkaz xyz(). Poet tchto uzl je = 15. Stejnkrát bude proveden i píkaz xyz(). 10. Urete, jakou hodnotu vypíše program po vykonání píkazu print(rekur(4));, když rekurzivní funkce rekur() je definována takto: int rekur(int x) { if (x < 1) return 2; return (rekur(x-1)+rekur(x-1)); Nedokážete-li výsledek pímo zapsat jako pirozené íslo, staí jednoduchý výraz pro jeho výpoet.

5 Rekurzivní volání rekur(x-1)+rekur(x-1) mžeme zapsat jako 2*rekur(x-1) a potom máme: rekur(4) = 2*rekur(3) = 2*2*rekur(2) = 2*2*2*rekur(1) = = 2*2*2*2*rekur(0) = 2*2*2*2*2 = Obecný binární strom a) má vždy více list než vnitních uzl b) má vždy více list než vnitních uzl, jen pokud je pravidelný c) má vždy mén list než vnitních uzl d) mže mít více koen e) mže mít mnoho list a žádné vnitní uzly Má-li strom alespo dva uzly, má i koen, který je v takovém pípad vnitním uzlem. Když má strom jen jeden uzel, je to koen, a i kdybychom jej deklarovali jako list, byl by to list jediný, což lze jen tžko oznait jako mnoho list, takže možnst e) nepichází v úvahu. Možnost d) je zejmý nesmysl. Obecný binární strom mže mít jen list jediný a mnoho vnitních uzl (= jedna holá vtev ), odpadá možnost a). Vyvážený strom se temi uzly vyvrací možnost c), takže zbývá jediná korektní možnost b). V pravidelném binárním stromu (s alespo 3 uzly) platí, že poet list je o 1 vtší než poet vnitních uzl. 12. Binární strom má n uzl. Šíka jednoho patra (tj. poet uzl se stejnou hloubkou) je tedy a) nejvýše log(n) b) nejvýše n/2 c) alespo log(n) d) alespo n/2 e) nejvýše n Binární strom nemusí být nutn pravidelný, mže to být jen jediná dlouhá vtev, takže nejmenší možná šíe je 1, možnost tetí a tvrtá odpadají. Co nejširší patro odpovídá stromu co nejvíce do šíky roztaženému, na což se zdá být ideáln vyvážený pravidelný strom alespo kandidátem. V nm je nejspodnjší patro list. Pi n uzlech ve stromu je v onom pate (n+1)/2 uzl, možnost první a druhá odpadají také. 13. Daný binární strom má ti listy. Tudíž a) má nejvýše dva vnitní uzly b) poet vnitních uzl není omezen

6 c) všechny listy mají stejnou hloubku d) všechny listy nemohou mít stejnou hloubku e) strom je pravidelný Binární strom nemusí být nutn pravidelný, mže mít dlouhatánské lineární nevtvící se vtve (nevtvící se vtve, hmm...) s jediným uzlem na konci. Staí tady ti takové vtve (jedan doprava z koene a dv z jeho levého potomka) a jejich délka mže být zcela libovolná. Takový strom není pravidelný (ne paté možnosti), jeho ti listy mohou a nemusí ležet stejn hluboko (ne tetí a tvrté možnosti) a zbytek již byl een. 14. Binární strom má hloubku 2 (hloubka koene je 0). Poet list je a) minimáln 0 a maximáln 2 b) minimáln 1 a maximáln 3 c) minimáln 1 a maximáln 4 d) minimáln 2 a maximáln 4 Minimální a maximální poet list je vyznaen na obrázku s naznaenými hloubkami, platí varianta c). 15. Binární strom má 2 vnitní uzly. Má tedy e) minimáln 0 a maximáln 2 listy f) minimáln 1 a maximáln 3 listy g) minimáln 1 a maximáln 4 listy h) minimáln 2 a maximáln 4 listy Minimální a maximální poet list je vyznaen na obrázku, platí varianta b). 16. Algoritmus A provádí prchod v poadí inorder binárním vyváženým stromem s n uzly a v každém uzlu provádí navíc další (nám neznámou) akci, jejíž složitost je Θ(n 2 ). Celková asymptotická složitost algoritmu A je tedy a) Θ(n) b) Θ(n 2 ) c) Θ(n 3 ) d) Θ(n 2 +log 2 (n)) e) Θ(n 2 log 2 (n))

7 Pi prchodu stromem v poadí pre/in/postorder má režie na píchod a odchod do/z uzlu složitost úmrnou konstant. V každém uzlu jichž je n se navíc podle zadání provedou operace, jejichž poet je úmrný n 2. Celkem je tedy na zpracování úkolu zapotebí as úmrný výrazu n (konstanta + n 2 ) = n konstanta + n 3 Θ(n 3 ). Platí varianta c). 17. Algoritmus A provede jeden prchod binárním stromem s hloubkou n. Pi zpracování celého k-tého patra (=všech uzl s hloubkou k) provede k+n operací. Operaní (=asymptotická) složitost algoritmu A je tedy a) Θ(k+n) b) Θ( (k+n) n ) c) Θ(k 2 +n) d) Θ(n 2 ) e) Θ(n 3 ) Celkem je provedený poet operací pi zpracování všech uzl roven (1+n) + (2+n) + (3+n) (n+n) = n ((1+n) + (n+n))/2 = n (1+3n)/2 = 3n 2 /2 +n/2 Θ(n 2 ) Povážíme-li navíc ješt režii na pesun od jednoho patra stromu k následujícímu patru, která mže mít složitost nanejvýš Θ(n), pipošteme k výsledku ješt len Θ(konst n n), který ovšem na složitosti Θ(n 2 ) nic nemní. Platí varianta d). 18. Obsah uzl daného stromu vypíšeme v poadí postorder. Vznikne posloupnost a) G F E D C B A b) F C G D B E A c) G C F A E B D d) D E B F G C A Pímo z definice poadí postorder plyne, že je nutno volit odpov d). 19. Obsah uzl daného stromu vypíšeme v poadí preorder. Vznikne posloupnost a) A B C D E F G H b) D B E A F C G c) A B D E C F G d) D E F G B C A

8 Pímo z definice poadí postorder plyne, že je nutno volit odpov c). 20. Výpis prvk binárního stromu v poadí postorder provede následující: a) vypíše prvky v opaném poadí, než v jakém byly do stromu vloženy b) pro každý podstrom vypíše nejprve koen, pak obsah jeho levého a pak pravého podstromu c) pro každý podstrom vypíše nejprve obsah levého podstromu koene, pak obsah pravého podstromu a pak koen d) pro každý podstrom vypíše nejprve obsah pravého podstromu koene, pak obsah levého podstromu a pak koen e) vypíše prvky stromu v uspoádání zprava doleva Definice praví, že se jedná o variantu c). 21. Výpis prvk binárního stromu v poadí preorder provede následující: a) vypíše prvky stromu ve stejném poadí, v jakém byly do stromu vloženy b) vypíše prvky stromu v uspoádání zleva doprava c) pro každý podstrom vypíše nejprve koen, pak obsah jeho levého a pak pravého podstromu d) pro každý podstrom vypíše nejprve obsah levého podstromu koene, pak obsah pravého podstromu a pak koen e) vypíše prvky stromu seazené vzestupn podle velikosti Definice praví, že se jedná o variantu c). 22. Navrhnte algoritmus, který spojí dva BVS: A a B. Spojení probhne tak, že všechny uzly z B budou pesunuty do A na patiné místo, piemž se nebudou vytváet žádné nové uzly ani se nebudou žádné uzly mazat. Pesun probhne jen manipulací s ukazateli. Pedpokládejte, že v každém uzlu v A i v B je k dispozici ukazatel na rodiovský uzel. Budeme procházet stromem B a ukazatel na každý uzel X, který najdeme, pedáme funkci movetoa(node RootA, node X). Volání funkce movetoa(roota, X) udlá následující: -- najde místo ve stromu A pro uzel X (stejn jako to dlá std. operace Insert), tj. najde v A uzel R, který bude rodiem X v A. -- pesune uzel X ze stromu B do stromu A pod uzel R pouze manipulací s ukazateli. Pesunutím uzlu X z B do A ovšem ztratí strom B veškerou referenci na tento uzel a tím také na jeho pípadné potomky v B. Aby tedy nedošlo ke ztrát informace, musíme uzel X vybírat vždy tak, aby sám neml žádné potomky. To lze naštstí zajistit snadno, protože procházení stromu v poadí postorder má práv tu vlastnost, že zpracovává strom poínaje listy. Zpracování list v naší úloze ale znamená odstranní list. Máme tedy poadím postorder zarueno (malujte si obrázek!),

9 že kdykoli pi procházení stromu B v tomto poadí zaneme zpracovávat uzel, nebude mít již tento uzel žádné potomky. Celý algoritmus pak vypadá napíklad takto: void presunvse(node roota, node nodeb) { // nodeb je aktuální uzel v B // presunvse má vlastnosti procházení postorder: if (nodeb == NULL) return; presunvse(roota, nodeb.left); presunvse(roota, nodeb.right); movetoa(roota, nodeb); node movetoa(node roota, node X); { /* 1. najdi místo ve stromu A pro klí uzel s hodnotou klíe rootb.key stejn jako v operaci Insert. Rodiem nového uzlu a je uzel R. 2. prove pesun uzlu X z B do A: */ // pidej X do A if (R.key < X.key) R.right = X; else R.left = X. // vyjmi X z B if (X.rodic.left == X) X.rodic.left = NULL; else X.rodic.right = NULL; // a nastav správn rodie X X.parent = R; Uvedené ešení nepoítá s možností, že by strom A byl na zaátku prázdný, vhodné doplnní algoritmu ponechávám zájemcm jako jednoduché cviení. 23. Projdte binárním stromem a vypište obsah jeho uzl v poadí preorder bez použití rekurze, zato s využitím vlastního zásobníku. Poadí preorder znamená, že nejprve zpracujeme aktuální uzel a potom jeho levý a pravý podstrom. Budeme tedy v cyklu zpracovávat vždy aktuální vrchol, referenci na njž vždy odebereme z vrcholu zásobníku (-- odkud jinud také!) a hned poté si do zásobníku uložíme informaci o tom, co je ješt teba zpracovat, tedy ukazatele na levého a pravého potomka aktuálního uzlu. Celý základní cyklus tedy bude vypadat takto:

10 while (stack.empty == false) { currnode = stack.pop(); print(currnode.key); if (currnode.left!= null) stack.push(currnode.right); if (currnode.right!= null) stack.push(currnode.left); Pedtím, než tento cyklus spustíme, musíme ovšem inicializovat zásobník a a vložit do nj koen stromu: If (koenstromu == null) return; stack.init(); stack.push(koen.stromu); základní cyklus uvedený výše; To je celé, vstupem algoritmu je ukazatel na koen stromu, výstupem hledaná posloupnost, pro zásobník je nutno pro jistotu alokovat tolik místa, kolik mže nejvíc mít strom uzl. 24. Aritmetický výraz obsahující celá ísla, závorky a operace +,,*,/ (celoíselné dlení) mže být reprezentován jako pravidelný binární strom. Popište, jak takový strom obecn vypadá, navrhnte implementaci uzlu a napište funkci, jejímž vstupem bude ukazatel na koen stromu a výstupem hodnota odpovídajícího aritmetického výrazu. (Body = 1 popis + 1 uzel + 3 funkce) Vnitní uzly stromu budou pedstavovat operace, listy pak jednotlivá ísla. Napíklad výraz 6+(4-3+5)*(9-7) lze reprezentovat následujícím stromem: (Obrázek je bitmapa, nejprve olíznutá z obrazovky s powerpointem, v nmž byl obrázek vytvoen, pak upravena v paintshopu a posleze vložená do wordu jako rastrový obrázek. Produkty firmy mikro**t si totiž neumí mezi sebou navzájem pedávat svou vektorovou grafiku, hm ) Hodnotou každého listu je íslo v listu uložené, hodnotou vnitního uzlu je <hodnota levého podstromu> <operace v uzlu zapsaná> <hodnota pravého podstromu>.

11 Hodnota koene pak pedstavuje hodnotu celého výrazu. Na dalším obrázku jsou hodnoty u jednotlivých uzl pipsány: V implementaci uzlu tedy poebujeme -- typ - složka, která udává, zda jde o vnitní uzel nebo list -- op - složka udávající operaci (nap. znak) -- val - složka pro íslo, je-li uzel listem, jinak hodnota uzlu -- left a right potomci uzlu (též je možno první složku vypustit a indikovat nap. prázdným znakem ve druhé složce, že jde o list, apod ) Celá vyhodnocovací funkce (pedpokládající, že strom je neprázdný) pak mže vypadat takto: int hodnota(node n) { if (n.typ == list) return n.val; switch (n.typ) { case + : return (hodnota(n.left) + hodnota(n.right)); break; case - : return (hodnota(n.left) - hodnota(n.right)); break; case * : return (hodnota(n.left) * hodnota(n.right)); break; case / : return (hodnota(n.left) / hodnota(n.right)); break; (mimochodem, tím že kompilátor zajistí, že se ve výrazu hodnota(n.left) + hodnota(n.right) a dalších nejprve spotou hodnoty funkcí a pak teprve se provede sítání (odítání,.. atd.), zajistí vlastn také prchod oním stromem v poadí postorder...) 25. Deklarujte uzel binárního stromu, který bude obsahovat celoíselné složky výška a hloubka. Ve složce hloubka bude uložena hloubka daného uzlu ve stromu, ve složce výška jeho výška. Výška uzlu X je definována jako vzdálenost od jeho nejvzdálenjšího potomka (= poet hran mezi uzlem X a jeho nejvzdálenjším potomkem). Napište funkci, která každému uzlu ve stromu piadí korektn hodnotu jeho hloubky a výšky

12 Pi poítaní hloubky staí každému potomku uzlu X piadit o 1 vtší hloubku než má uzel X. Sama rekurzivní procedura mluví za dlouhé výklady: void sethloubka(node x, int depth) { if (x == null) return; x.hloubka = depth; sethloubka(x.left, depth+1); sethloubka(x.right,depth+1); Piazení hloubky každému uzlu ve stromu pak provedeme píkazem sethloubka(ourtree.root, 0); Všimnte si, že hloubky se uzlm piazují celkem logicky v poadí preorder. Pi piazování výšky uzlu X musíme naopak znát výšku jeho potomk, takže se nabízí zpracování v poadí postorder: void setvyska(node x) { int vyskal = -1; // nejprve pripad, ze uzel nema L potomky. int vyskar = -1; // dtto if (x.left!= null) { setvyska(x.left); vyskal = x.left.vyska; if (x.right!= null) { setvyska(x.right); vyskar = x.right.vyska; x.vyska = max(vyskal, vyskar) + 1; Piazení výšky každému uzlu ve stromu pak provedeme píkazem if (ourtree.root!= null) setvyska(ourtree.root); Celý proces s výškou lze zachytit ješt úspornji: int setvyska(node x) { if (x == null) return -1; x.vyska = 1+ max(setvyska(x.left), setvyska(x.right)); return x.vyska; Piazení výšky každému uzlu ve stromu pak provedeme nap. píkazem zbytecnaprom = setvyska(ourtee.root); 26. Uzel binárního binárního vyhledávacího stromu obsahuje ti složky: Klí a ukazatele na pravého a levého potomka. Navrhnte rekurzívní funkci (vracející bool), která porovná, zda má dvojice strom stejnou strukturu. Dva stromy považujeme za strukturn stejné, pokud se dají nakreslit tak, že po položení na sebe pozorovateli splývají.

13 Z uvedeného popisu by ml být zejmý následující rekurzvní vztah: Dva binární stromy (ani nemusí být vyhledávací) A a B jsou strukturn stejné, pokud a) jsou bu oba prázdné b) levý podstrom koene A je strukturn stejný jako levý podstrom koene B a zárove také pravý podstrom koene A je strukturn stejný jako pravý podstrom koene B. Toto zjištní již snadno pepíšeme do programovacího jazyka (zde jen pseudokódu): boolean stejnastruktura(node root1, node root2) { if ((root1 == null) && (root2 == null)) return true; if ((root1 == null) (root2 == null)) return false; return (stejnastruktura(root1.left, root2.left) && stejnastruktura(root1.right, root2.right)); 27. Napište funkci, která vytvoí kopii obecného koenového stromu. Ten je reprezentován takto: Uzel X stromu obsahuje dv složky: hodnota a potomci. Složka potomci je ukazatel na zetzený seznam obsahující jednotlivé ukazatele na potomky uzlu X. Nemá-li uzel X žádné potomky, složka potomci ukazuje na null. Každý prvek seznamu potomk obsahuje jen ukazatel na potomka X a ukazatel na další prvek v seznamu potomk. Strom je obecný, potomci libovolného uzlu nejsou nijak uspoádáni podle svých hodnot. Uzel X: hodnota Hodnota potomci Seznam potomk X: Potomci uzlu X: Jen tak cvin si naped eknme, jak by probíhalo kopírování binárního stromu. Nejprve bychom vytvoili kopii koene, potom kopii levého a pravého podstromu koene a pak bychom tyto kopie podstrom pipojili ke kopii koene. Kopie podstrom bychom ovšem vyrobili stejnou rekurzivní procedurou. Zachyceno pseudokódem: node kopiebinstromu (node root) { if (root == null) return null; new root2 = kopieuzlu(root);

14 root2.left = kopiebinstromu(root.left); root2.right = kopiebinstromu(root.right); return root2; V pípad obecného koenového stromu je situace zcela obdobná. Jediný rozdíl je v tom, že nemáme v uzlu pevnou strukturu pro levého a pravého následníka ale jen ukazatel na seznam obsahující ukazatele na potomky. A jeho struktura uzlu nap. takováto { int hodnota; seznampotomku potomci; A struktura prvku seznamu ukazatel na potomky: { seznampotomku next; node potomek Zachyceno pseudokódem: node kopiebinstromu (node root) { if (root == null) return null; new rootkopie = kopieuzlu(root); // kopírujme pouze uzel, // nikoli seznam ukazatel na potomky // pipravme si seznam zkopírovaných potomk, // který nakonec pipojíme k root2 seznampotomku potomcirootkopie = null; seznampotomku potomciroot = root.potomci while (potomciroot!= null) { node kopiepodstromu = kopiebinstromu(potomciroot.potomek); // rekurze seznampotomku kopieukazatele = new(seznampotomku); kopieukazatele.potomek = kopiepodstromu; zaradnakonecseznamu(potomcirootkopie, kopieukazatele); potomciroot = potomciroot.next; // te seznam ukazatel na zkopírované podstromy pipojíme k rootkopie rootkopie.potomci = potomcirootkopie; return root2; // je hotovo 28. Uzel binárního vyhledávacího stromu obsahuje tyi složky: Klí, celoíselnou hodnotu count a ukazatele na pravého a levého potomka. Navrhnte nerekurzívní proceduru, která naplní zadané pole hist[0,maxint] potem výskyt hodnot v promnné count (histogram hodnot uložených v count).

15 Není v zásad zapotebí nic jiného, než projít stromem a v každém uzlu provést operaci: hist[aktuzel.count]++; Prchod stromem zvolíme v poadí preorder, protože to se nejsnáze implementuje nerekurzivn. Na zásobník staí po zpracování aktuálního uzlu ukládat pouze pravého a levého potomka (pokud existují). Celý pseudokód by pak mohl vypadat asi takto: void histogram(node root, int [ ] hist) { NaplnPoleNulami(hist); if (root == null) return; stack.init; stack.push(root); while (stack.empty() == false) { aktuzel = stack.pop(); hist[aktuzel.count]++; if (aktuzel.right!= null) stack.push(aktuzel.right); if (aktuzel.left!= null) stack.push(aktuzel.left); 29. Je dána struktura popisující uzel binárního vyhledávacího stromu takto Struct node { valtype val; node * left, right; int count; navrhnte nerekurzívní proceduru, která do promnné count v každém uzlu zapíše poet vnitních uzl v podstromu, jehož koenem je tento uzel (vetn tohoto uzlu, pokud sám není listem). Musíme volit prchod v poadí postorder, protože poet vnitních uzl v daném stromu zjistíme tak, že seteme poet vnitních uzl v levém podstromu a pravém podstromu koene a nakonec piteme jedniku za samotný koen. Nepotebujeme tedy nic jiného než procházet stromem a ped definitivním opuštním uzlu seíst poet vnitních uzl v jeho levém a pravém podstromu, pokud existují. Pokud neexistuje ani jeden, pak je uzel listem a registrujeme v nm nulu. Na zásobník budeme s každým uzlem, který ješt budeme zpracovávat, ukládat také poet návštv, které jsme již v nm vykonali. Po tetí návštve již uzel ze zásobníku definitivn vyjmeme v implementaci to znamená, že již jej zpt do zásobníku nevložíme. void pocetvnitruzlu(node root) { if root == null return stack.init(); stack.push(root, 0); while (stack.empty() == false) { (aktuzel, navstev) = stack.pop(); // pokud je uzel listem:

16 if (aktuzel.left == null) && (aktuzel.right == null)) aktuzel.count = 0; // pokud uzel neni listem: else { if(navstev == 0) { stack.push(aktuzel, 1); // uz jsme v akt uzlu byli jednou if (aktuzel.left!= null) stack.push(aktuzel.left, 0); if(navstev == 1) { stack.push(aktuzel, 2); // uz jsme v akt uzlu byli dvakrat if (aktuzel.right!= null) stack.push(aktuzel.right, 0); if(navstev == 2) { // ted jsme v akt uzlu potreti aktuzel.count = 1; // akt uzel je vnitrnim uzlem stromu if (aktuzel.left!= null) aktuzel.count += aktuzel.left.count; if (aktuzel.right!= null) aktuzel.count += aktuzel.right.count; // end of while 30. Je dána struktura popisující uzel binárního vyhledávacího stromu takto Struct node { valtype val; node * left, right; int count; navrhnte nerekurzívní proceduru, která do promnné count v každém uzlu zapíše poet list v podstromu, jehož koenem je tento uzel (vetn tohoto uzlu, je-li sám listem). Musíme volit prchod v poadí postorder, protože poet list v daném stromu zjistíme tak, že seteme poet list v levém podstromu a pravém podstromu koene. Nepotebujeme tedy nic jiného než procházet stromem a ped definitivním opuštním uzlu seíst poet list v jeho levém a pravém podstromu, pokud existují. Pokud neexistuje ani jeden, pak je uzel listem a registrujeme v nm jedniku. Na zásobník budeme s každým uzlem, který ješt budeme zpracovávat, ukládat také poet návštv, které jsme již v nm vykonali. Po tetí návštve již uzel ze zásobníku definitivn vyjmeme v implementaci to znamená, že již jej zpt do zásobníku nevložíme. void pocetlistu(node root) { if root == null return stack.init();

17 stack.push(root, 0); while (stack.empty() == false) { (aktuzel, navstev) = stack.pop(); // pokud je uzel listem: if (aktuzel.left == null) && (aktuzel.right == null)) aktuzel.count = 1; // pokud uzel neni listem: else { if(navstev == 0) { stack.push(aktuzel, 1); // uz jsme v akt uzlu byli jednou if (aktuzel.left!= null) stack.push(aktuzel.left, 0); if(navstev == 1) { stack.push(aktuzel, 2); // uz jsme v akt uzlu byli dvakrat if (aktuzel.right!= null) stack.push(aktuzel.right, 0); if(navstev == 2) { // ted jsme v akt uzlu potreti aktuzel.count = 0; if (aktuzel.left!= null) aktuzel.count += aktuzel.left.count; if (aktuzel.right!= null) aktuzel.count += aktuzel.right.count; // end of while 31. Napište rekurzívn a nerekurzívn funkci, která projde n-ární strom (každý uzel mže mít až n podstrom. Odkazy na podstromy jsou uloženy v každém uzlu v poli délky n). Datová struktura uzlu (1 bod). Rekurzívní verze (2b), nerekurzívní (3b.) uzel obsahuje dv složky { /*napr.*/ int value; potomci [n]; // rekurzivne ve variante "preorder": void projdi(node root) { if (root == null) return; nejakaakce(root); // tady by se provedla patricna akce for (i = 0; i < n; i++) projdi(potomci[i]); // nerekurzivne

18 // pouzijeme opet postup "preorder" protoze se pri nem nemusime na zasobnik // ukladat zadne dodatecne informace o navstevach uzlu void projdinonrec(node root) { if (root== null) return; stack.init(); stack.push(root); while (stack.empty() == false) { aktuzel = stack.pop(); // aktualni uzel definitivne ze zasbniku mizi nejakaakce(aktuzel); // tady by se provedla patricna akce // na zasobnik se ulozi potomci for (i = 0; i < n; i++) stack.push(aktuzel.potomci[i]);

BINARY SEARCH TREE

BINARY SEARCH TREE ---------------------------------------- BINARY SEARCH TREE --------------------------------------------------- Je dán BVS s n uzly. Máme za úkol spočítat hodnotu součtu všech klíčů v tomto stromě. Když

Více

BINARY SEARCH TREE

BINARY SEARCH TREE Níže uvedené úlohy představují přehled otázek, které se vyskytly v tomto nebo v minulých semestrech ve cvičení nebo v minulých semestrech u zkoušky. Mezi otázkami semestrovými a zkouškovými není žádný

Více

RECURSION

RECURSION Níže uvedené úlohy představují přehled otázek, které se vyskytly v tomto nebo v minulých semestrech ve cvičení nebo v minulých semestrech u zkoušky. Mezi otázkami semestrovými a zkouškovými není žádný

Více

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK) ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK) Strom / tree uzel, vrchol / node, vertex hrana / edge vnitřní uzel

Více

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

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 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íce

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK) ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK) Strom / tree uzel, vrchol / node, vertex hrana / edge vnitřní uzel

Více

a) b) c) Radek Mařík

a) 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íce

STACK

STACK Níže uvedené úlohy představují přehled otázek, které se vyskytly v tomto nebo v minulých semestrech ve cvičení nebo v minulých semestrech u zkoušky. Mezi otázkami semestrovými a zkouškovými není žádný

Více

STACK

STACK Níže uvedené úlohy představují přehled otázek, které se vyskytly v tomto nebo v minulých semestrech ve cvičení nebo v minulých semestrech u zkoušky. Mezi otázkami semestrovými a zkouškovými není žádný

Více

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol. Stromy Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol., 2018, B6B36DSA 01/2018, Lekce 9 https://cw.fel.cvut.cz/wiki/courses/b6b36dsa/start

Více

Algoritmy a datové struktury

Algoritmy 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íce

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

5 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íce

Rzné algoritmy mají rznou složitost

Rzné algoritmy mají rznou složitost X36DSA 25 / 3 DSA Rzné algoritmy mají rznou složitost X36DSA 25 2 / 3 DSA The complexity of different algorithms varies X36DSA 25 3 / 3 Abeceda Jazyk Abeceda konená (neprázdná) množina symbol A mohutnost

Více

Jméno:... St. Sk.:. Cvičící:.. Bodů ze cv.: (Tučná čísla indikují počet neuspěvších (z 50) v jednotlivých otázkách) 1.

Jméno:... St. Sk.:. Cvičící:.. Bodů ze cv.: (Tučná čísla indikují počet neuspěvších (z 50) v jednotlivých otázkách) 1. Jméno:... St. Sk.:. Cvičící:.. Bodů ze cv.: (Tučná čísla indikují počet neuspěvších (z 50) v jednotlivých otázkách) 1. 36 Heap sort a) není stabilní, protože halda (=heap) není stabilní datová struktura

Více

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Vyvažování a rotace v BVS, všude se předpokládá AVL strom Vyvažování a rotace v BVS, všude se předpokládá AVL strom 1. Jednoduchá levá rotace v uzlu u má operační složitost a) závislou na výšce levého podstromu uzlu u b) mezi O(1) a Θ(n) c) závislou na hloubce

Více

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

Zá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íce

Cykly Intermezzo. FOR cyklus

Cykly Intermezzo. FOR cyklus Cykly Intermezzo Rozhodl jsem se zaadit do série nkolika lánk o základech programování v Delphi/Pascalu malou vsuvku, která nám pomže pochopit principy a zásady pi používání tzv. cykl. Mnoho ástí i jednoduchých

Více

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy Volné stromy Úvod do programování Souvislý, acyklický, neorientovaný graf nazýváme volným stromem (free tree). Často vynecháváme adjektivum volný, a říkáme jen, že daný graf je strom. Michal Krátký 1,Jiří

Více

Stromy, haldy, prioritní fronty

Stromy, 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íce

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Stromy. 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íce

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39 Základy algoritmizace Michal Krátký 1, Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Základy algoritmizace, 2006/2007 Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Více

1. Signatura datového typu

1. Signatura datového typu 1. Signatura datového typu a) popisuje vlastnosti operací datového typu b) popisuje sémantiku datového typu c) popisuje jména druh a operací a druhy argument a výsledku d) je grafickým vyjádením implementace

Více

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 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íce

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.

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. 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íce

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í 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íce

R zné algoritmy mají r znou složitost

R zné algoritmy mají r znou složitost / / zné algoritmy mají r znou složitost Dynamické programování / / Definice funkce Otázka Program f(x,y) = (x = ) (y = ) f(x, y-) + f(x-,y) (x > ) && (y > ) f(,) =? int f(int x, int y) { if ( (x == ) (y

Více

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT binární vyhledávání a bst Karel Horák, Petr Ryšavý 23. března 2016 Katedra počítačů, FEL, ČVUT Příklad 1 Naimplementujte binární vyhledávání. Upravte metodu BinarySearch::binarySearch. 1 Příklad 2 Mysĺım

Více

Rekurzivní algoritmy

Rekurzivní 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íce

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1 Rekurze a zásobník Jak se vypočítá rekurzivní program? volání metody vyšší adresy ret1 main(){... fa(); //push ret1... PC ret2 void fa(){... fb(); //push ret2... return //pop void fb(){... return //pop

Více

Programování v C++ 1, 16. cvičení

Programování v C++ 1, 16. cvičení Programování v C++ 1, 16. cvičení binární vyhledávací strom 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí minule procvičené

Více

1 Píklady popisu typických konstrukcí

1 Píklady popisu typických konstrukcí 1 Píklady popisu typických konstrukcí V tomto odstavci se pokusíme ilustrovat denotaní popis sémantiky ve funkcionálním modelu pro typické píklady jazykových konstrukcí. Popisované konstrukce budou fragmenty

Více

Doba běhu daného algoritmu/programu. 1. Který fragment programu z následujících dvou proběhne rychleji?

Doba běhu daného algoritmu/programu. 1. Který fragment programu z následujících dvou proběhne rychleji? 1 Doba běhu daného algoritmu/programu 1. Který fragment programu z následujících dvou proběhne rychleji? int n = 100; int sum = 0; for (i = 0; i < n; i++) for (j = 0; j < i; j++) sum += i+j; int n = 75;

Více

Implementace LL(1) překladů

Implementace 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íce

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615) IB108 Sada 1, Příklad 1 ( ) Složitost třídícího algoritmu 1/-Sort je v O n log O (n.71 ). Necht n = j i (velikost pole, které je vstupním parametrem funkce 1/-Sort). Lehce spočítáme, že velikost pole předávaná

Více

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

Stromy. 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íce

Dynamické datové struktury IV.

Dynamické datové struktury IV. Dynamické datové struktury IV. Prioritní fronta. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra

Více

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

DobSort. Ú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íce

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky 25 Pole Datová struktura kolekce elementů (hodnot či proměnných), identifikovaných jedním nebo více indexy, ze kterých

Více

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right) Indukcí dokažte následující výrok: pokud lef t a right jsou parametry funkce f a platí left right, pak volání f(array, left, right) vrátí minimální hodnotu z hodnot všech prvků v poli array na indexech

Více

Zdů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.

Zdů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íce

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10

1. 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íce

Dynamické programování. Optimální binární vyhledávací strom

Dynamické programování. Optimální binární vyhledávací strom The complexity of different algorithms varies: O(n), Ω(n ), Θ(n log (n)), Dynamické programování Optimální binární vyhledávací strom Různé algoritmy mají různou složitost: O(n), Ω(n ), Θ(n log (n)), The

Více

Dynamické datové struktury III.

Dynamické 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

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky LG 04 Zásobník Fronta Operace nqueue, equeue, Front, mpty... yklická implementace fronty Průchod stromem do šířky Grafy průchod grafem do šířky průchod grafem do hloubky Ořezávání a heuristiky 1 Zásobník

Více

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

B3B33ALP - 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íce

Každý datový objekt Pythonu má minimáln ti vlastnosti. Identitu, datový typ a hodnotu.

Každý datový objekt Pythonu má minimáln ti vlastnosti. Identitu, datový typ a hodnotu. Datový objekt [citováno z http://wraith.iglu.cz/python/index.php] Každý datový objekt Pythonu má minimáln ti vlastnosti. Identitu, datový typ a hodnotu. Identita Identita datového objektu je jedinený a

Více

Datový typ POLE. Jednorozmrné pole - vektor

Datový typ POLE. Jednorozmrné pole - vektor Datový typ POLE Vodítkem pro tento kurz Delphi zabývající se pedevším konzolovými aplikacemi a základy programování pro mne byl semestr na vysoké škole. Studenti nyní pipravují semestrální práce pedevším

Více

Algoritmy I, složitost

Algoritmy 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íce

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11 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] count=0 for i in range(1,len(data)):

Více

MIDTERM D. Příjmení a jméno:

MIDTERM D. Příjmení a jméno: MIDTERM D Příjmení a jméno: 1 2 3 4 5 6 7 8 9 10 11 12 1 Doplňte místo otazníku ten ze symbolů, aby platil vztah (log n) / (log n 2 ) =?(1/ n): A) o B) O (a současně nelze použít ani o ani Θ) C) Θ D) Ω

Více

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

Lineá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íce

Vzdálenost uzlů v neorientovaném grafu

Vzdá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íce

Vyhledá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. 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íce

Stromy. Jan Kybic.

Stromy. Jan Kybic. Stromy Jan Kybic http://cmp.felk.cvut.cz/~kybic kybic@fel.cvut.cz 2016 1 / 44 Stromy Binární vyhledávací stromy Množiny a mapy 2 / 44 Strom (Tree) Strom skládá se s uzlů (nodes) spojených hranami (edges).

Více

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

STROMOVE 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íce

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

bfs, dfs, fronta, zásobník, prioritní fronta, halda bfs, dfs, fronta, zásobník, prioritní fronta, halda Petr Ryšavý 20. září 2016 Katedra počítačů, FEL, ČVUT prohledávání grafů Proč prohledávání grafů Zkontrolovat, zda je sít spojitá. Hledání nejkratší

Více

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Zá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íce

R O V N O B Ž N Í K (2 HODINY)

R O V N O B Ž N Í K (2 HODINY) R O V N O B Ž N Í K (2 HODINY)? Co to vlastn rovnobžník je? Na obrázku je dopravní znaka, která íká, že vzdálenost k železninímu pejezdu je 1 m (dva pruhy, jeden pruh pedstavuje vzdálenost 80 m): Pozorn

Více

TGH07 - Chytré stromové datové struktury

TGH07 - Chytré stromové datové struktury TGH07 - Chytré stromové datové struktury Jan Březina Technical University of Liberec 1. dubna 2014 Prioritní fronta Datová struktura s operacemi: Odeber Minum (AccessMin, DeleteMin) - vrat prvek s minimálním

Více

Zpráva k semestrální práci z pedmtu 36PT programovací techniky

Zpráva k semestrální práci z pedmtu 36PT programovací techniky Zpráva k semestrální práci z pedmtu 36PT programovací techniky Implementace algoritmu: Dvojrozmrný intervalový strom jméno a píjmení: Michal Trs studijní skupina: 12 roník: 2 cviení: pátek 7:30 1. Specifikace

Více

Binární vyhledávací stromy II

Binární vyhledávací stromy II Binární vyhledávací stromy II doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 19. března 2019 Jiří Dvorský (VŠB TUO) Binární vyhledávací

Více

Dynamické datové struktury II.

Dynamické datové struktury II. Dynamické datové struktury II. Stromy. Binární vyhledávací strom. DFS. BFS. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz

Více

Promnné. [citováno z

Promnné. [citováno z Promnné [citováno z http://wraith.iglu.cz/python/index.php] Abychom s datovým objektem mohli v programu njak rozumn pracovat, potebujeme se na nj njakým zpsobem odkázat. Potebujeme Pythonu íct, aby napíklad

Více

Programování v C++, 2. cvičení

Programová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íce

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

bfs, 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íce

Konstruktory a destruktory

Konstruktory a destruktory Konstruktory a destruktory Nedostatek atributy po vytvoření objektu nejsou automaticky inicializovány hodnota atributů je náhodná vytvoření metody pro inicializaci, kterou musí programátor explicitně zavolat,

Více

COMPLEXITY

COMPLEXITY Níže uvedené úlohy představují přehled otázek, které se vyskytly v tomto nebo v minulých semestrech ve cvičení nebo v minulých semestrech u zkoušky. Mezi otázkami semestrovými a zkouškovými není žádný

Více

Časová složitost algoritmů

Časová složitost algoritmů Časová složitost algoritmů Důležitou vlastností algoritmu je časová náročnost výpočtů provedené podle daného algoritmu Ta se nezískává měřením doby výpočtu pro různá data, ale analýzou algoritmu, jejímž

Více

1 2 3 4 5 6 součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

1 2 3 4 5 6 součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů: Úloha č.: max. bodů: skut. bodů: 1 2 3 4 5 6 součet cvičení celkem 20 12 20 20 14 14 100 známka UPOZORNĚNÍ : a) Písemná zkouška obsahuje 6 úloh, jejichž řešení musí být vepsáno do připraveného formuláře.

Více

Informatika 8. třída/6

Informatika 8. třída/6 Rekurze Jedním z důležitých principů pro návrh procedur je tzv. rekurze. Nejlépe uvidíme tento princip na příkladech dvou velmi jednoduchých procedur (hvězdička označuje násobení). Rekurze vlastně označuje

Více

Rozptylování, stromy - zákl. vlastnosti

Rozptylování, stromy - zákl. vlastnosti Karel Müller, Josef Vogel (ČVUT FIT) Rozptylování, stromy - zákl. vlastnosti BI-PA2, 2011, Přednáška 12 1/55 Rozptylování, stromy - zákl. vlastnosti Ing. Josef Vogel, CSc Katedra softwarového inženýrství

Více

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

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze NEJKRATŠÍ CESTY I Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze BI-GRA, LS 2010/2011, Lekce 7 Evropský sociální fond Praha & EU: Investujeme do vaší

Více

Časová a prostorová složitost algoritmů

Č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íce

ADT STROM Lukáš Foldýna

ADT STROM Lukáš Foldýna ADT STROM Lukáš Foldýna 26. 05. 2006 Stromy mají široké uplatnění jako datové struktury pro různé algoritmy. Jsou to matematické abstrakce množin, kterou v běžném životě používáme velice často. Příkladem

Více

PŘETĚŽOVÁNÍ OPERÁTORŮ

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Dynamicky vázané metody. Pozdní vazba, virtuální metody Dynamicky vázané metody Pozdní vazba, virtuální metody Motivace... class TBod protected: float x,y; public: int vrat_pocet_bodu() return 1; ; od třídy TBod odvodíme: class TUsecka: public TBod protected:

Více

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

Algoritmus pro hledání nejkratší cesty orientovaným grafem 1.1 Úvod Algoritmus pro hledání nejkratší cesty orientovaným grafem Naprogramoval jsem v Matlabu funkci, která dokáže určit nejkratší cestu v orientovaném grafu mezi libovolnými dvěma vrcholy. Nastudoval

Více

Datový 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 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íce

Vyhledá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. 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íce

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

Algoritmizace 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íce

Spojové struktury. Spojová struktura (linked structure):

Spojové struktury. Spojová struktura (linked structure): Spojová struktura (linked structure): Spojové struktury množina objektů propojených pomocí spojů (odkazů, referencí, ukazatelů) Spoj často vyjadřuje vztah předchůdce následník Lineární spojové struktury

Více

Správa obsahu ízené dokumentace v aplikaci SPM Vema

Správa obsahu ízené dokumentace v aplikaci SPM Vema Správa obsahu ízené dokumentace v aplikaci SPM Vema Jaroslav Šmarda, smarda@vema.cz Vema, a. s., www.vema.cz Abstrakt Spolenost Vema patí mezi pední dodavatele informaních systém v eské a Slovenské republice.

Více

Úvod do teorie grafů

Ú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íce

Radek Mařík

Radek Mařík 2012-03-20 Radek Mařík 1. Pravá rotace v uzlu U a) v podstromu s kořenem U přemístí pravého syna U.R uzlu U do kořene. Přitom se uzel U stane levým synem uzlu U.R a levý podstrom uzlu U.R se stane pravým

Více

TGH07 - Chytré stromové datové struktury

TGH07 - Chytré stromové datové struktury TGH07 - Chytré stromové datové struktury Jan Březina Technical University of Liberec 5. dubna 2017 Prioritní fronta Datová struktura s operacemi: Odeber Minum (AccessMin, DeleteMin) - vrat prvek s minimálním

Více

Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika

Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika amortizovaná složitost, Fibonacciho halda, počítačová aritmetika Jiří Vyskočil, Marko Genyg-Berezovskyj 2009 Amortizovaná složitost Asymptotická složitost často dostatečně nevypovídá o složitosti algoritmů,

Více

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY FAKULTA INFORMAČNÍCH TECHNOLOGIÍ ÚSTAV INFORMAČNÍCH SYSTÉMŮ FACULTY OF INFORMATION TECHNOLOGY DEPARTMENT OF INFORMATION SYSTEMS PŘÍPRAVA DOMÁCÍCH

Více

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto: 20. Programovací techniky: Abstraktní datový typ, jeho specifikace a implementace. Datový typ zásobník, fronta, tabulka, strom, seznam. Základní algoritmy řazení a vyhledávání. Složitost algoritmů. Abstraktní

Více

Datové struktury. alg12 1

Datové 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íce

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

Prohledá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íce

Algoritmizace prostorových úloh

Algoritmizace 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

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost Amortizovaná složitost. Prioritní fronty, haldy binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost 1. Asymptotické odhady Asymptotická složitost je deklarována na základě

Více

Vyhledávací stromy. Slouží jako pomůcka pro organizaci dat umožňující efektivní vyhledávání.

Vyhledávací stromy. Slouží jako pomůcka pro organizaci dat umožňující efektivní vyhledávání. Vyhledávací stromy Slouží jako pomůcka pro organizaci dat umožňující efektivní vyhledávání. Vytvářejí se vždy nad již existující datovou strukturou (zpravidla tabulkou). Vyhledávací stromy můžeme rozdělit

Více

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

Vý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íce

Dynamické programování

Dynamické programování ALG 0 Dynamické programování zkratka: DP Zdroje, přehledy, ukázky viz https://cw.fel.cvut.cz/wiki/courses/a4balg/literatura_odkazy 0 Dynamické programování Charakteristika Neřeší jeden konkrétní typ úlohy,

Více

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

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 Hanojská věž Stavový prostor 1. množina stavů S = {s} 2. množina přechodů mezi stavy (operátorů) Φ = {φ} s k = φ ki (s i ) zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3] který tah

Více

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false Logické operace Datový typ bool může nabýt hodnot: o true o false Relační operátory pravda, 1, nepravda, 0, hodnoty všech primitivních datových typů (int, double ) jsou uspořádané lze je porovnávat binární

Více

Dynamické datové struktury I.

Dynamické 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

ABSTRAKTNÍ DATOVÉ TYPY

ABSTRAKTNÍ 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íce

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

Cí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íce