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