Spojové struktury Spojová struktura ( linked structure ):

Slides:



Advertisements
Podobné prezentace
Standardní knihovní funkce pro práci s textovými řetězci
Advertisements

Pole Příklad: přečíst teploty naměřené v jednotlivých dnech týdnu, vypočítat průměrnou teplotu a pro každý den vypsat odchylku od průměrné teploty Řešení.
Funkce Připomeňme si program pro výpočet faktoriálu:
Programovací jazyk C++
Třída SIMSET je druhou standardní systémovou třídou, která obsahuje prostředky pro práci se spojovými seznamy. KRUHOVÉ SPOJOVÉ SEZNAMY Spojový seznam –
Přednáška 11 Jiří Šebesta
1 Vnitřní řazení s využitím dynamických struktur Tvorba spojového seznamu je vcelku triviální záležitostí: a)Vytvořím prázdný seznam příkazem LIST:=nil.
10. Dynamické datové struktury
Semestrální práce KIV/PT Martin Kales Hana Hůlová.
Pole, ukazatele a odkazy
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Strukturované datové typy
Alg51 Rozklad problému na podproblémy Postupný návrh programu rozkladem problému na podproblémy –zadaný problém rozložíme na podproblémy –pro řešení podproblémů.
Programování v C++ Cvičení.
ADT Strom.
Skip-List je datová struktura, která může být použita jako náhrada za vyvážené stromy. představují pravděpodobnostní alternativu k vyváženým stromům (struktura.
Větvení cykly J a v a Začínáme programovat Lucie Žoltá.
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
J a v a Začínáme programovat Lucie Žoltá. Odkazy - oficiální stránky (překladače, help, metody, vývojové prostředí NetBeans,...)
C# - datové typy Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro práci se soubory 13 Verze
OSNOVA: a) Řetězce v C b) Funkce stdio.h pro řetězce c) Funkce string.h pro řetězce d) Příklad Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače.
REDUKCE DAT Díváme-li se na soubory jako na text, pak je tento text redundantní. Redundance vyplývá z:  některé fráze nebo slova se opakují  existuje.
TI 7.1 NEJKRATŠÍ CESTY Nejkratší cesty - kap. 6. TI 7.2 Nejkratší cesty z jednoho uzlu Seznámíme se s následujícími pojmy: w-vzdálenost (vzdálenost na.
Třída jako zdroj funkcionality
Radim Farana Podklady pro výuku
Další abstraktní datové typy
Alg91 Textové soubory Na rozdíl od jiných typů souborů jsou textové soubory určené pro gramotné lidské oko. Textový soubor je posloupnost znaků členěná.
Počítače a programování 1
JavaScript Podmínky, cykly a pole.
OSNOVA: a)Programování se soubory b)Záloha databáze v souboru c) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
Datové typy a struktury
Příklady v jazyku C – část 4
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
IB111 Programování a algoritmizace
Spojové struktury BI-PA1 Programování a algoritmizace 1, ZS
Jazyk XML Jazyk pro tvorbu strukturovaných dokumentů Syntaxí velmi podobný HTML Hlavní cíle návrhu: Snadná editace - jazyk je textový Snadné strojové zpracování.
ZADÁNÍ Sestavte program, který vypočítá obvod a obsah čtverce o straně a. Zajistěte, aby výpočet byl realizován pouze v případě, kdy strana a bude mít.
STROMY Datová struktura sestávající z uzlů
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Rozklad problému na podproblémy, rekurze
Kompresní algoritmus LZW Dokumentografické informační systémy.
Ukazatele BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
POSLOUPNOST úkol 1_41. ZADÁNÍ Sestavte program, který doplní tabulku nepřímé úměrnosti pro hodnoty proměnné x = 1, …, n. Nepřímá úměrnost je zadána uživatelem.
STRING A UKAZATELE. Co to je řetězec? Řetězec v Javě je samostatný objekt. Je konstantní, co znamená, že jednou vytvořený řetězec nelze změnit. Chceme-li.
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
PŘÍKAZ while úkol 1_42.
Vazby dynamických proměnných,databázové systémy Přednáška č. 10.
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
ZÁKLADNÍ POJMY. ZDROJOVÝ TEXT PROGRAMU Tvoří: klíčová slova komentáře identifikátory.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA:
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Programovací jazyk C++
C# konzole – Podíl dvou čísel, podmínka IF
Y36PJC Programování v jazyce C/C++
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Abstraktní datové typy
Dynamické proměnné (1) Proměnné, jejichž počet a (nebo) velikost pa-měti využívané těmito proměnnými se v prů-běhu programu mění Dynamické proměnné lze.
ALG 09 Radix sort (přihrádkové řazení) Counting sort
Fronta (1) Dynamická datová struktura typu FIFO (First In First Out)
C# přehled vlastností.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
ZAL – 7. cvičení 2016.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Transkript prezentace:

Spojové struktury Spojová struktura ( linked structure ): množina objektů propojených pomocí spojů ( odkazů, referencí, ukazatelů ) Spoj 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ý dvousměrný cyklický jednosměrný alg13

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

Příklad použití spojového seznamu Příklad: přečíst řadu čísel zakončenou nulou a vypsat je 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 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(); } prvni 10 5 15 alg13

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

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

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

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

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

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

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

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: . - H V F L P J B X C Y Z Q S U R W D K Z O I A N M E T . - . - alg13

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

