Lineární datové struktury

Podobné dokumenty
Lineární datové struktury

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

Základní datové struktury

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

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

Kolekce, cyklus foreach

Dynamické datové struktury I.

Algoritmizace prostorových úloh

Abstraktní datové typy

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

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

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

Algoritmizace prostorových úloh

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

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

ADT/ADS = abstraktní datové typy / struktury

Datové typy a struktury

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

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

TÉMATICKÝ OKRUH TZD, DIS a TIS

Binární vyhledávací stromy II

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

Konstruktory a destruktory

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

Hašování. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

Abstraktní datové typy: zásobník

Šablony, kontejnery a iterátory

Maturitní téma: Programovací jazyk JAVA

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

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

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

Datové struktury. alg12 1

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

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Dynamická alokace paměti

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

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

Dynamické datové struktury IV.

Šablony, kontejnery a iterátory

Datové struktury 2: Rozptylovací tabulky

ABSTRAKTNÍ DATOVÉ TYPY

Přidělování CPU Mgr. Josef Horálek

Zadání k 2. programovacímu testu

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

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

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

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

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

Základy algoritmizace. Hašování

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.

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

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

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

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

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

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

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

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

Algoritmizace a programování

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

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

Management procesu I Mgr. Josef Horálek

Paralelní programování

Struktura programu v době běhu

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

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

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

PA152. Implementace databázových systémů

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

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

Stromy, haldy, prioritní fronty

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

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

Abstraktní datové typy FRONTA

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Maturitní témata Školní rok: 2015/2016

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

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

NMIN102 Programování /2 Z, Zk

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

Rekurzivní algoritmy

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

Paměti a jejich organizace

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

Dynamické datové struktury III.

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

O datových typech a jejich kontrole

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

Základy programování (IZP)

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

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

Přidělování paměti II Mgr. Josef Horálek

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Abstraktní datové typy

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

Procesy a vlákna (Processes and Threads)

Transkript:

Lineární datové struktury doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB TUO) Lineární datové struktury 43 / 309

Osnova přednášky Lineární datové struktury Datové struktury Zásobník Fronta Seznam Jiří Dvorský (VŠB TUO) Lineární datové struktury 44 / 309

Datové struktury určitý způsob ukládání a organizace dat v počítači, cílem je efektivní manipulace s daty, specializace na různé úlohy, obsaženy v takřka každém programu, efektivní datová struktura je základem pro efektivní algoritmy, implementace datové struktury vyžaduje implementaci příslušných operací, abstraktní datový typ matematická abstrakce datové struktury. Jiří Dvorský (VŠB TUO) Lineární datové struktury 45 / 309

Datové struktury specializace datové struktury jsou přizpůsobeny pro odlišné druhy aplikací B-stromy základ implementace SQL databází hašovací tabulky ukládání informací o identifikátorech při kompilaci zdrojového kódu zásobník volání funkcí, interpretace aritmetických výrazů Jiří Dvorský (VŠB TUO) Lineární datové struktury 46 / 309

Datové struktury význam základní stavební kámen softwarových systémů obvykle je efektivní datová struktura klíčem k efektivnímu algoritmu! klíčový faktor v softwarovém inženýrství Jiří Dvorský (VŠB TUO) Lineární datové struktury 47 / 309

Datové struktury vs. Abstraktní datové typy implementace datové struktury vede k implementaci operací, které vytváří a manipulují s instancemi dané struktury, efektivitu datové struktury nelze oddělit od efektivity implementovaných operací jak tedy datovou strukturu implementovat? co je rozhodující? jaké jsou limity možností? abstraktní datový typ (ADT) teoretická definice, plus popis operací datová struktura je konkrétní implementací ADT například ADT zásobník (stack) lze implementovat mnoha způsoby Jiří Dvorský (VŠB TUO) Lineární datové struktury 48 / 309

Zásobník (Stack) Charakteristika princip last-in, first-out, LIFO prvek, který byl vložen poslední, je jako první ze zásobníku vyzvednut Atributy prvky vkládáme na tzv. vrchol zásobníku (stack pointer). Ukazatel zásobníku není nutně ukazatel ve smyslu práce s dynamicky alokovanou pamětí, haldou. prvně vložený prvek se nazývá dno zásobníku (stack bottom) Jiří Dvorský (VŠB TUO) Lineární datové struktury 49 / 309

2. přednáška Zásobník, pokračování Zásobník operace Rídící struktury Datové typy Lineární datové struktury Push(15) Push(17) Pop() a) Push(15); Push(6); Push(3) Push(2); Push(9); b) Push(17); Push(2) Push(3); c) Pop(); Push(9) Úvod do programování c2005 Michal Krátký, Jiří Dvorský 30/34 Jiří Dvorský (VŠB TUO) Lineární datové struktury 50 / 309

