Datové struktury. alg12 1



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

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

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Základní datové struktury

Abstraktní datové typy: zásobník

Konstruktory a destruktory

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

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

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

ADT/ADS = abstraktní datové typy / struktury

Dynamické datové struktury I.

Abstraktní datové typy

Algoritmizace prostorových úloh

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

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

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

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

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

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

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

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

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

Kolekce, cyklus foreach

Soubor jako posloupnost bytů

Textové soubory. alg9 1

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

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

Algoritmizace prostorových úloh

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.

Programování v Javě I. Leden 2008

Úvod do programovacích jazyků (Java)

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

KTE / ZPE Informační technologie

Výčtový typ strana 67

Dynamické datové struktury IV.

Lineární datové struktury

Regulární výrazy. Vzory

Šablony, kontejnery a iterátory

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

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

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

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

Maturitní téma: Programovací jazyk JAVA

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

Řídicí struktury. alg3 1

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

Typický prvek kolekce pro české řazení

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

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

Lineární datové struktury

Rozklad problému na podproblémy

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

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

7. Datové typy v Javě

Principy objektově orientovaného programování

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

PREPROCESOR POKRAČOVÁNÍ

Šablony, kontejnery a iterátory

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

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í

Algoritmizace a programování

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

Úvod do programovacích jazyků (Java)

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

Abstraktní třídy, polymorfní struktury

Algoritmy a datové struktury

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

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

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

Algoritmizace. Cíle předmětu

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

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

Generické programování

Abstraktní datové typy FRONTA

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

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

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

Iterator & for cyklus

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

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

Třída jako zdroj funkcí

7. Dynamické datové struktury

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

typová konverze typová inference

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

1. Programování proti rozhraní

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

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

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

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

Zásobník (Stack), Fronta (Queue), Kruhový buffer, Spojový seznam, Množina

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

Abstraktní datové typy

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

Programovací jazyk Java

Teoretické minimum z PJV

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

Transkript:

Datové struktury Jedna z klasických knih o programování (autor prof. Wirth) má název Algorithms + Data structures = Programs Datová struktura je množina dat (prvků, složek, datových objektů), pro kterou jsou definovány určité operace a stanoven způsob reprezentace (implementace) Datová struktura je statická, jestliže počet složek datové struktury je neměnný Statické datové struktury jsou ve vyšších programovacích jazycích přímo podporovány strukturovanými datovými typy (pole, řetězec, třída) Datová struktura je dynamická, jestliže počet jejích složek je proměnný (mezi operace patří např. vložení nového prvku, odebrání určitého prvku, atd.) Dynamickou datovou strukturou je např. zásobník, fronta, tabulka apod. V knihovně jazyka Java najdeme mnoho tříd pro práci s různými typy datových struktur V každé třídě realizující nějaký typ datové struktury jsou pro operace s datovou strukturou zavedeny veřejné instanční metody, implementace je však neveřejná Stejným způsobem budeme postupovat při návrhu vlastních datových struktur alg12 1

Zásobník Zásobník (stack) je datová struktura, která umožňuje vkládání a odebírání hodnot, přičemž naposledy vložená hodnota se odebere jako první Zásobník je paměť typu LIFO (zkratka z angl. last-in first-out, poslední dovnitř, první ven) vložení hodnoty na vrchol zásobníku odebrání hodnoty z vrcholu zásobníku Základní operace: vložení hodnoty na vrchol zásobníku odebrání hodnoty z vrcholu zásobníku test na prázdnost zásobníku alg12 2

Zásobník 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() {...... Poznámky v angličtině se operace nad zásobníkem obvykle jmenují push, pop a isempty 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) Implementací zásobníku se prozatím nebudeme zabývat, ukážeme si nejprve jeho použití alg12 3