Příklad – dekódování morseovky Pro vytvoření stromu zavedeme funkci: static MUzel strom() { return new MUzel( ' ', new MUzel( 'E', // . erb new MUzel( 'I', // .. ibis new MUzel( 'S', // ... sekera new MUzel( 'H' ), // .... halapartna new MUzel( 'V' ) // ...- vyvolený ), new MUzel( 'U', // ..- urazí new MUzel( 'F' ), // ..-. filištíni null ) new MUzel( 'A', // .- akát ... ) new MUzel( 'T', // - tón ... ) ); } alg13

Příklad – dekódování morseovky Dekódování zapišme jako funkci s parametrem m, což je řetěz obsahující Morseův kód a výsledkem je řetěz tvořený odpovídajícími písmeny static String dekoduj( String m ) { MUzel aktualni = koren; String vysl = ""; for ( int i=0; i<m.length(); i++ ) { char z = m.charAt(i); if ( aktualni == null ) // neplatny kod { vysl += '?'; aktualni = koren; } else switch (z) { case '.' : aktualni = aktualni.tecka; break; case '-' : aktualni = aktualni.carka; break; case ' ' : vysl += aktualni.znak; aktualni = koren; break; default : vysl += '?'; } } return vysl; } alg13

Příklad - hra „Jaké zvíře si myslíš“ Příklad dialogu počítače a člověka : 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. Doplňte moje znalosti. 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 Děkuji. Chcete pokračovat? Ano Myslíte si nějaké zvíře? Ano ... alg13

Příklad - hra „Jaké zvíře si myslíš“ Počáteční strom : Strom po doplnění znalostí : Povšimněte si vytvoření podstromu: přibyly dva nové listy ( potomci ) v předkovi se změnil text z názvu zviřete na rozlišující otázku. alg13

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 " } alg13

Příklad - hra „Jaké zvíře si myslíš“ Podrobné řešení Třída uzlů stromu: class Uzel { String text; Uzel ano = null, ne = null; public Uzel(String zvire) { text = zvire; } public Uzel(String otazka, Uzel a, Uzel n) { text = otazka; ano = a; ne = n; } public boolean jeList() { return ano==null && ne==null; public String toString() { return text; } alg13

Příklad - hra „Jaké zvíře si myslíš“ public static void main(String[] args) { Uzel koren = inicializaceStromu(); while (true) { Sys.pln( "Myslíte si nějaké zvíře?" ); if ( !odpovedAno() ) break; Uzel aktualni = koren; do { Sys.pln(aktualni.text); aktualni = odpovedAno()? aktualni.ano:aktualni.ne; } while ( !aktualni.jeList() ); Sys.pln( "Je to "+aktualni.text+ "?" ); if ( odpovedAno() ) Sys.pln( "Uhádl jsem" ); else { Sys.pln( "Dám se podat. Doplňte moje znalostí" ); doplnPodstrom(aktualni); } Sys.pln( "Děkuji. Chcete pokračovat?" ); if (!odpovedAno()) break; alg13

Příklad - hra „Jaké zvíře si myslíš“ Pomocné metody: static boolean odpovedAno() { String s = Sys.readLine(); return s.length()>0 && (s.charAt(0)=='a' || s.charAt(0)=='A'); } static Uzel inicializaceStromu() { return new Uzel( "létá?" , new Uzel( "pták" ), new Uzel( "ryba" ) ); alg13

Příklad - hra „Jaké zvíře si myslíš“ Pomocná metoda: static void doplnPodstrom(Uzel p) { String noveZvire, novaOtazka; Uzel novyAno, novyNe; Sys.pln( "Jaké zvíř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 odpověď 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; alg13

Příklad - hra „Jaké zvíře si myslíš“ Tatáž pomocná metoda napsaná elegantněji: static void doplnPodstrom(Uzel p) { Sys.pln( "Jaké zvíře jste myslel?" ); Uzel noveZvire = new Uzel(Sys.readLine()); Uzel stareZvire = new Uzel(p.text); Sys.pln( "Napište otázku vystihující rozdíl mezi " + noveZvire+ " a " +stareZvire); p.text = Sys.readLine(); // nova otazka se vlozi do p Sys.pln( "Pro zvíře, které jste myslel, je odpověď ano či ne" ); if (odpovedAno()) { p.ano = noveZvire; p.ne = stareZvire; } else { p.ano = stareZvire; p.ne = noveZvire; } alg13 ALG

Hra „Co si myslíš“ Naznačený program má daleko k dokonalosti. Uvažte následující: Po ukončení běhu se ztratí vložené informace. Jak zajistit jejich uchování tak, abychom mohli v příštím běhu pokračovat – případně i na jiném počítači ? Jak vypsat již zavedená zvířata a jejich vlastnosti ? Jak se dotázat jen na určité zvíře a jeho vlastnosti ? Jak pro kontrolu vypsat celý strom ? Kolik uzlů má strom a kolik obsahuje zvířat a vlastností ? Jak vypsat jen ta zvířata, která splňují jen určit(ou|é) vlastnost[i] ? Dal by se systém rozšířit i na nezvířata ? Nenapadlo vás ještě něco ? Pokud jste bedlivě sledovali předmět X36ALG tj. Algoritmizace, nemělo by vám vylepšení zoologického programu činit nepřekonatelné potíže. Přejeme vám úspěšné získání klasifikovaného zápočtu. alg13