Základní datové struktury



Podobné dokumenty
Lineární datové struktury

Dynamické datové struktury I.

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

Datové struktury. alg12 1

Abstraktní datové typy

Algoritmizace prostorových úloh

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

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

Lineární datové struktury

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

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

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

Algoritmizace prostorových úloh

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

ADT/ADS = abstraktní datové typy / struktury

Abstraktní datové typy: zásobník

Dynamické datové struktury IV.

Kolekce, cyklus foreach

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

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

Maturitní téma: Programovací jazyk JAVA

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

Konstruktory a destruktory

ABSTRAKTNÍ DATOVÉ TYPY

TÉMATICKÝ OKRUH TZD, DIS a TIS

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

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

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Šablony, kontejnery a iterátory

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

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

Šablony, kontejnery a iterátory

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

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

Datové typy a struktury

Reprezentace dat v informačních systémech. Jaroslav Šmarda

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

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

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

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

Zadání k 2. programovacímu testu

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

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Abstraktní třídy, polymorfní struktury

2. Mřížky / Záplavové vyplňování

IUJCE 07/08 Přednáška č. 6

PB071 Programování v jazyce C Jaro 2013

Pointery II. Jan Hnilica Počítačové modelování 17

Algoritmy a datové struktury

Abstraktní datový typ

Jazyk C++ II. STL knihovna kontejnery část 2

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

Dynamické datové struktury III.

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

Rekurzivní algoritmy

Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy

PB161 Programování v jazyce C++ Přednáška 3

Prioritní fronta, halda

Zásobník (LIFO) Opakem zásobníku LIFO je fronta FIFO (First In, First Out první dovnitř, první ven)

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

Abstraktní datový typ

Část I. Část 1 Abstraktní datový typ. Přehled témat. Abstraktní datový typ. Zdroje

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

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.

Maturitní otázky z předmětu PROGRAMOVÁNÍ

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Jazyk C++ II. STL knihovna kontejnery část 1

Dynamické datové typy a struktury

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Programovanie v jazyku C - to chce dynamiku

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

Část 1 Abstraktní datový typ. Datové struktury a abstraktní datový typ

Funkce, intuitivní chápání složitosti

Algoritmy výpočetní geometrie

Složitosti základních operací B + stromu

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

Stromy, haldy, prioritní fronty

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

Základy algoritmizace. Hašování

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

Část I Spojové struktury

Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Abstraktní datové typy FRONTA

Algoritmy II. Otázky k průběžnému testu znalostí

Základy programování (IZP)

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

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Základy programování (IZP)

Př. další použití pointerů

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

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Sdílení dat mezi podprogramy

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

Základní datové struktury III: Stromy, haldy

Abstraktní datové typy

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Semestrální práce 2 znakový strom

bfs, dfs, fronta, zásobník

Transkript:

Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 1 / 27

Datová struktura Volně řečeno, způsob uložení dat v počítači a způsob jakým s těmito daty můžeme pracovat. Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 2 / 27

Abstraktní datová struktura Neformální definice: Datová struktura, která není závislá na vlastní implementaci a která je definována pomocí povolených operací na této struktuře. Formálně lze definovat jako matematický model (nepřímá definice pomocí operací - neříkáme co to je, ale co s tím lze dělat). Nezajímá nás konkrétní implementace, ale rozhraní, které struktura poskytuje. Implementace je ale také důležitá (ukážeme později). Konkrétní implementace je označována pojmem datová struktura. Motivace: Zjednodušují návrh algoritmů a přinášejí abstrakci do programování. Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 3 / 27

Abstraktní proměnná Nejzákladnější, netriviální abstraktní datová struktura. Operace definované nad proměnou: zapsání, smazání, modifikace proměnné čtení obsahu proměnné Pozor! Proměnná v jazyce C je element jazyka. To není totéž jako abstraktní datová struktura proměnná. Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 4 / 27

Abstraktní pole Základní abstraktní datová struktura. Reprezentuje kolekci, která obsahuje prvky. Ty jsou složeny z párů ve tvaru (kĺıč, hodnota). Operace definované nad polem: přidání páru ke kolekci odstranění páru z kolekce modifikace páru v kolekci přístup k hodnotě spojené s konkrétním kĺıčem Pozor! Pole v jazyce C je datový typ. To není totéž jako abstraktní datová struktura pole. Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 5 / 27

Seznam (anglicky list) Nejobecnější abstraktní datová struktura. Množina (kolekce) n 0 prvků, přičemž tyto prvky jsou uloženy lineárně za sebou (k-tý prvek seznamu je před k 1 prvkem seznamu). Operace definované na seznamu: přístup, modifikace k-tého prvku smazání k-tého prvku vložení před, za k-tý prvek spojení, rozdělení seznamu setřízení seznamu vyhledání v seznamu Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 6 / 27

Seznam - příklad Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 7 / 27

