Abstraktní datové typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213.

Slides:



Advertisements
Podobné prezentace
Vstup a výstup Ing. Lumír Návrat  katedra informatiky, A-1018 
Advertisements

Vstup a výstup doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Programovací jazyk C++
Třída SIMSET je druhou standardní systémovou třídou, která obsahuje prostředky pro práci se spojovými seznamy. KRUHOVÉ SPOJOVÉ SEZNAMY Spojový seznam –
Uživatelem definované typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
JUI - 3. přednáška Zpracování seznamů, predikátové a vyhodnocovací funkce RNDr. Jiří Dvořák, CSc.
Seznamy v jazyce Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Cvičení Úloha 1: Rozhodněte zda posloupnost znaků v poli délky n tvoří palindrom (slovo, které je stejné při čtení zprava i zleva). Př.: [a,l,e,l,a] [a,n,n,a]
10. Dynamické datové struktury
Fronta - a)Implementace s využitím statických struktur (pole) b)Implementace s využitím dynamických struktur (spojového seznamu) odebírá se ze začátku.
Fakulta elektrotechniky a informatiky
Pole, ukazatele a odkazy
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Programovací jazyk Prolog
Programování v Pascalu Přednáška 5 RNDr. Hana Havelková.
Informatika pro ekonomy II přednáška 11
Architektury a techniky DS Tvorba efektivních příkazů I Přednáška č. 3 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Programovací jazyk Haskell Ing. Lumír Návrat  katedra informatiky, A 1018 
Programování v Pascalu Přednáška 7
Materiály k přednášce Úvod do programování Ondřej Čepek.
ADT Strom.
Skip-List je datová struktura, která může být použita jako náhrada za vyvážené stromy. představují pravděpodobnostní alternativu k vyváženým stromům (struktura.
1 Vyhledávání Principy vyhledávání Klasifikace klíče:  Interní klíč – je součástí prohlížených záznamů  Externí klíč – není jeho součástí, je jím např.
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
Fakulta životního prostředí Katedra informatiky a geoinformatiky
Algoritmy a programovací techniky
Objektové programování
Datové struktury a algoritmy Část 5 Abstraktní datové typy
Syntaxí řízený překlad
Metainformační systém založený na XML Autor: Josef Mikloš Vedoucí práce: Ing. Jan Růžička, Ph.D. V/2004.
Informatika pro ekonomy II přednáška 10
Seminář C++ 4. cvičení Objekty Ing. Jan Mikulka. Co je objekt ► obraz třídy i instance ► třída – definovaná za pomocí klíčového slova class ► instance.
Základy λ- kalkulu doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Další abstraktní datové typy
Počítače a programování 1
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
Funkcionální programování Haskell
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Databázové modelování
Algoritmizace a programování Textové soubory - 13 Mgr. Josef Nožička IKT Algoritmizace a programování
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Aplikační a programové vybavení
Pre-algebra Antonín Jančařík.
Databázové systémy Informatika pro ekonomy, př. 18.
Mocnina částečně uspořádané množiny
Návrh podle kontraktu - klasická metodika a moderní nástroje Tomáš Pitner Masarykova univerzita v Brně Fakulta informatiky
Uživatelem definované typy Ing. Lumír Návrat  katedra informatiky, A 1018 
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
Seznamy v jazyce Haskell Ing. Lumír Návrat  katedra informatiky, D-403 
Pokročilé programování v C++ (část B)
1 PRG036 – Technologie XML Přednáší: Irena Mlýnková Martin Nečaský
Doc. Josef Kolář (ČVUT)Prohledávání grafůGRA, LS 2010/11, Lekce 4 1 / 15Doc. Josef Kolář (ČVUT)Prohledávání stavového prostoruGRA, LS 2013/14, Lekce 11.
4. Typ pole 4.1 Jednorozměrná pole
Teorie zpracování dat RELAČNÍ DATOVÝ MODEL.
České vysoké učení technické Fakulta elektrotechnická Datové typy, výrazy vstup, výstup Jazyk JAVA A0B36PRI - PROGRAMOVÁN Í v1.02.
23/04/20151 LINQ (1) LINQ (Language Integrated Query) je součást MS.NET Frameworku umožňující jednotný přístup k datům a jejich zpracování deklarativ-
Datové typy IB111: Datové typy. Data a algoritmizace jaká data potřebuji pro vyřešení problému? jak budu data reprezentovat? jaké operaci s nimi potřebuji.
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
Y36PJC Programování v jazyce C/C++
Programovací jazyk C++
Y36PJC Programování v jazyce C/C++
Abstraktní datové typy
ADT zásobník - příklad Prakticky aplikovatelný příklad využití ADT zásobník je vyhodnocování aritmetických výrazů v Postfixové notaci: Pro zápis aritmetických.
Abstraktní datové typy
Informatika pro ekonomy přednáška 8
Dynamické proměnné (1) Proměnné, jejichž počet a (nebo) velikost pa-měti využívané těmito proměnnými se v prů-běhu programu mění Dynamické proměnné lze.
Opakování základních příkazů a syntaxí v programovacím jazyce Pascal
Programovací jazyk Haskell
Transkript prezentace:

Abstraktní datové typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 

2ÚDPJ - Abstraktní datové typy Obsah přednášky Motivace, vlastnosti ADT Moduly v Haskellu Obecné principy návrhu ADT ADT Fronta ADT Vyhledávací strom ADT Množina ADT Relace Příklady na procvičení

3ÚDPJ - Abstraktní datové typy Motivace Cíl: Vytvoření kalkulátoru pro číselné výrazy čtení a zápis hodnot proměnných čtení a zápis hodnot proměnných Modely zapisovatelné paměti seznam dvojic: [(String, Int)] seznam dvojic: [(String, Int)] funkce: (String -> Int) funkce: (String -> Int)Operace initial :: Store initial :: Store value :: Store -> String -> Int value :: Store -> String -> Int update :: Store -> String -> Int -> Store update :: Store -> String -> Int -> Store

4ÚDPJ - Abstraktní datové typy Abstraktní datový typ Omezené rozhraní type Store = [(Int, Var)] s1, s2:: Store -> Co je to s1++s2 ? type Store = [(Int, Var)] s1, s2:: Store -> Co je to s1++s2 ? Nezávislost rozhraní na implementaci type Store = Var -> Int s1, s2:: Store -> s1++s2 nefunguje type Store = Var -> Int s1, s2:: Store -> s1++s2 nefunguje Podmínky pro ADT definice veřejného rozhraní definice veřejného rozhraní implementace typu není dostupná implementace typu není dostupná

5ÚDPJ - Abstraktní datové typy Moduly Definice modulu module A where -- A.hs, A.lhs... module A where -- A.hs, A.lhs... všechny definice jsou viditelné všechny definice jsou viditelné Import modulu module A where import B... module A where import B... dovezou se všechny viditelné definice dovezou se všechny viditelné definice

6ÚDPJ - Abstraktní datové typy Moduly Omezení exportu module Expr ( printExpr, Expr(..) ) where module Expr ( printExpr, Expr(..) ) where Expr(..) – exportuje i konstruktory Expr – pouze export jména typu Expr(..) – exportuje i konstruktory Expr – pouze export jména typu Omezení dovozu import Expr hiding( printExpr ) import Expr hiding( printExpr ) import qualified Expr -- Expr.printExpr import qualified Expr -- Expr.printExpr import Expr as Vyraz -- Vyraz.printExpr import Expr as Vyraz -- Vyraz.printExpr

7ÚDPJ - Abstraktní datové typy ADT a Haskell ADT je definován v samostatném modulu Explicitní export operací Export pouze jména typu bez konstruktorů module Store (Store, initial, -- Store initial, -- Store value, -- Store -> String -> Int value, -- Store -> String -> Int update -- Store -> String -> Int -> Store update -- Store -> String -> Int -> Store ) where

8ÚDPJ - Abstraktní datové typy Implementace - seznam Definice typu data Store = Sto [(String, Int)] newtype Store = Sto [(String, Int)] Definice operací initial :: Store initial = Sto [] value :: Store -> String -> Int value (Sto []) _ = 0 value (Sto ((w,n):sto)) v | v == w = n | v == w = n | otherwise = value (Sto sto) v | otherwise = value (Sto sto) v update :: Store -> String -> Int -> Store update (Sto sto) v n = Sto ((v,n):sto)

9ÚDPJ - Abstraktní datové typy Implementace - funkce Definice typu newtype Store = Sto (String -> Int) Definice operací initial :: Store initial = Sto (\v -> 0) value :: Store -> String -> Int value (Sto sto) v = sto v update :: Store -> String -> Int -> Store update (Sto sto) v n = Sto (\w -> if v==w then n else sto w)

10ÚDPJ - Abstraktní datové typy Obecné principy návrhu ADT Identifikace a pojmenování typů Neformální popis typů Signatury typů Jak vytvořit objekt daného typu? Jak vytvořit objekt daného typu? Jak zjistit, o jaký druh objektu jde? Jak zjistit, o jaký druh objektu jde? Jak se dostaneme ke složkám typu? Jak se dostaneme ke složkám typu? Můžeme provádět transformace objektů? Můžeme provádět transformace objektů? Jak můžeme objekty kombinovat? Jak můžeme objekty kombinovat? Můžeme objekty agregovat? Můžeme objekty agregovat?

11ÚDPJ - Abstraktní datové typy ADT Fronta inicializace: emptyQ test prázdné fronty: isEmptyQ vložení na konec fronty: addQ výběr prvku ze začátku fronty: remQ module Queue ( Queue, emptyQ,-- Queue a isEmptyQ,-- Queue a -> Bool addQ,-- a -> Queue a -> Queue a remQ-- Queue q -> (a, Queue a) ) where

12ÚDPJ - Abstraktní datové typy Implementace fronty 1 -- vkládáme na konec, vybíráme ze začátku seznamu newtype Queue a = Qu [a] emptyQ = Qu [] isEmptyQ (Qu q) = empty q addQ x (Qu xs) = Qu (xs++[x]) remQ xs) | not (isEmptyQ q) = (head xs, Qu (tail xs)) | otherwise = error “remQ”

