Spojové struktury. x, y, a, b. X1 y1 X2 y2 X3 y3. Grafické objekty bod. kružnice. obdélník. lomenáčára

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

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

9. přednáška - třídy, objekty

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

5. přednáška - Rozklad problému na podproblémy

Algoritmizace a programování

Datové struktury. alg12 1

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

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

Algoritmy a datové struktury

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

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

8. přednáška: Soubory a proudy

Dynamické datové struktury I.

Rozklad problému na podproblémy

Řídicí struktury. alg3 1

Textové soubory. alg9 1

Dynamické datové struktury IV.

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Paměť počítače. alg2 1

Algoritmizace a programování

Časová složitost algoritmů

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

Úvod do programování - Java. Cvičení č.4

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Regulární výrazy. Vzory

Algoritmizace a programování. Terminálový vstup a výstup

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 Javě I. Leden 2008

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

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

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

KTE / ZPE Informační technologie

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy: zásobník

OOPR_05. Případové studie

7. Datové typy v Javě

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

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

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Typický prvek kolekce pro české řazení

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

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

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

Java a XML. 10/26/09 1/7 Java a XML

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

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

VY_32_INOVACE_08_2_04_PR

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Úvod do programovacích jazyků (Java)

Řídicí příkazy KAPITOLA 3. Vstup znaků z klávesnice

Iterator & for cyklus

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.

Podmínky na zápočet. Java, zimní semestr

6. Příkazy a řídící struktury v Javě

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

C# konzole Program emoce

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

Principy objektově orientovaného programování

Prioritní fronta, halda (heap), řazení

Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

Dynamické datové struktury III.

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

Zápis programu v jazyce C#

Úvod do programovacích jazyků (Java)

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

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Vytváření a použití knihoven tříd

Abstraktní datové typy

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

Java - výjimky. private void vstup() throws IOException {... }

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Datové typy a struktury

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

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

Generování vnitřní reprezentace programu

Objektově orientované programování

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

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

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

Abstraktní třída a rozhraní

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

8 Třídy, objekty, metody, předávání argumentů metod

3 KTE / ZPE Informační technologie

Základy algoritmizace. Hašování

ADT/ADS = abstraktní datové typy / struktury

Soubor jako posloupnost bytů

Algoritmizace a programování

Třída jako zdroj funkcí

PREPROCESOR POKRAČOVÁNÍ

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

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

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

Transkript:

Spojové struktury Grafické objekty bod x y kružnice x y r obdélník x, y, a, b lomenáčára X1 y1 X2 y2 X3 y3 Algoritmizace (Y36ALG), Šumperk - 13. přednáška 1

