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

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

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

Řídicí struktury. alg3 1

Datové struktury. alg12 1

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 )/ ;

Rozklad problému na podproblémy

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

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

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

Dynamické datové struktury I.

Algoritmy a datové struktury

Dynamické datové struktury IV.

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

Textové soubory. alg9 1

ADT/ADS = abstraktní datové typy / struktury

Algoritmizace a programování

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

Soubor jako posloupnost bytů

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

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

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

Třída jako zdroj funkcí

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

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

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

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

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

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

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

Abstraktní datové typy

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

Datové typy a struktury

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

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

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

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.

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

Úvod do programovacích jazyků (Java)

Dynamické datové struktury III.

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

Abstraktní datové typy: zásobník

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

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

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

KTE / ZPE Informační technologie

Základní datové struktury

Programování v Javě I. Leden 2008

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

Úvod do programovacích jazyků (Java)

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

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

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

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

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

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

Konstruktory a destruktory

7. Datové typy v Javě

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

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

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

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

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

Algoritmizace a programování

Principy objektově orientovaného programování

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

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

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

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

Abstraktní datové typy FRONTA

Generování vnitřní reprezentace programu

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

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

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

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

C# konzole Program emoce

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

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

Typický prvek kolekce pro české řazení

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

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

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

a) b) c) Radek Mařík

Šablony, kontejnery a iterátory

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

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

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

Abstraktní třídy, polymorfní struktury

Kolekce, cyklus foreach

Regulární výrazy. Vzory

PREPROCESOR POKRAČOVÁNÍ

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

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

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

ORIENTOVANÉ GRAFY, REPREZENTACE GRAFŮ

Zápis programu v jazyce C#

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

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

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

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

OOPR_05. Případové studie

Transkript:

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 (spojové seznamy): každý prvek struktury má nanejvýš jednoho následníka Příklady spojových seznamů: jednosměrný spojový seznam dvousměrný spojový seznam cyklický (jednosměrný) spojový seznam alg13 1

