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

Podobné dokumenty
Datové struktury. alg12 1

Abstraktní datové typy: zásobník

Algoritmizace prostorových úloh

Základní datové struktury

Abstraktní datové typy

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

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

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

Algoritmizace prostorových úloh

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

Konstruktory a destruktory

ADT/ADS = abstraktní datové typy / struktury

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

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

Dynamické datové struktury I.

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

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

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

Lineární datové struktury

Kolekce, cyklus foreach

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

Algoritmizace a programování

Úvod do programovacích jazyků (Java)

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

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

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

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

IRAE 07/08 Přednáška č. 7. Začátek (head)

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory

Dynamické struktury a Abstraktní Datový Typy (ADT)

Část 1 Spojové struktury (stromy) Dynamické struktury a Abstraktní Datový Typy (ADT) Část 2 Abstraktní datový typ. Část 3 Příklad ADT Prioritní fronta

Abstraktní datové typy

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

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.

Da D to t v o é v ty t py IB111: Datové typy

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

KTE / ZPE Informační technologie

Lineární datové struktury

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

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

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

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Výčtový typ strana 67

Dynamické datové struktury IV.

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

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

Úvod do programovacích jazyků (Java)

Programování v Javě I. Leden 2008

typová konverze typová inference

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

Abstraktní třídy, polymorfní struktury

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

Generické programování

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

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

Řídicí struktury. alg3 1

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

Abstraktní datové typy FRONTA

PREPROCESOR POKRAČOVÁNÍ

Algoritmizace a programování

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

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

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_25 09

Seminář Java IV p.1/38

Datové struktury 1: Základní datové struktury

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/

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

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

Soubor jako posloupnost bytů

Datové typy a struktury

boolean hasnext() Object next() void remove() Kolekce

Dynamika objektů. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze

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

Datové struktury obsah přednášky 1. Úvod 2. Třídy Type-wrapper (obalový typ) pro primitivní typy automatické převody 3. Automatické převody mezi

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací.

Regulární výrazy. Vzory

Abstraktní datový typ

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

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

Spojová implementace lineárních datových struktur

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

Typický prvek kolekce pro české řazení

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

Rozklad problému na podproblémy

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

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

7. Dynamické datové struktury

Iterator & for cyklus

7. Datové typy v Javě

5 Přehled operátorů, příkazy, přetypování

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

prohled av an ı graf u Karel Hor ak, Petr Ryˇsav y 16. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

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

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

Spojové struktury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 A0B36PR1 Programování 1

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

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

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

Transkript:

Obsah přednášky: Definice pojmů o datový typ, o abstraktní datový typ Datové struktury Abstraktní datové typy a jejich implementace o Fronta (Queue) o Zásobník (Stack) o Množina (Set) Algoritmizace (Y36ALG), Šumperk - 12. přednáška 1

Datové struktury Klasická kniha o programování N. Wirth: Algorithms + Data structures = Programs Datová struktura (typ) = množina dat + operace s těmito daty Abstraktní datový typ - formálně definuje data a operace s nimi, např. o Fronta (Queue) o Zásobník (Stack) o Pole (Array) o Tabulka (Table) o Seznam (List) o Strom (Tree) o Množina (Set) Algoritmizace (Y36ALG), Šumperk - 12. přednáška 2

Abstraktní datový typ Abstraktní datový typ je množina druhů dat (hodnot) a příslušných operací, které jsou přesně specifikovány, a to nezávisle na konkrétní implementaci. Definovat lze o Matematicky signatura a axiomy o Jako rozhraní (interface) s popisem operací Interface poskytuje konstruktor, který vrací abstraktní odkaz a operace, které akceptují odkaz jako argument a které mají přesně definovaný účinek na data Algoritmizace (Y36ALG), Šumperk - 12. přednáška 3

Příklad1: ADT - popis matematicky I Datový typ boolean o o Syntaxe popisuje, jak správně vytvořit logický výraz: 1. true, false jsou logické výrazy, 2. if x,y jsou logické výrazy, pak i.! (x) - negace ii. (x & y) - logický součin (and) iii. (x y) - logický součet (or) iv. (x==y), (x!=y) - relační operátory jsou logické výrazy. Pokud nechceme u každé operace psát závorky, musíme definovat priority operátorů. Sémantika popisuje význam jednotlivých operací. Lze definovat pomocí axiomů: 1)!(true) = false 2)!(false) = true 3) x & false = false 4) x & true = x 5) x & y = y & x 6) x true = true 7) x false = x 8) x y = y x Algoritmizace (Y36ALG), Šumperk - 12. přednáška 4