Zásobník (anglicky stack) Princip práce s daty: Data, která jsou uložena jako poslední jsou čtena jako první. Lze si jí představit jako obyčejný zásobník do pistole. Abstraktní datová struktura typu LIFO (Last In First Out). Kĺıčový prvek je vrchol zásobníku, který představuje poslední uložený prvek. Operace definované na zásobníku: push - uložení prvku na vrchol zásobníku pop - odebrání prvku z vrcholu zásobníku top - vrací prvek na vrcholu zásobníku (neodebere jej) is empty - predikát prázdnosti zásobníku Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 8 / 27

Zásobník - příklad Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 9 / 27

Fronta (anglicky queue) Princip práce s daty: Data, která jsou uložena jako první jsou čtena jako první. Lze si jí představit jako obyčejnou frontu v obchodě. Abstraktní datová struktura typu FIFO (First In First Out). Kĺıčové prvky jsou začátek a konec fronty. Operace definované na frontě: push - uložení prvku na konec fronty pop - odebrání prvku ze začátku fronty is full - predikát plnosti fronty is empty - predikát prázdnosti fronty Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 10 / 27

Fronta - příklad Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 11 / 27

Varianty fronty Obousměrná fronta (anglicky double-ended queue), modifikace jednosměrné fronty. Data lze přidávat a odebírat z konce i ze začátku fronty. Fronta s prioritami (prvky mohou předbíhat). Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 12 / 27

Další abstraktní datové struktury Strom Graf Množina Kontejner Slovník další Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 13 / 27

Druhá strana - implementace Implementace je z pohledu abstraktních datových struktur nepodstatná. Z pohledu jejich používání (programování) je však kruciální a to zejména efektivita implementace jednotlivých operací nad datovou strukturou. Je velice obtížné vytvořit implementaci, kde by všechny operace byly efektivní. Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 14 / 27

Seznam - implementace Základní dynamická datová struktura, které je pamět přidělována dynamicky. Jedná se o konkrétní implementaci. Prvky seznamu jsou tvořeny uzly (pomocnou datovou strukturou), které obsahují kromě samotného prvku, ukazatele na další uzel. Pro práci se seznamem je kĺıčový začátek (head) seznamu a v některých případech i konec (tail) seznamu. Typy seznamů: jednosměrný seznam obousměrný seznam cyklický seznam Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 15 / 27

Seznam - příklady Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 16 / 27

Seznam vs. pole Na rozdíl od pole prvky v seznamu nemusí být v paměti uloženy lineárně za sebou. Práce se seznamem, nevyžaduje dodatečnou práci s pamětí (nevyžaduje realokaci paměti při přidávání a odebírání prvků). Vyhledávání, vkládání a mazání je pomalejší než u pole (proč?). Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 17 / 27

Zásobník - implementace Pomocí pole (statická struktura). Pomocí seznamu (dynamická struktura, využívá pointry). Ve většině jazyků již existuje. Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 18 / 27

Zásobník - implementace polem I. int zasobnik[5]; void push(int x, int zasobnik) { int pocet_prvku = sizeof(zasobnik) / sizeof(int); if(pocet_prvku == 5) { printf("zasobnik je plny"); exit(); } else zasobnik[++pocet_prvku] = x; return; } Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 19 / 27

Zásobník - implementace polem II. int pop(int zasobnik) { int pocet_prvku = sizeof(zasobnik) / sizeof(int); if(pocet_prvku == 0) { printf("zasobnik je prazdny"); exit(); } else return zasobnik[pocet_prvku--]; } Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 20 / 27

Zásobník - implementace seznamem Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 21 / 27

Fronta - implementace Pomocí pole (podobna jako zásobník, navíc ukazatel na začátek). Pomocí seznamu. Ve většině jazyků již existuje. Výběr struktury určuje složitost operací. Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 22 / 27

Fronta - implementace seznamem I. struct fronta { int hodnota; struct fronta* dalsi; }; Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 23 / 27

Fronta - implementace seznamem II. void push(int hodnota, struct fronta* f) { struct fronta* novy = (struct fronta*) malloc(sizeof(struct fronta)); struct fronta* pomocna = f; novy->hodnota = hodnota; novy->dalsi = NULL; while(pomocna->dalsi) { pomocna = pomocna->dalsi; } pomocna->dalsi = novy; } Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 24 / 27

Fronta - implementace seznamem III. int pop(struct fronta* f) { int hodnota = f->hodnota; *f = *f->dalsi; return hodnota; } Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 25 / 27

Fronta - implementace seznamem IV. int main(int argc, char* argv[]) { struct fronta *f = (struct fronta*) malloc(sizeof(struct fronta)); f->hodnota = 10; f->dalsi = NULL; push(11, f); push(12, f); push(13, f); printf("%d\n", pop(f)); printf("%d\n", pop(f)); printf("%d\n", pop(f)); return 0; } Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 26 / 27

Fronta - implementace polem Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013 27 / 27