Příklad použití zásobníku Program, který přečte výraz obsahující tři druhy závorek a zkontroluje jejich správné párování příklad správného párování: { [ ] ( ) 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: jestliže znak je otevírací závorka, pak jej uložíme do zásobníku jestliže znak je zavírací závorka, pak 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 jestliže znak není závorka, pak nás nezajímá 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) alg12 4

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) { Sys.pln(" chyba: "+str); System.exit(0); alg12 5

Párování závorek Hlavní funkce: public class Zavorky { public static void main(string[] args) { ZasobnikZnaku zasobnik = new ZasobnikZnaku(); Sys.pln("zadejte řádek se závorkami"); String str = Sys.readLine(); int i; for (i=0; i<str.length(); i++) { char znak = str.charat(i); Sys.p(znak); if (jeoteviraci(znak)) zasobnik.vloz(znak); else if (jezaviraci(znak)) { if (zasobnik.jeprazdny()) chyba("k této závorce chybí otevírací"); char ocekavany = zaviracik(zasobnik.odeber()); if (znak!=ocekavany) chyba("očekává se "+ocekavany); alg12 6

Párování závorek if (!zasobnik.jeprazdny()) { String chybi = ""; do { chybi = chybi + zasobnik.odeber(); while (!zasobnik.jeprazdny()); chyba("chybí zavírací závorky k "+chybi); Sys.pln(); alg12 7

Implementace zásobníku polem pole vrchol 2 { ( [ volné prvky 0 1 2 MAXINDEX class ZasobnikZnaku { static final int MAXINDEX = 99; private char[] pole; private int vrchol; public ZasobnikZnaku() { pole = new char[maxindex+1]; vrchol = -1; alg12 8

Implementace zásobníku polem public void vloz(char z) { if (vrchol==maxindex) throw new RuntimeException ("vložení do plného zásobníku"); pole[++vrchol] = z; public char odeber() { if (vrchol<0) throw new RuntimeException ("odebráni z prázdného zásobniku"); return pole[vrchol--]; public boolean jeprazdny() { return vrchol<0; Poznámka: RuntimeException je třída výjimek, jejichž šíření z funkce není třeba deklarovat v hlavičce funkce alg12 9

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; 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;... alg12 10

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 ( { [ 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; alg12 11

Implementace zásobníku spojovým seznamem public void vloz(char z) { vrchol = new Prvek(z, vrchol); public char odeber() { if (vrchol==null) throw new RuntimeException ("odebrani z prazdneho zasobniku"); char vysl = vrchol.hodn; vrchol = vrchol.dalsi; return vysl; public boolean jeprazdny() { return vrchol==null; alg12 12

Fronta Fronta je datová struktura podobná zásobníku, hodnoty se však odebírají v tom pořadí, v jakém byly vloženy Fronta je 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: pomocí pole pomocí spojového seznamu alg12 13

Implementace fronty spojovým seznamem celo X1 X2 X3 volny class PrvekFronty { PrvekFronty dalsi; int hodn; public class FrontaCisel { private PrvekFronty celo; private PrvekFronty volny; alg12 14

Implementace fronty spojovým seznamem public FrontaCisel() { celo = new PrvekFronty(); volny = celo; public void vloz(int x) { volny.hodn = x; volny.dalsi = new PrvekFronty(); volny = volny.dalsi; public int odeber() { if (jeprazdna()) throw new RuntimeException("odebrání z prázdné fronty"); int vysl = celo.hodn; celo = celo.dalsi; return vysl; public boolean jeprazdna() { return celo == volny; alg12 15

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 alg12 16

Použití fronty: přihrádkové řazení static int hexcislice(int x, int r) { return (x >> 4*r) & 0xF; static void casesort(int[] pole) { FrontaCisel[] prihradky = new FrontaCisel[16]; int r, j, c; for (c=0; c<16; c++) prihradky[c] = new FrontaCisel(); for (r=0; r<8; r++) { for (j=0; j<pole.length; j++) prihradky[hexcislice(pole[j],r)].vloz(pole[j]); j = 0; for (c=0; c<16; c++) while (!prihradky[c].jeprazdna()) pole[j++] = prihradky[c].odeber(); alg12 17