13ÚDPJ - Abstraktní datové typy Implementace fronty 2 -- vkládáme na začátek, vybíráme z konce seznamu addQ x (Qu xs) = Qu (x:xs) remQ xs) | not (isEmptyQ q) = (last xs, Qu (init xs)) | otherwise = error “remQ” složitost addQ/remQ konstantní – na začátku seznamu konstantní – na začátku seznamu lineární – na konci seznamu lineární – na konci seznamu

14ÚDPJ - Abstraktní datové typy Implementace fronty 3 newtype Queue a = Qu [a] [a] emptyQ = Qu [] [] isEmptyQ (Qu [] []) = True isEmptyQ _ = False addQ x (Qu xs ys) = Qu xs (x:ys) remQ (Qu (x:xs) ys) = (x, Qu xs ys) remQ (Qu [] ys) = remQ (Qu (reverse ys) []) remQ (Qu [] []) = error “remQ”

15ÚDPJ - Abstraktní datové typy ADT Vyhledávací strom module Tree ( Tree, nil,-- Tree a isNil,-- Tree a -> Bool isNode,-- Tree a -> Bool leftSub,-- Tree a -> Tree a rightSub,-- Tree a -> Tree a treeVal,-- Tree a -> a insTree,-- Ord a => a -> Tree a -> Tree a delete,-- Ord a => a -> Tree a -> Tree a minTree-- Ord a => Tree a -> Maybe a ) where

