Node root; } riešenia príkladu 1 píšte na tento list alebo si vypýtajte ďalší list

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

8. Relácia usporiadania

Teória grafov. Stromy a kostry 1. časť

VECIT 2006 Tento materiál vznikol v rámci projektu, ktorý je spolufinancovaný Európskou úniou. 1/4

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

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

Moderné vzdelávanie pre vedomostnú spoločnosť/projekt je spolufinancovaný zo zdrojov EÚ. Grafy

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

Zvyškové triedy podľa modulu

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

Programovanie v jazyku C - pole treba poorat...

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.

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

Čo ak program potrebuje pamäť, ktorej veľkosť závisí od konkrétneho vstupu?

Množiny, relácie, zobrazenia

Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

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

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

MANUÁL K TVORBE CVIČENÍ NA ÚLOHY S POROZUMENÍM

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Hromadná korešpondencia v programe Word Lektor: Ing. Jaroslav Mišovych

1. Téma 12 - Textové soubory a výjimky

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

PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

7. Relácia ekvivalencie a rozklad množiny

Principy objektově orientovaného programování

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

TomTom Referenčná príručka

Obrázok Časový plán projektu, určite kritickú cestu. Obrázok Časový plán projektu, určite kritickú cestu

Skákalka. Otvoríme si program Zoner Callisto, cesta je Programy Aplikácie Grafika Zoner Callisto.

Kombinatorická pravdepodobnosť (opakovanie)

Dodanie tovaru a reťazové obchody Miesto dodania tovaru - 13/1

Užívateľská príručka systému CEHZ. Základné zostavy Farmy podľa druhu činnosti

POSTUP GENEROVANIA ŽIADOSTI O KVALIFIKOVANÝ CERTIFIKÁT POMOCOU PROGRAMU COMFORTCHIP.

INTERNET BANKING. Platby cez Internet banking VŠETKO, ČO JE MOŽNÉ. with.vub.sk, Bank of

Riešenie cvičení z 3. kapitoly

Ako funguje stav účtu - prehľad o platbách na zdravotné odvody

Iracionálne rovnice = 14 = ±

Programovanie v jazyku C - struktury a polia

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

15. Príkazy vetvenia

Virtuálna Registračná Pokladnica. Modul OPD pre ios

Manuál Klientska zóna

Užívateľská príručka. Vytvorte 1 medzi stránkami v niekoľkých jednoduchých krokoch

Návrh, implementácia a prevádzka informačného systému

Kompilátory. Cvičenie 4: Syntaktická analýza v ANTLR4 (1. časť) Peter Kostolányi. 7. novembra 2017

Účtovný doklad. Druh 5) Číslo 6) 7) Identifikáci a prílohy 8)

Kvadratické funkcie, rovnice, 1

KEO - Register obyvateľov Prevod údajov

Bezdrôtová sieť s názvom EDU po novom

Objektovo orientované programovanie v C# ERIK KUČERA METÓDY VÝPOČTOVEJ INTELIGENCIE PREDNÁŠKA 3

Algoritmizace a programování

Vytvorenie používateľov a nastavenie prístupov

Rozhodovanie za rizika a neistoty. Identifikácia, analýza a formulácia rozhodovacích problémov

Manuál Klientska zóna

Ak stlačíme OK, prebehne výpočet a v bunke B1 je výsledok.

Pracovné prostredie MS EXCEL 2003.

1. Otec, mama a dcéra majú spolu 69 rokov. Koľko rokov budú mať spolu o 7 rokov? a) 76 b) 90 c) 83 d) 69

Metodické usmernenie č. 4/2007 k poskytovaniu informácií prostredníctvom portálu Úradu pre dohľad nad zdravotnou starostlivosťou

Prehľad nového TwinSpace

Import Excel Univerzál

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

DOBROPISY. Dobropisy je potrebné rozlišovať podľa základného rozlíšenia: 1. dodavateľské 2. odberateľské

M R2454 SK

Pripojenie na internet cez WiFi pre zamestnancov a študentov

Test. Ktorý valec by ste použili? A. Jednočinný valec B. Dvojčinný valec. Odpoveď:

To bolo ľahké. Dokážete nakresliť kúsok od prvého stromčeka rovnaký? Asi áno, veď môžete použiť tie isté príkazy.

Virtuálna Registračná Pokladnica

Strojový kód, assembler, emulátor počítača

Multiplexor a demultiplexor

Tabuľkový kalkulátor EXCEL Základné operácie v programe Excel

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Vzor PRÍDELOVÝ LÍSTOK KATEGÓRIE A

Kombinatorická pravdepodobnosť (opakovanie)

Automatické pohony na brány

OOPR_05. Případové studie

Diplomový projekt. Detská univerzita Žilinská univerzita v Žiline Matilda Drozdová

Základy algoritmizácie a programovania

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