Příklad1: ADT - popis matematicky II Datový typ boolean o Sémantika, pokračování 9) true == true = true 10) true == false = false 11) false == false = true 12) false == true = false Algoritmizace (Y36ALG), Šumperk - 12. přednáška 5

Příklad1: ADT - popis matematicky II Datový typ boolean o Sémantika, pokračování 9) true == true = true 10) true == false = false 11) false == false = true 12) false == true = false nebo lépe(vhodnější pro úpravy): 9) true == x = x 10) false == x =!x 11) x==y = y==x dále by následovala sémantika pro!= Algoritmizace (Y36ALG), Šumperk - 12. přednáška 6

Příklad2: ADT - programově public interface Citac { public int gethodnota(); public void zvetsi(); public void zmensi(); public void reset(); Abstraktní datový typ, pouze rozhraní public class MujCitac implements Citac { private int hodnota = 0; public int gethodnota(){return hodnota; public void zvetsi(){hodnota++; public void zmensi(){hodnota--; public void reset(){hodnota = 0; Implementace datového typu Pro uživatele je implementace skryta, používá jen veřejné metody objektu. Algoritmizace (Y36ALG), Šumperk - 12. přednáška 7

Dělení (abstraktních) datových typů Počet položek: o neměnný = statický datový typ, počet položek je konst. (pole, řetězec, třída) o proměnný = dynamický datový typ, počet složek je proměnný, mezi operace patří vložení, odebrání určitého prvku Typ položek, dat: o homogenní = všechny položky stejného typu o nehomogenní = položky mohou být různého typu Existence bezprostředního následníka o lineární = existuje (např. pole, fronta, seznam, ) o nelineární = neexistuje (strom, tabulka, ) Algoritmizace (Y36ALG), Šumperk - 12. přednáška 8

Zásobník ( Stack ) Je to dynamická datová struktura, umožňující vkládání a odebírání hodnot, přičemž naposledy vložená hodnota se odebere jako první. Je to paměť typu LIFO ( zkratka z angl. Last-In First-Out; poslední dovnitř, první ven ) vložení hodnoty na vrchol odebrání hodnoty z vrcholu Základní operace: o vložení hodnoty na vrchol zásobníku o odebrání hodnoty z vrcholu zásobníku o test na prázdnost zásobníku Algoritmizace (Y36ALG), Šumperk - 12. přednáška 9

Příklad třídy realizující zásobník znaků: class ZasobnikZnaku { public ZasobnikZnaku() {... public void vloz(char z) {... public char odeber() {... public boolean jeprazdny() {...... Zásobník Poznámky o v angličtině se operace nad zásobníkem obvykle jmenují push, pop a isempty o pro zásobník může být definována ještě operace čtení hodnoty z vrcholu zásobníku bez jejího odebrání (v angl. top či peek) Implementací zásobníku se prozatím nebudeme zabývat, ukážeme si nejprve jeho použití. Algoritmizace (Y36ALG), Šumperk - 12. přednáška 10

Příklad použití zásobníku Kontrola párování závorek - program, který přečte výraz obsahující tři druhy závorek a zkontroluje jejich správné párování o příklad správného párování: { [ ] ( ) o příklad nesprávného párování: { [ ( ] ) Nástin řešení: 1. Postupně projdeme všechny znaky tvořící výraz. Pro každý znak mohou nastat tři případy: znakem je otevírací závorka: Uložíme ji do zásobníku. znakem je zavírací závorka: Ze zásobníku (musí být neprázdný) odebereme naposledy uloženou otevírací závorku a zjistíme, zda odpovídá zavírací závorce. Pokud neodpovídá, tak nastala chyba párování. jiný znak: Žádná operace. 2. Po zpracování všech znaků výrazu musí být zásobník prázdný (pokud není, pak chybí zavírací závorky). Algoritmizace (Y36ALG), Šumperk - 12. přednáška 11

Párování závorek Pomocné funkce: static boolean jeoteviraci(char z) { return z=='(' z=='[' z=='{'; static boolean jezaviraci(char z) { return z==')' z==']' z==''; static char zaviracik(char z) { if (z=='(') return ')'; if (z=='[') return ']'; if (z=='{') return ''; return z; static void chyba(string str) { Systém.out.println( " chyba: " + str); System.exit(0); Algoritmizace (Y36ALG), Šumperk - 12. přednáška 12

Párování závorek Hlavní metoda: public class Zavorky { public static void main(string[] args) { Scanner sc = new Scanner(System.in); ZasobnikZnaku zasobnik = new ZasobnikZnaku(); Systém.out.println( "zadejte radek se zavorkami" ); String str = sc.nextline(); int i; for (i=0; i<str.length(); i++) { char znak = str.charat(i); System.out.print(znak); if (jeoteviraci(znak)) zasobnik.vloz(znak); else if (jezaviraci(znak)) { if (zasobnik.jeprazdny()) chyba( "k zavorce chybi otevíraci" ); char ocekavany = zaviracik(zasobnik.odeber()); if (znak!=ocekavany) chyba( "ocekava se " + ocekavany); Algoritmizace (Y36ALG), Šumperk - 12. přednáška 13

Párování závorek if (!zasobnik.jeprazdny() ) { String chybi = "" ; do { chybi = chybi + zasobnik.odeber(); while (!zasobnik.jeprazdny() ); chyba( "chybi zaviraci zavorky k " + chybi ); Systém.out.println(); Algoritmizace (Y36ALG), Šumperk - 12. přednáška 14

Implementace zásobníku polem pole { ( [ { volné prvky 0 1 2 MAX_INDEX vrchol 2 class ZasobnikZnaku { static final int MAX_INDEX = 99; private char[] pole; private int vrchol; public ZasobnikZnaku() { // konstruktor pole = new char[max_index+1]; vrchol = -1; Algoritmizace (Y36ALG), Šumperk - 12. přednáška 15

Implementace zásobníku polem public void vloz(char z) { if ( vrchol==max_index ) throw new RuntimeException( "plný zásobník" ); pole[++vrchol] = z; Pozor na správnou posloupnost akcí! public char odeber() { if ( vrchol<0 ) throw new RuntimeException( "prázdný zásobník" ); return pole[vrchol--]; public boolean jeprazdny() { return vrchol<0; Poznámka: RuntimeException je třída výjimek, jejichž šíření z metody netřeba deklarovat v hlavičce metody. Algoritmizace (Y36ALG), Šumperk - 12. přednáška 16

Implementace zásobníku rozšiřitelným polem Při vkládání do plného zásobníku lze vytvořit nové, větší pole a původní pole do něj zkopírovat. public class ZasobnikZnaku2 { private char[] pole; private int vrchol; public ZasobnikZnaku2() { pole = new char[2]; vrchol = -1; dvojnásobná velikost nového pole zaručuje průměrnou konstantní dobu vložení jednoho prvku public void vloz(char z) { if (vrchol==pole.length-1) { char[] nove = new char[2*pole.length]; System.arraycopy(pole,0,nove,0,pole.length); pole = nove; pole[++vrchol] = z;... Algoritmizace (Y36ALG), Šumperk - 12. přednáška 17

Implementace zásobníku spojovým seznamem Spojový seznam je datová struktura, jejíž prvky tvoří posloupnost a každý prvek obsahuje odkaz na další prvek seznamu. vrchol ( { [ null class Prvek { char hodn; Prvek dalsi; public Prvek(char h, Prvek p) { hodn = h; dalsi = p; class ZasobnikZnaku { private Prvek vrchol; public ZasobnikZnaku() { vrchol = null; Algoritmizace (Y36ALG), Šumperk - 12. přednáška 18

Implementace zásobníku spojovým seznamem vrchol ( { [ null public void vloz(char z) { vrchol = new Prvek(z, vrchol); public char odeber() { if (vrchol==null) throw new RuntimeException( "prazdny zasobnik" ); char vysl = vrchol.hodn; vrchol = vrchol.dalsi; return vysl; public boolean jeprazdny() { return vrchol==null; Algoritmizace (Y36ALG), Šumperk - 12. přednáška 19

Fronta ( Queue ) Fronta je datová struktura v níž se hodnoty odebírají v tom pořadí, v jakém byly vloženy. Je to paměť typu FIFO (zkratka z angl. First-In First-Out; první dovnitř, první ven).... vložení hodnoty na konec fronty odebrání hodnoty z čela fronty Implementace fronty: o pomocí pole o pomocí spojového seznamu Algoritmizace (Y36ALG), Šumperk - 12. přednáška 20

Implementace fronty spojovým seznamem celo x1 x2 x3 volny class PrvekFronty { PrvekFronty dalsi; int hodn; Algoritmizace (Y36ALG), Šumperk - 12. přednáška 21

Implementace fronty spojovým seznamem celo x1 x2 x3 volny public class FrontaCisel { private PrvekFronty celo; private PrvekFronty volny; public FrontaCisel() { celo = new PrvekFronty(); volny = celo; public void vloz(int x) { volny.hodn = x; volny.dalsi = new PrvekFronty(); volny = volny.dalsi; Algoritmizace (Y36ALG), Šumperk - 12. přednáška 22

Implementace fronty spojovým seznamem public int odeber() { if (jeprazdna()) throw new RuntimeException( " prazdna fronta" ); int vysl = celo.hodn; celo = celo.dalsi; return vysl; public boolean jeprazdna() { return celo == volny; Algoritmizace (Y36ALG), Šumperk - 12. přednáška 23

Použití fronty: přihrádkovéřazení 1. průchod 223 131 458 193 756 812 027 579 283 200 rozdělení podle posledníčíslice 283 193 200 131 812 223 756 027 458 579 0 1 2 3 4 5 6 7 8 9 2. průchod 200 131 812 223 193 283 756 027 458 579 rozdělení podle druhéčíslice 027 458 200 812 223 131 756 579 283 193 0 1 2 3 4 5 6 7 8 9 3. průchod 200 812 223 027 131 756 458 579 283 193 rozdělení podle prvníčíslice 283 193 223 027 131 200 458 579 756 812 0 1 2 3 4 5 6 7 8 9 Výstup:027 131 193 200 223 283 458 579 756 812 Algoritmizace (Y36ALG), Šumperk - 12. přednáška 24

Použití fronty: přihrádkovéřazení vlastní static int hexcislice(int x, int r) {// snazší manipulace v hexadec. return (x >> 4*r) & 0xF; třídění static void casesort(int[] pole) { FrontaCisel[] prihradky = new FrontaCisel[16];//16 šuplíků int r, j, c; for ( c=0; c<prihradky.length; c++ ) prihradky[c] = new FrontaCisel();// každý šuplík je fronta for ( r=0; r<8; r++ ) { // rozskatulkuj for ( j=0; j<pole.length; j++ ) prihradky[hexcislice(pole[j],r)].vloz(pole[j]); // seraď j = 0; for ( c=0; c<prihradky.length; c++ ) while (!prihradky[c].jeprazdna() ) pole[j++] = prihradky[c].odeber(); Algoritmizace (Y36ALG), Šumperk - 12. přednáška 25

Implementace fronty - kruhový buffer Implementace pomocí pole. Dva ukazatele o first, ukazatel na první prvek fronty, bude prvníčten o last, ukazatel na poslední prvek, sem se přidává A F D S E first last length-1 0 1 2 3 4 Algoritmizace (Y36ALG), Šumperk - 12. přednáška 26

Implementace fronty - kruhový buffer, příklad Fronta je prázdná, pokud last == first Po vložení (výběru) prvku se nová hodnota ukazatele vypočítá: last = (last+1) % pole.length resp. first = (first+1) % pole.length Jak se pozná, že je fronta plná? vloz(5); vloz(2); last vloz(23); další = odeber(); vloz(8); 0 1 2 3 5 2 23 8 4 5 6 7 8 9 10 další = odeber(); další = odeber(); first Algoritmizace (Y36ALG), Šumperk - 12. přednáška 27

Operace add, vložení prvku (bez opakování) remove, smazání prvku ADT množina contains, test, zda je prvek v množině obsažen isempty, test na prázdnost size, zjištění velikosti equals, test na shodu containsall(množina), zjištění, zda je daná množina podmnožinou x.add(45) bez efektu x.add(15) x.remove(8) x.contains(3). true x.isempty false x.size() 7 23 45 3 x 78 8 1 15 7 Algoritmizace (Y36ALG), Šumperk - 12. přednáška 28