16ÚDPJ - Abstraktní datové typy ADT Vyhledávací strom -- definice typu data Tree a = Nil | Node a (Tree a) (Tree a) -- konstrukce hodnoty nil :: Tree a nil = nil -- dotaz na druh objektu isNil :: Tree a -> Bool isNil Nil = True isNil _ = False -- výběr složky objektu leftSub :: Tree a -> Tree a leftSub Nil = error “leftSub” leftSub (Node _ t1 _) = t1

17ÚDPJ - Abstraktní datové typy ADT Vyhledávací strom -- vložení prvku do stromu insTree :: Ord a => a -> Tree a -> Tree a insTree val Nil = (Node val Nil Nil) insTree val (Node v t1 t2) | v == val = Node v t1 t2 | val > v = Node v t1 (insTree val t2) | val v = Node v t1 (insTree val t2) | val < v = Node v (insTree val t1) t2

18ÚDPJ - Abstraktní datové typy ADT Vyhledávací strom -- vyhledání nejmenšího prvku ve stromu minTree :: Ord a => Tree a -> Maybe a minTree t | isNil t = Nothing | isNil t1 = Just v | otherwise = minTree t1 where t1 = leftSub t v = treeVal t data Maybe a = Nothing | Just a

19ÚDPJ - Abstraktní datové typy ADT Vyhledávací strom -- odstranění prvku ze stromu delete :: Ord a => a -> Tree a -> Tree a delete val (Node v t1 t2) | val v = Node v t1 (delete val t2) | isNil t2 = t1 | isNil t1 = t2 | otherwise = join t1 t2 join :: Ord a => Tree a -> Tree a -> Tree a join t1 t2 = Node mini t1 newt where (Just mini) = minTree t2 newt = delete mini t2