AR, MA a ARMA procesy

P R O L E M FAKTURA Z VYDAJA OBSAH. Vystavenie faktúry z výdaja postup, podmienky... 2

Studentove t-testy. Metódy riešenia matematických úloh

Súmernosti. Mgr. Zuzana Blašková, "Súmernosti" 7.ročník ZŠ. 7.ročník ZŠ. Zistili sme. Zistite, či je ľudská tvár súmerná

KOMISNÝ PREDAJ. Obr. 1

Abstraktní datové typy: zásobník

Iterator & for cyklus

Predloženie žiadosti o zápis športovej organizácie

Prevody z pointfree tvaru na pointwise tvar

Príručka pre prostredie Digitálnej autoškoly pre inštruktorov časť elearning

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

OBOZNÁMTE SA S VAŠÍM TELEFÓNOM

MAIS. Verejný portál - kalendárny rozvrh. Používateľská minipríručka pre používateľov systému MAIS. APZ Bratislava

Algoritmy a datové struktury

Manuál Generovanie prístupových práv E-Recept

Programování v Javě I. Únor 2009

Formuláre PowerPoint MGR. LUCIA BUDINSKÁ,

Návod na použite plaftormy ELMARK E- Business obsahuje popis hlavných možností a funkcií programu. Príručka je štruktúrovaná podľa poradia možností.

Metóda vetiev a hraníc (Branch and Bound Method)

1. LABORATÓRNE CVIČENIE

Externé zariadenia Používateľská príručka

Transkript:

Midterm 2017 Meno a priezvisko: obsahuje 5 príkladov, spolu 6+6+4+6+5 = 27 bodov+bonusy 1) [6 bodov] Dve triedy popisujú implementáciu binárneho stromu s hodnotami typu Integer vo vnútorných vrcholoch public class Node { Node left; // ľavý podstrom Integer key; // hodnota vrchola Node right; // pravý podstrom, konštruktor: public Node(Node left, Integer k, Node right) public class Tree {// konštruktor: public Tree(Node root) Node root; [2 body] V triede Tree (prípadne aj Node) definujte metódu public boolean isbvs(), ktorá vráti True, ak strom spĺňa podmienku vyhľadávacieho stromu [+1 bod za efektívne riešenie,nelineárne riešenie max.2 body] [2 body] V triede Tree definujte metódu public boolean String path(integer k),ktorá vráti reťazec obsahujúci písmená L a R, ktoré vás dovedú v binárnom vyhľadávacom strome od koreňa stromu k vrcholu s hodnotou k. L znamená choď do ľavého podstromu R a analogicky do pravého. Hodnota path(integer k), pre koreň stromu je prázdny reťazec, teda "". Hodnota path(integer k), ak k sa nenachádza v strome je null, pozor null!= "". [2 body] V Triede Tree definujte konštruktor public Tree(int from, int to), ktorý vytvorí binárny vyhľadávací strom obsahujúci vo vrcholoch stromu všetky prirodzené čísla z intervalu [from,to], teda [from..to] a každú z nich práve raz. Nie je dôležité ako strom vyzerá, ale musí spĺňať podmienku isbvs() a obsahovať všetky čísla práve raz. [Bonus od cvičiaceho: ak predsa len zostrojíte pekný vyvážený strom +1bod]. riešenia príkladu 1 píšte na tento list alebo si vypýtajte ďalší list

2) [6 bodov = 0.5 bodu za každú správnu odpoveď] Ku každému obrázku napíšte kód, ktorý vytvorí znázornené pole v pamäti. Prečiarknutá bunka prestavuje hodnotu null. Ak taký kód neexistuje, napíšte NEEXISTUJE. Nedajte sa nachytať! Uvedomte si, že Integer je referenčný typ, takže new Integer[]{1,2,3 je pole troch pointrov, 1 ale new int[]{1,2,3 je pole troch 32-bitových čísel. 1 2 3 2 3 Obrázok 1: 0 1 2 Kód 1: Obrázok 2: Kód 2: Obrázok 3: Kód 3: Obrázok 4: 0 1 2 0 0 0 0 0 0 V pravej časti strany prečiarknite riadky, ktoré sú: syntakticky nesprávne kompilátor by na nich zahlásil chybu (tie prečiarknite a označte S), spôsobia chybu počas behu programu (tie označte R). Kód 7: pole s null-mi Integer[] pole1 = new Integer[]{1,2,null,null; for(integer p:pole1) { System.out.println(p+p); Kód 8: priradenie poľa Integer[] pole3 = { 0 ; Integer[] pole4 = pole3; pole4 = new Integer[]{1,2; System.out.println(pole3[1]); pole3 = pole4; pole4[1] = 99; if (pole3[1] == 99) System.out.println(pole3[1]); Kód 4: Midterm Kód 9: podtrieda HashSet class MySet extends HashSet<String> { Kód 5: dvojrozmerný clone Integer[][]p ={{0,1,{2,3,null,{4,5; Integer[][] clon = (Integer[][])p.clone(); p[0][0] = 4; čo vypíše následujúci print? System.out.println(16/ clon[0][0]); Kód 6:nakreslite obrázky pamäte pre premenné A..C String [][] A = new String[4][]; A[0] = new String[4]; A[2] = new String[2]; String[][] B = (String [][])A; Integer[][] C = new Integer[3][]; C[0] = new Integer[]{1,2,3; C[2] = new Integer[]{4,5,6; MySet ms = new HashSet<String>(); HashSet<String> hs = new MySet(); Kód 10: pole podtried MySet[] pole5 = new HashSet<String>[5]; HashSet<String>[] pole6 = new MySet[6]; Kód 11: list podtried ArrayList<MySet> al1 = new ArrayList<HashSet<String>>(); ArrayList<HashSet<String>> al2 = new ArrayList<MySet>(); Kód 12: prepíšte kód bez použitia (%, /) int a =...; if (a % 2 > 0) a++; int b = (a / 16) % 16; riešenia príkladu 2 píšte na tento list, aj zozadu, alebo si vypýtajte ďalší list

3) [4 body] Nasledujúci kód sa spustí s argumentami predstavujúcimi jednosmerné cestovné poriadky: java Cities BA-ZA-KE BA-NR-BB-KE PO-SK-BJ NR-ZA public class Cities { static TreeMap<String, TreeSet<String>> cudo=new TreeMap<String, TreeSet<String>>(); public static void main(string[] args) { for (String arg : args) { String[] edges = arg.split("-"); String vertex = null; for (String v : edges) { // sem pride graf if (vertex!= null) { TreeSet<String> set = cudo.get(vertex); if (set == null) set = new TreeSet<String>(); set.add(v); cudo.put(vertex, set); vertex = v; System.out.println(cudo); [2 body] označte správnu možnosť: výpis premennej cudo vypíše podľa Vás: 1. {BA=NR,BB=KE,BJ=SK,KE=BB,NR=BA,PO=SK,SK=BJ,ZA=BA 2. {PO=[SK],SK=[BJ],ZA=[KE],BA=[ZA,NR],BB=[KE],NR=[ZA,BB] 3. {BA=[ZA,NR],BB=[KE],NR=[ZA,BB],PO=[SK],SK=[BJ],ZA=[KE] 4. {0=[NR,ZA],1=[KE,NR],2=[SK],3=[BB,ZA],4=[BA,BB],5=[SK],6=[BJ,PO],7=[BA,KE] 5. {BA=[NR,ZA],BB=[KE],NR=[BB,ZA],PO=[SK],SK=[BJ],ZA=[KE] 6. {BA=[NR,ZA],BB=[KE,NR],BJ=[SK],KE=[BB,ZA],NR=[BA,BB],PO=[SK],SK=[BJ,PO],ZA=[BA,KE] 7. {BB=[NR],BJ=[SK],KE=[BB,ZA],NR=[BA],SK=[PO],ZA=[BA] 8. niečo ine: [2 body] Napíšte kus kódu, ktorý nájde v štruktúre cudo všetky mestá, odkiaľ nevedie žiaden spoj, v uvedenom príklade sú to KE a BJ. riešenia príkladu 3 píšte na tento list, aj zozadu, alebo si vypýtajte ďalší list

4) [6 bodov] Tento príklad je o vzťahoch medzi osobami, zjednodušene osoba X môže lajkovať osobu Y z dôvodu Z. Vzťahy nie sú symetrické ani reflexívne (samoľúbosť). Okrem toho, X može lajkovať Y z viacerých dôvodov Z 1 -Z 2...-Z n. Osoby v zadaní sú vymyslené a skutočné dôvody radšej nahradené prirodzenými číslami. Príklad vstupu do programu je nižšie na strane. Každý argument má tvar X-Y{-i + arg, kde X,Y sú reťazce a -i je niekoľko (nenula) číselných dôvodov, prečo X lajkuje osobu Y. Štruktúra, v ktorej reprezentujeme tento svet je nasledujúca: TreeMap<String, TreeMap<String, TreeSet<Integer>>> likes = new (); Klúč prvého zobrazenia (mapy) je kto, klúč druhého zobrazenia je koho a množina dôvodov, pre ktoré kto lajkuje koho. [2 body] V konštruktore vytvorte zo vstupu štruktúru likes. Pre uľahčenie, časť programu rozbíjajúca argumenty je známa, dopíšte len telo cyklu: public Like(String[] args) { // konštruktor likes = new TreeMap<String, TreeMap<String, TreeSet<Integer>>>(); for (String arg : args) { String[] parts = arg.split("-"); String kto = parts[0]; String koho = parts[1]; for (int i = 2; i < parts.length; i++) { String preco = parts[i]; // dopíšte kód, ktorý doplní do likes informáciu, že kto lajkuje koho z dôvodu prečo Po zavolaní konštruktora musí byť hodnota likes nasledujúca: {Bohumila={Charlotte=[1, 2], Xaver=[2], Colette={Chalotte=[2], Matilda={Bohumila=[1], Paula={Rexana=[1, 3], Sara=[1, 2, 3], Rexana={Saxana=[1, 2], Sara={Xaver=[1, 3], Xaver={Matilda=[1, 3], Rexana=[2] [2 body] Keď máte vyrobenú štruktúru likes (resp. 1.podúlohu ste preskočili), definujte metódu public void unfriended(), ktorá vypíše všetky osoby, ktorých nikto nelajkuje. Na poradí nezáleží. V príklade je to Colette a Paula. [2 body] Štruktúra likes vlastne reprezentuje multigraf, kde vrcholmi sú osoby, a viacnásobné hrany medzi vrcholmi sú označené dôvodom lajkovania. V tejto podúlohe ideme otočiť orientované šípky v tomto grafe. Definujte metódu public TreeMap<String, TreeMap<String, TreeSet<Integer>>> liked(), ktorá vytvorí a vráti ako výsledok štruktúru inverznú k likes, teda klúč prvého zobrazenia je koho, klúč druhého zobrazenia je kto a množina dôvodov, pre ktoré kto lajkuje koho. V našom príklade jej obsah bude: {Bohumila={Matilda=[1], Chalotte={Colette=[2], Charlotte={Bohumila=[1, 2], Matilda={Xaver=[1, 3], Rexana={Paula=[1, 3], Xaver=[2], Sara={Paula=[1, 2, 3], Saxana={Rexana=[1, 2], Xaver={Bohumila=[2], Sara=[1, 3] Ilustračný príklad vstupu: Xaver-Matilda-1-3 Paula-Sara-2-3 Sara-Xaver-1-3 Xaver-Rexana-2 Rexana-Saxana-2-1 Bohumila-Xaver-2-2 Bohumila-Charlotte-2-1 Colette-Chalotte-2 Matilda-Bohumila-1 Paula-Rexana-1-3 Paula-Sara-1 riešenia príkladu 4 píšte na tento list, aj zozadu, alebo si vypýtajte ďalší list

5) [5 bodov] V celom príklade predpokladajte, že pracujeme len s nezápornými číslami, lebo nie je dobré na midterme zisťovať vašu predstavivosť o binárnom zápise záporných čísel. Toto je krátka rekurzívna funkcia, ktorá má na vstupe dve nezáporné čísla: public static int foo(int a, int b) { if (a == 0) return b; else { int c = a % 2; return 2 * foo(a / 2, b) + c; Máte zistiť, čo počíta. Pre overenie hypotéz, pár overených výsledkov: foo(5,6)=53,foo(6,5)=46,foo(5,5)=63. [1 bod] Zistite, čo daná funkcia počíta pre kladné vstupné hodnoty int a,b>0 a vyjadrite to niekoľkými (<17) slovami. Pre istotu, vypočítajte tiež foo(7,31)=? Všetky ďalšie podúlohy môžete riešiť, aj keď vás toto ešte nenapadlo... [1 bod] Je zrejmé, že foo(0,b)=b. Dokážte/zdôvodnite napr. indukciou, že aj foo(a,0)=a, pre ľubovoľné kladné a. Hint: pre tých, čo sa boja indukcie: a môže byť párne alebo nepárne... [2 body] Definujte vlastnú nerekurzívnu verziu funkcie foo a nazvite ju myfoo: Hint: dole je tabuľka... [1-2 body] Funkcia goo počíta to isté? Teda platí pre ľubovoľné a, b nezáporne, že foo(a,b) =?= goo(a,b)? Vyberte si a označte jednu z možností, ak zle zvolíte, ste bez bodov: [1 bod] áno, bez zdôvodnenia... [1 bod] nie, bez zdôvodnenia... [2 body] nie, ale treba kontrapríklad, teda a = b =, také, že foo(a,b)!= goo(a,b). public static int goo(int a, int b) { if ((a b) == 0) return 0; else if (a == 0) return goo(b, a); else return (goo(a >> 1, b) << 1) + (a&1); Hint: i Integer.toBinaryString(i) s Integer.parseInt(s,2) 0 0 "0" 0 1 1 "1" 1 2 10 "10" 2 3 11 "11" 3 4 100 5 101 6 110 7 111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111 16 10000 17 10001 18 10010 19 10011 20 10100 "110101" 53 riešenia príkladu 5 píšte na tento list (aj z druhej strany) alebo si vypýtajte ďalší list