Spojové seznamy Jednosměrné spojové seznamy jsme použili pro implementaci zásobníku a fronty Jiný příklad: spojový seznam čísel typu int 10 5 15 Seznam vytvoříme z objektů třídy Prvek class Prvek { int hodn; Prvek dalsi; public Prvek(int h, Prvek d) { hodn = h; dalsi = d; public int hodn() { return hodn; public Prvek dalsi() { return dalsi; alg13 2

Příklad použití spojového seznamu Příklad: přečíst řadu čísel zakončenou nulou a vypsat čísla v opačném pořadí Nástin řešení: z přečtených čísel budeme vytvářet spojový seznam, jehož první prvek bude referencovat proměnná prvni typu Prvek na počátku je seznam prázdný Prvek prvni = null; přečtené číslo vložíme na začátek spojového seznamu prvni = new Prvek(cislo, prvni); příklad seznamu po přečtení čísel 15, 5 a 10 prvni 10 5 15 po přečtení všech čísel bude seznam obsahovat přečtená čísla v opačném pořadí, stačí jej projít a čísla vypsat Prvek pom = prvni; while (pom!=null) { Sys.p(pom.hodn()+ ); pom = pom.dalsi(); alg13 3

Příklad použití spojového seznamu Výsledné řešení: public class ObraceniCisel { public static void main(string[] args) { Sys.pln("zadejte řadu čísel zakončených nulou"); Prvek prvni = null; int cislo = Sys.readInt(); while (cislo!=0) { prvni = new Prvek(cislo, prvni); cislo = Sys.readInt(); Sys.pln("čísla v opačném pořadí"); Prvek pom = prvni; while (pom!=null) { Sys.p(pom.hodn()+" "); pom = pom.dalsi(); Sys.pln(); alg13 4

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 posledni prvni 10 5 volny alg13 5

Třída SeznamCisel Vložení na konec seznamu bude jednodušší, použijeme-li reprezentaci s odkazem na volný prvek (proč?) public class SeznamCisel { Prvek prvni; Prvek volny; public SeznamCisel() { prvni = new Prvek(); volny = prvni; public void vloznazacatek(int x) { prvni = new Prvek(x, prvni); public void vloznakonec(int x) { volny.hodn = x; volny.dalsi = new Prvek(); volny = volny.dalsi; alg13 6

Třída SeznamCisel public boolean jeprvkem(int x) { volny.hodn = x; Prvek pom = prvni; while (pom.hodn!=x) pom = pom.dalsi; return pom!=volny; public void vypis() { Prvek pom = prvni; while (pom!=volny) { Sys.p(pom.hodn+" "); pom = pom.dalsi; Sys.pln(); Poznámka: řešení pomocí odkazu na poslední prvek je vloženo jako komentář do třídy SeznamCisel alg13 7

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 různých čísel public static void main(string[] args) { SeznamCisel obracena = new SeznamCisel(); SeznamCisel ruzna = new SeznamCisel(); Sys.pln("zadejte řadu čísel zakončenou nulou"); int x = Sys.readInt(); while (x!=0) { obracena.vloznazacatek(x); if (!ruzna.jeprvkem(x)) ruzna.vloznakonec(x); x = Sys.readInt(); Sys.pln("čísla v opačném pořadí"); obracena.vypis(); Sys.pln("seznam různých čísel"); ruzna.vypis(); alg13 8

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ů Binární strom: každý prvek (uzel) má nanejvýš dva následníky Některé pojmy: kořen stromu, levý podstrom, pravý podstrom, list alg13 9

Třída pro realizaci: class Uzel { char hodn; Uzel levy, pravy;... Příklad binárního stromu: Realizace binárního stromu alg13 10

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 alg13 11

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; alg13 12

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', // -... ) ); alg13 13

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é abecedy 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; aktualni = koren; else { vysl = vysl + '?'; aktualni = koren; return vysl; alg13 14

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... pro zájemce alg13 15

Příklad - hra Jaké zvíře si myslíš Počáteční strom dialogu : Strom dialogu po doplnění ní znalostí: pro zájemce alg13 16

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 aktuálního uzlu"; if ("odpověď je ano") "hádání bylo úspěšné" else { "hádání bylo neúspěšné"; "doplň znalosti" pro zájemce alg13 17

Podrobné řešení Třída uzlů stromu: class Uzel { String text; Uzel ano, ne; Příklad - hra Jaké zvíře si myslíš 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; pro zájemce alg13 18

Příklad - hra Jaké zvíře si myslíš Hlavní funkce: public class Hra { public static void main(string[] args) { Uzel koren = inicializacestromu(); for (;;) { Sys.pln("Myslíte si nějaké zvíře?"); if (!odpovedano()) break; Uzel aktualni = koren; do { Sys.pln(aktualni.text); if (odpovedano()) aktualni = aktualni.ano; else aktualni = aktualni.ne; while (!aktualni.jelist()); Sys.pln("Je to "+aktualni.text+"?"); if (odpovedano()) Sys.pln("Uhádl jsem"); else { Sys.pln("Neuhádl jsem. Prosím o doplnění znalostí"); doplnpodstrom(aktualni); Sys.pln("Děkuji. Chcete pokračovat?"); if (!odpovedano()) break; pro zájemce alg13 19

Příklad - hra Jaké zvíře si myslíš Pomocné funkce: static boolean odpovedano() { String s = Sys.readLine(); 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)); pro zájemce alg13 20

Příklad - hra Jaké zvíře si myslíš Pomocné funkce: static void doplnpodstrom(uzel p) { String novezvire, novaotazka; Uzel novyano, novyne; Sys.pln("Jaké zviře jste myslel?"); novezvire = Sys.readLine(); Sys.pln("Napište otázku vystihující rozdíl mezi "+ novezvire+" a "+p.text); novaotazka = Sys.readLine(); Sys.pln("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; pro zájemce alg13 21