Spojové seznamy I Prvek seznamu: class Prvek { TypHodnoty hodn; Prvek dalsi; public Prvek(TypHodnoty h, Prvek p){ hodn = h; dalsi = p; hodn dalsi hlava Prvek hlava = null; hlava = new Prvek (, null); hlava Prvek prvek1; prvek1 = new Prvek (, null); prvek1 Algoritmizace (Y36ALG), Šumperk - 13. přednáška 2

Spojové seznamy II hlava = new Prvek (, null); hlava prvek1 = new Prvek (, null); prvek1 prvek1 = new Prvek (, null); hlava hlava = new Prvek (, prvek1); prvek1 Algoritmizace (Y36ALG), Šumperk - 13. přednáška 3

Spojové seznamy III prvek1 = new Prvek (, null); hlava hlava = new Prvek (, prvek1); prvek1 Prvek prvek2; prvek1 = new Prvek (, null); prvek2 = new Prvek (, prvek1); hlava = new Prvek (, prvek2); hlava prvek2 prvek1 Algoritmizace (Y36ALG), Šumperk - 13. přednáška 4

Spojové seznamy IV prvek1 = new Prvek (, null); prvek2 = new Prvek (, prvek1); hlava hlava = new Prvek (, prvek2); prvek2 prvek1 hlava = new Prvek (, new Prvek (, hlava ) new Prvek (, null) ); Algoritmizace (Y36ALG), Šumperk - 13. přednáška 5

Spojové seznamy V hlava = new Prvek (, new Prvek (, new Prvek (, null) ) ); hlava Prvek hlava = null; int cislo= ; while (cislo<26) { hlava = new Prvek(cislo, hlava); cislo += 4; hlava Algoritmizace (Y36ALG), Šumperk - 13. přednáška 6

Spojové seznamy VI public int hodn() { return hodn; Prvek hlava; System.out.print(hlava.hodn()); hlava System.out.println(hlava.dalsi.hodn()); System.out.println(hlava.dalsi.dalsi.hodn()); Algoritmizace (Y36ALG), Šumperk - 13. přednáška 7

Spojové seznamy VI public int hodn() { return hodn; hlava Prvek hlava; System.out.print(hlava.hodn()); System.out.println(hlava.dalsi.hodn()); System.out.println(hlava.dalsi.dalsi.hodn()); public Prvek dalsi() { return dalsi; Prvek pom = hlava; while (pom!=null) { System.out.println(pom.hodn()); pom = pom.dalsi(); Algoritmizace (Y36ALG), Šumperk - 13. přednáška 8

Příklad použití spojového seznamu Výslednéřešení: public class ObraceniCisel { public static void main(string[] args) { System.out.println("zadejte řadu zakonč. nulou"); Prvek prvni = null; int cislo = sc.nextint(); while (cislo!=0) { prvni = new Prvek(cislo, prvni); cislo = sc.nextint(); Prvek pom = prvni; while (pom!=null) { System.out.print(pom.hodn()+" "); pom = pom.dalsi(); System.out.println(); V jakém pořadí se čísla vypíšou? Algoritmizace (Y36ALG), Šumperk - 13. přednáška 9

Další operace se spojovým seznamem Napišme třídu reprezentující spojový seznam celých čísel s těmito operacemi: vloženíčísla na začátek seznamu vloženíčísla na konec seznamu test, zda číslo je v seznamu výpis čísel uložených v seznamu Vložení prvku na konec spojového seznamu identifikovaného pouze odkazem na první prvek vyžaduje najít poslední prvek (lineární složitost) Vložení prvku na konec seznamu bude mít konstantní složitost, použijeme-li jednu z následujících reprezentací: prvni 10 5 volny prvni 10 5 volny Algoritmizace (Y36ALG), Šumperk - 13. přednáška 10

Prvek volny; Prvek prvni; Spojové seznamy VII prvni 0 public SeznamCisel() { prvni = new Prvek(); volny = prvni; volny Algoritmizace (Y36ALG), Šumperk - 13. přednáška 11

Spojové seznamy VII public void vloznakonec(int x) { volny.hodn = x; volny.dalsi = new Prvek(); volny = volny.dalsi; SeznamCisel jednodusek = new SeznamCisel(); jednodusek.vloznakonec(); jednodusek.vloznakonec(); jednodusek.vloznakonec(); jednodusek.vypis(); prvni volny public void vypis() { Prvek pom = prvni; while (pom!=volny) { System.out.print(pom.hodn + " "); pom = pom.dalsi; System.out.println(); 0 Algoritmizace (Y36ALG), Šumperk - 13. přednáška 12

Spojové seznamy VIII public void vloznazacatek(int x) { prvni = new Prvek(x, prvni); prvni volny jednodusez.vloznazacatek(); jednodusez.vloznazacatek(); jednodusez.vloznazacatek(); jednodusez.vypis(); 0 Algoritmizace (Y36ALG), Šumperk - 13. přednáška 13

Spojové seznamy IX public boolean jeprvkem1(int x) { prvni pom Prvek pom = prvni; while (pom.hodn!=x && pom!=volny) pom = pom.dalsi; volny return pom!=volny; public boolean jeprvkem1(int x) { 0 Prvek pom = prvni; while (pom.hodn()!=x && pom!=volny) pom = pom.dalsi(); return pom!=volny; Algoritmizace (Y36ALG), Šumperk - 13. přednáška

Spojové seznamy IX public boolean jeprvkem1(int x) { prvni pom Prvek pom = prvni; while (pom.hodn!=x && pom!=volny) pom = pom.dalsi; volny return pom!=volny; 0 Algoritmizace (Y36ALG), Šumperk - 13. přednáška 15

Spojové seznamy IX public boolean jeprvkem1(int x) { prvni pom Prvek pom = prvni; while (pom.hodn!=x && pom!=volny) pom = pom.dalsi; volny return pom!=volny; 0 Algoritmizace (Y36ALG), Šumperk - 13. přednáška 16

Spojové seznamy IX public boolean jeprvkem1(int x) { prvni pom Prvek pom = prvni; while (pom.hodn!=x && pom!=volny) pom = pom.dalsi; volny return pom!=volny; 0 Algoritmizace (Y36ALG), Šumperk - 13. přednáška 17

Použití třídy SeznamCisel Program, který přečte řadu čísel zakončených nulou a vypíše: přečtenáčísla v opačném pořadí seznam všech unikátních (různých)čísel public static void main(string[] args) { SeznamCisel obracena = new SeznamCisel(); SeznamCisel ruzna = new SeznamCisel(); System.out.println ("zadejte řadu zakončenou nulou"); int x = sc.nextint(); while (x!=0) { obracena.vloznazacatek(x); if (!ruzna.jeprvkem(x)) ruzna.vloznakonec(x); x = sc.nextint(); System.out.println ("čísla v opačném pořadí"); obracena.vypis(); System.out.println ("seznam různých čísel"); ruzna.vypis(); Algoritmizace (Y36ALG), Šumperk - 13. přednáška

Stromy Lineární spojová struktura (spojový seznam) každý prvek má nanejvýš jednoho následníka Nelineární spojová struktura (strom): každý prvek může mít více následníků/potomků Binární strom: každý prvek (uzel) má nanejvýš dva následníky Některé pojmy: kořen stromu, levý podstrom, pravý podstrom, list Algoritmizace (Y36ALG), Šumperk - 13. přednáška 19

Třída pro realizaci: class Uzel { char hodn; Uzel levy, pravy;... Příklad binárního stromu: Realizace binárního stromu Algoritmizace (Y36ALG), Šumperk - 13. přednáška 20

Příklad dekódování morseovky Pro dekódování textu zapsaného v Morseově abecedě lze použít následující binární strom. -. E T -. - I A N M. -. -. -. - S U R W D K Z O. -... -. -. -. - H V F L P J B X C Y Z Q Algoritmizace (Y36ALG), Šumperk - 13. přednáška 21

Příklad dekódování morseovky Strom vytvoříme z objektů typu MUzel class MUzel { char znak; MUzel tecka, carka; public MUzel(char z) { znak = z; tecka = null; carka = null; public MUzel(char z, MUzel t, MUzel c) { znak = z; tecka = t; carka = c; Algoritmizace (Y36ALG), Šumperk - 13. přednáška

Příklad dekódování morseovky Pro vytvoření stromu zavedeme funkci: static MUzel strom() { return new MUzel(' ', new MUzel('E', //. new MUzel('I', //.. new MUzel('S', //... new MUzel('H'), //... new MUzel('V') //...- ), new MUzel('U', //..- new MUzel('F'), //..-. null //.. ) ), new MUzel('A', //.-... ) ), new MUzel('T', // -... ) ); Algoritmizace (Y36ALG), Šumperk - 13. přednáška 23

Příklad dekódování morseovky public static void main(string[] args) { System.out.println ("Zadejte text v morseovce zakončený prázdným řádkem"); String text = sc.nextline(); while (!text.equals("")) { Sys.pln(dekoduj(text + " ")); text = sc.nextline(); static MUzel koren = strom(); Algoritmizace (Y36ALG), Šumperk - 13. přednáška 24

Příklad dekódování morseovky Dekódování zapíšeme jako funkci, jejímž parametrem je řetězec obsahující Morseův kód a výsledkem je řetězec tvořený odpovídajícími znaky latinské ab. static String dekoduj(string s) { MUzel aktualni = koren; String vysl = ""; for (int i=0; i<s.length(); i++) { char z = s.charat(i); if (aktualni!=null) if (z=='.') aktualni = aktualni.tecka; else if (z=='-') aktualni = aktualni.carka; else { vysl = vysl + aktualni.znak; // včetně mezery aktualni = koren; else { vysl = vysl + '?'; aktualni = koren; return vysl; Algoritmizace (Y36ALG), Šumperk - 13. přednáška 25

Příklad - hra Jaké zvíře si myslíš Příklad dialogu: Myslíte si nějaké zvíře? Ano Zvíře, které si myslíte létá? Ne Je to ryba? Ne Dám se podat. Jaké zvíře jste myslel? Pes Napište otázku vystihující rozdíl mezi pes a ryba! štěká? Pro zvíře, které jste myslel, je odpověď ano či ne? Ano Dekuji. Chcete hrát ještě jednou? Ano Myslíte si nějaké zvíře? Ano... Algoritmizace (Y36ALG), Šumperk - 13. přednáška 26

Příklad - hra Jaké zvíře si myslíš Počáteční strom dialogu : Strom dialogu po doplnění znalostí: Učení Algoritmizace (Y36ALG), Šumperk - 13. přednáška 27

Příklad - hra Jaké zvíře si myslíš Hrubéřešení: "úvod dialogu"; "aktuálním uzlem je kořen stromu"; do { "polož otázku uvedenou v aktuálním uzlu"; if ("odpověď je ano") "aktuálním uzlem je levý následník" else "aktuálním uzlem je pravý následník" while ("aktuální uzel není list"); "polož závěrečnou otázku, název zvířete vyber z akt.uzlu"; if ("odpověď je ano") "hádání bylo úspěšné" else { "hádání bylo neúspěšné"; "doplň znalosti ; Algoritmizace (Y36ALG), Šumperk - 13. přednáška 28

Podrobnéřešení Příklad - hra Jaké zvíře si myslíš Třída uzlů stromu: class Uzel { String text; Uzel ano, ne; public Uzel(String t) { text = t; ano = null; ne = null; public Uzel(String t, Uzel a, Uzel n) { text = t; ano = a; ne = n; public boolean jelist() { return ano==null && ne==null; Algoritmizace (Y36ALG), Šumperk - 13. přednáška 29

Příklad - hra Jaké zvíře si myslíš Hlavní funkce: public class Hra { public static void main(string[] args) { Uzel koren = inicializacestromu(); for (;;) { System.out.println ("Myslíte si nějaké zvíře?"); if (!odpovedano()) break; Uzel aktualni = koren; do {System.out.println(aktualni.text); if (odpovedano()) aktualni = aktualni.ano; else aktualni = aktualni.ne; while (!aktualni.jelist()); System.out.println("Je to "+aktualni.text+"?"); if (odpovedano()) System.out.println("Uhádl jsem"); else { System.out.println("Neuhádl jsem. Prosím o doplnění"); doplnpodstrom(aktualni); System.out.println("Děkuji. Chcete pokračovat?"); if (!odpovedano()) break; Algoritmizace (Y36ALG), Šumperk - 13. přednáška 30

Příklad - hra Jaké zvíře si myslíš Pomocné funkce: static boolean odpovedano() { String text = sc.nextline(); if (s.length()>0 && (s.charat(0)=='a' s.charat(0)=='a')) return true; else return false; static Uzel inicializacestromu() { return new Uzel("létá?", new Uzel("pták", null, null), new Uzel("ryba", null, null)); Algoritmizace (Y36ALG), Šumperk - 13. přednáška 31

Příklad - hra Jaké zvíře si myslíš Pomocné funkce: static void doplnpodstrom(uzel p) { String novezvire, novaotazka; Uzel novyano, novyne; System.out.println("Jaké zviře jste myslel?"); novezvire = sc.nextline(); System.out.println("Napište otázku"+ "vystihující rozdíl mezi "+ novezvire+" a "+p.text); novaotazka = sc.nextline(); System.out.println("Pro zvíře, které jste myslel," + "je odpoveď ano či ne"); if (odpovedano()) { novyano = new Uzel(noveZvire); novyne = new Uzel(p.text); else { novyano = new Uzel(p.text); novyne = new Uzel(noveZvire); p.text = novaotazka; p.ano = novyano; p.ne = novyne; Algoritmizace (Y36ALG), Šumperk - 13. přednáška 32

Tolik přednášky z Algoritmizace Y36ALG Co zbývá: zápočet pokud máte nárok na 1 ze semestru, jen zápis zkoušejícím bez zápisu na zkoušku zkouška Zkouškové termíny: řádné 15.1.2010,.1.2010 Přeji úspěšné zkouškové období Algoritmizace (Y36ALG), Šumperk - 13. přednáška 33