20ÚDPJ - Abstraktní datové typy ADT Množina Seznam – uspořádaná posloupnost Množina – bez uspořádání, bez opakování module Set ( Set, empty,-- Set a incl,-- Eq a => a -> Set a -> Set a makeSet,-- Eq a => [a] -> Set a isEmpty, -- Set a -> Bool inSet,-- Eq a => Set a -> a -> Bool union, inter, diff, -- Eq a => Set a -> Set a -> Set a eqSet, subSet,-- Eq a => Set a -> Set a -> Bool card-- Set a -> Int ) where

21ÚDPJ - Abstraktní datové typy ADT Množina Implementace seznam neopakujících se prvků seznam neopakujících se prvků newtype Set a = St [a] newtype Set a = St [a] seznam uspořádaných prvků seznam uspořádaných prvků lineární složitost vyhledávání lineární složitost vyhledávání vyhledávací strom vyhledávací strom logaritmická složitost vyhledávání logaritmická složitost vyhledávání …

22ÚDPJ - Abstraktní datové typy ADT Množina -- zakrytí funkce union import List hiding (union) -- deklarace instance třídy Eq instance Eq a => Eq (Set a) where (==) = eqSet -- definice typu newtype Set a = St [a]

23ÚDPJ - Abstraktní datové typy ADT Množina -- konstruktory empty :: Set a empty = St [] incl :: Eq a => a -> Set a -> Set a incl x (St st) = St (incl1 x st) where incl1 x [] = [x] incl1 x | x == y = s | otherwise = y : (incl1 x ys) makeSet :: Eq a => [a] -> Set a makeSet [] = empty makeSet (x:xs) = incl x (makeSet xs)

24ÚDPJ - Abstraktní datové typy ADT Relace Binární relace na množině A: podmnožina kartézského součinu (A x A) Množina uspořádaných dvojic (x,y)  (AxA) type Relation a = Set (a,a) 123 1XX 2X 3X 1 2 3

25ÚDPJ - Abstraktní datové typy ADT Relace Kompozice relací (x1, x2)  R1, (x2, x3)  R2 -> (x1,x3)  R2  R1 (x1, x2)  R1, (x2, x3)  R2 -> (x1,x3)  R2  R1 compose r2 r1 = [(x1,x3) | (x1, x2) <- r1, (x2’,x3) <- r2, x2 == x2’] compose r2 r1 = [(x1,x3) | (x1, x2) <- r1, (x2’,x3) <- r2, x2 == x2’] Mocnina relace r 1 = r, r n+1 = r  r n r 1 = r, r n+1 = r  r n pow 1 r = r pow (n+1) r = compose r (pow n r) pow 1 r = r pow (n+1) r = compose r (pow n r)

26ÚDPJ - Abstraktní datové typy ADT Relace Vlastnosti relace R  U  U Vlastnosti relace R  U  U reflexivita:  x  U. (x,x)  R reflexivita:  x  U. (x,x)  R symetrie  x,y. (x,y)  R  (y,x)  R symetrie  x,y. (x,y)  R  (y,x)  R tranzitivita  x,y,z. (x,y)  R  (y,z)  R  (x,z)  R tranzitivita  x,y,z. (x,y)  R  (y,z)  R  (x,z)  RPozor! isReflexive :: Eq a => Rel a => Set a => Bool isReflexive r u = and [inSet (x,x) r | x Rel a => Set a => Bool isReflexive r u = and [inSet (x,x) r | x <- u]

27ÚDPJ - Abstraktní datové typy Úkoly na procvičení Definujte abstraktní datový typ Stack reprezentující zásobník s operacemi push :: a -> Stack a -> Stack a push :: a -> Stack a -> Stack a pop :: Stack a -> Stack a pop :: Stack a -> Stack a top :: Stack a -> a top :: Stack a -> a isEmpty :: Stack a ->Bool isEmpty :: Stack a ->Bool Definujte abstraktní datový typ Deque reprezentující oboustranně ukončenou frontu s operacemi addFirst, addLast addFirst, addLast removeFirst, removeLast removeFirst, removeLast …