Zásobník, pokračování Operace Push vložení prvku na vrchol zásobníku Pop vyjmutí prvku z vrcholu zásobníku IsEmpty test prázdnosti zásobníku Top vrátí prvek z vrcholu zásobníku bez jeho vyjmutí Operace mají konstantní časovou složitost. Chybové stavy Pokud provedeme operaci Pop na prázdném zásobníku nastává tzv. podtečení (stack underflow). Pokud není možné přidat další prvek, nastává tzv. přetečení (stack overflow). Jiří Dvorský (VŠB TUO) Lineární datové struktury 51 / 309

Zásobník, pokračování Využití zásobníku volání funkcí (metod) vyhodnocování aritmetických výrazů odstranění rekurze zásobníkově orientované jazyky, například PostScript, PDF testování parity závorek, HTML/XML značek Jiří Dvorský (VŠB TUO) Lineární datové struktury 52 / 309

Zásobník, příklad Testování parity závorek testovat správnost uzávorkování různé typy závorek levé závorky vkládáme do zásobníku při nalezení pravé otestujeme, zda máme v zásobníku odpovídající závorku musíme končit s prázdným zásobníkem, jinak chyba Jiří Dvorský (VŠB TUO) Lineární datové struktury 53 / 309

Zásobník Implementační problémy Jak mít v kódu (jedné funkci) více zásobníků? Jak zabránit, aby mohl kdokoliv v zásobníku něco měnit? Ochrana vnitřních dat. Lze implementovat zásobník, který by se dynamicky zvětšoval? Nešlo by vyrobit zásobník jako součástku? Třeba udělat z něj datový typ s definovanými operacemi? Potřebuji mít v programu zásobník čísel a znaků. To ho musím naimplementovat dvakrát? Nešlo by mít zásobník jako šablonu? Jiří Dvorský (VŠB TUO) Lineární datové struktury 54 / 309

Fronta (Queue) Charakteristika princip first-in, first-out, FIFO prvek, který byl vložen první, je také jako první z fronty vyzvednut Atributy první prvek se nazývá hlava fronty (head), poslední prvek se nazývá ocas fronty (tail). Jiří Dvorský (VŠB TUO) Lineární datové struktury 55 / 309

Fronta, pokračování Operace Put vložení prvku za ocas fronty, tato operace se někdy nazývá také Enqueue, Get vyjmutí prvku z hlavy fronty, tato operace se někdy nazývá také Dequeue, IsEmpty test prázdnosti fronty. Operace mají konstantní časovou složitost. Chybové stavy Pokud provedeme operaci Get na prázdné frontě nastává tzv. podtečení (queue underflow). Pokud není možné přidat další prvek, nastává tzv. přetečení (queue overflow). Jiří Dvorský (VŠB TUO) Lineární datové struktury 56 / 309

Fronta, pokračování Využití fronty tisková fronta u sdílené tiskárny, plánovač v operačním systému (více běžících procesů na jednoprocesorovém počítači procesy se musí střídat), obsluha uživatelů na serverech obecně Jiří Dvorský (VŠB TUO) Lineární datové struktury 57 / 309

Fronta, příklad Plánovač operačního systému cyklická obsluha (round robin) Tato část OS přiděluje jednotlivým procesům sdílený procesor: vybere z fronty čekajících procesů první proces, obnoví registry procesoru, spustí obnovený proces, po uplynutí vymezeného časového kvanta, zahájí odebírání procesoru, uloží obsah registrů zařadí tento proces na konec fronty, vybere z fronty čekajících procesů první proces... Jiří Dvorský (VŠB TUO) Lineární datové struktury 58 / 309

Fronta implementace Způsoby implementace pomocí dynamické alokace paměti, pomocí pole hlava fronty na prvním prvku v poli, jednoduché přidávání prostě na konec, odebírání z fronty posunovat všechny prvky dopředu?! řešení kruhový buffer (circular buffer)! Jiří Dvorský (VŠB TUO) Lineární datové struktury 59 / 309

Fronta, implementace kruhovým bufferem Charakteristika jeden index ukazuje na hlavu fronty, jeden index ukazuje na ocas fronty, při vložení a vyjmutí prvku se indexy posunují o jedničku dál, při překročení počtu prvků v bufferu se indexy vrací na první pozici tj. 0 modulární aritmetika Jiří Dvorský (VŠB TUO) Lineární datové struktury 60 / 309

Fronta, implementace kruhovým bufferem Problém - jak se pozná plná a prázdná fronta? Ocas ukazuje vždy na první volnou pozici ve frontě. Jedna pozice je udržována volná tj. v poli o N prvcích lze implementovat frontu velikosti N 1. Jiří Dvorský (VŠB TUO) Lineární datové struktury 61 / 309

Seznam (List) Charakteristika obecná lineární datová struktura, Atributy operace nejsou striktně určeny, lze implementovat množinu, mnoho variant. první prvek seznamu se nazývá hlava seznamu (head), další prvky závisí na konkrétní implementaci. Jiří Dvorský (VŠB TUO) Lineární datové struktury 62 / 309

Seznam jednosměrný seznam složen z položek, položky obsahují data a odkaz na další položku, každá položka ví pouze o svém následovníku, k položkám lze přistupovat sekvenčně, přímý přístup k položkám jako v poli je problém, nutno projít cyklem, pohyb seznamem dozadu je také problém, jak poznáme konec seznamu speciální odkaz nikam, většinou pojmenován nil, NULL, Nothing. Jiří Dvorský (VŠB TUO) Lineární datové struktury 63 / 309

Seznam, varianty jednosměrný seznam nejjednodušší varianta obousměrný seznam položka obsahuje odkaz na předchůdce i následníka, kruhový seznam začátek a konec seznamu splývají, Jiří Dvorský (VŠB TUO) Lineární datové struktury 64 / 309

Seznam pokračování Využití seznamu obecná datová struktura, dynamicky se měnící kolekce prvků, čili kdekoliv, například velice primitivní databáze. Jiří Dvorský (VŠB TUO) Lineární datové struktury 65 / 309

Obousměrný seznam implementace Způsoby implementace pomocí dynamické alokace paměti, pomocí pole otázka jak alokovat nové prvky? Položka seznamu struct ListItem { int Value; int Prev; int Next; }; Vlastní seznam struct ListInArray { ListItem Data[ListSize]; int Head; int Free; int Current; }; Jiří Dvorský (VŠB TUO) Lineární datové struktury 66 / 309

Obousměrný seznam alokace paměti Garbagge Collector (GC) mechanismus pro sběr nepoužívané paměti, volného místa, na první volnou pozici ukazuje index Free, v nepoužívaných položkách seznamu je využita složka Next, která odkazuje na další volný prvek, při alokaci položky si vezmeme první volnou pozici a Free posuneme přes Next na další volnou pozici, při dealokaci vložíme uvolňovanou pozici k Free, GC se tedy chová jako zásobník volného místa. Jiří Dvorský (VŠB TUO) Lineární datové struktury 67 / 309

Obousměrný seznam průchod seznamem Iterátor obecný mechanismus pro průchod datovou strukturou, matematicky řečeno pro všechny prvky datové struktury proveď, funkce void Reset nastaví iterátor na první prvek, funkce bool MoveNext posune iterátor na další prvek. Vrací true, při úspěšném posunu, jinak vrací false, funkce T Current vrací data z aktuálního prvku. Jiří Dvorský (VŠB TUO) Lineární datové struktury 68 / 309

Kontrolní otázky 1. Vysvětlete co znamená, že zásobník představuje paměť typu LIFO. 2. Co je to vrchol zásobníku? Co je to dno zásobníku? 3. Jaká je teoreticky kapacita zásobníku? 4. Co je to přetečení zásobníku? Co je to podtečení zásobníku? 5. Jak se typicky nazývá operace vložení prvku do zásobníku? Popište tuto operaci. 6. Jak se typicky nazývá operace vyjmutí prvku ze zásobníku? Popište tuto operaci. 7. Závisí složitost operací na počtu prvků v zásobníku? Ano či ne? 8. Uveďte příklady použití zásobníku. 9. Do zásobníku vložím prvky v pořadí A, B, C, D. Potom je budu ze zásobníku vyjímat. Jakou dostanu posloupnost? 10. Vysvětlete co znamená, že fronta představuje paměť typu FIFO. Jiří Dvorský (VŠB TUO) Lineární datové struktury 69 / 309

Kontrolní otázky (pokrač.) 11. Co je to hlava fronty? Co je to ocas fronty? 12. Závisí složitost operací na počtu prvků ve frontě? Ano či ne? 13. Co je to přetečení fronty? Co je to podtečení fronty? 14. Do fronty vložím prvky v pořadí A, B, C, D. Potom je budu z fronty vyjímat. Jakou dostanu posloupnost? 15. Jak se typicky nazývá operace vložení prvku do fronty? Popište tuto operaci. 16. Jak se typicky nazývá operace vyjmutí prvku ze fronty? Popište tuto operaci. 17. Uveďte příklady použití fronty. 18. Popište hlavní problémy při implementaci fronty v poli. Jak je lze řešit pomocí kruhové reprezentace fronty? 19. Jaký je rozdíl mezi frontou, zásobníkem a seznamem? Zaměřte se na operace vkládání a vyjímání prvků z těchto struktur. Jiří Dvorský (VŠB TUO) Lineární datové struktury 70 / 309

Kontrolní otázky (pokrač.) 20. Co je to hlava seznamu, ocas seznamu? 21. Rozdíl mezi jednosměrným, obousměrným a kruhovým seznamem. 22. Popište algoritmus vyhledávání daného prvku v seznamu? 23. Lze využít algoritmus půlení intervalu pro vyhledávání v seznamu? Jaký je tu hlavní problém? 24. Co je to garbage collector? 25. Co je to iterátor? Jiří Dvorský (VŠB TUO) Lineární datové struktury 71 / 309

Děkuji za pozornost Jiří Dvorský (VŠB TUO) Lineární datové struktury 72 / 309