6. Abstraktní datové typy



Podobné dokumenty
Spojový seznam. Jan Kybic.

Záznam, zásobník a fronta

MS Word 2007 REVIZE DOKUMENTU A KOMENTÁŘE

Výrazy lze též zavést v nečíselných oborech, pak konstanty označuji jeden určitý prvek a obor proměnné není množina čísel.

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

Jan Březina. Technical University of Liberec. 17. března 2015

Část I Spojové struktury

Lineární algebra. Vektorové prostory

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

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

Příručka pro práci s dataloggerem Labquest 2. Zapínání a domácí obrazovka

2.1. Pojem funkce a její vlastnosti. Reálná funkce f jedné reálné proměnné x je taková

Algoritmizace a programování

Rostislav Horčík. 13. října 2006

Asymptoty grafu funkce

Algoritmizace a programování

Zákon o elektronickém podpisu

Programování 1. 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

Využití fixních a variabilních nákladů pro manažerské rozhodování a finanční řízení

Externí zařízení Uživatelská příručka

Uložené procedury Úvod ulehčit správu zabezpečení rychleji

Algoritmizace prostorových úloh

(k 1)x k + 1. pro k 1 a x = 0 pro k = 1.

Business Contact Manager Správa kontaktů pro tisk štítků

2.6.4 Lineární lomené funkce s absolutní hodnotou

Novinky verze ArCon 14 Small Business

Část 1 Spojové struktury (stromy) Dynamické struktury a Abstraktní Datový Typy (ADT) Část 2 Abstraktní datový typ. Část 3 Příklad ADT Prioritní fronta

Digitální učební materiál

Algoritmizace prostorových úloh

Katedra obecné elektrotechniky Fakulta elektrotechniky a informatiky, VŠB - TU Ostrava 16. ZÁKLADY LOGICKÉHO ŘÍZENÍ

téma: Formuláře v MS Access

Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY

Aplikace počítačů v provozu vozidel 9

primární tlačítko (obvykle levé). Klepnutí se nejčastěji používá k výběru (označení) položky nebo k otevření nabídky.

Definice z = f(x,y) vázané podmínkou g(x,y) = 0 jsou z geometrického hlediska lokálními extrémy prostorové křivky k, Obr Obr. 6.2.

Objektově orientované databáze

Modul Řízení objednávek.

Druhá mocnina. Druhá odmocnina Druhá odmocnina. Předpoklady: V této hodině jsou kalkulačky zakázány.

VŠFS B_Prg Programování: Sbírka příkladů na cvičení RNDr. Jan Lánský, Ph.D.

Žáci mají k dispozici pracovní list. Formou kolektivní diskuze a výkladu si osvojí grafickou minimalizaci zápisu logické funkce

Operace nad celými tabulkami

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

Funkce Vypracovala: Mgr. Zuzana Kopečková

Dynamické struktury a Abstraktní Datový Typy (ADT)

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

Abstraktní datové typy: zásobník

Modul pro testování elektrických obvodů

Numerická integrace. 6. listopadu 2012

1 Měření kapacity kondenzátorů

Moderní technologie ve studiu aplikované fyziky CZ.1.07/2.2.00/ Reálná čísla

Ozobot aktivita lov velikonočních vajíček

M-10. AU = astronomická jednotka = vzdálenost Země-Slunce = přibližně 150 mil. km. V následující tabulce je závislost doby

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

TIP: Pro vložení konce stránky můžete použít klávesovou zkratku CTRL + Enter.

Oborové číslo Hodnocení - část A Hodnocení - část B Hodnocení - část A+B

Vítězslav Bártl. prosinec 2013

Hra a hry. Václav Vopravil. Teorie kombinatorických her se zabývá abstraktními hrami dvou hráčů. Hra je definována R },

Novinky v programu Majetek 2.06

Tři hlavní druhy finančního rozhodování podniku #

Cílem kapitoly je seznámit studenta se strukturou programu a jeho překladem.

souřadné systémy geometrické určení polohy pevně spojené se vztažným tělesem

ZNAK ČERVENÉHO KŘÍŽE, JEHO OCHRANA A UŽÍVÁNÍ

Data v počítači EIS MIS TPS. Informační systémy 2. Spojení: jan.skrbek@tul.cz tel.: Konzultace: úterý

Karty externích médií

Praktické úlohy- zaměření specializace

Etiketa v podnikání a písemném styku. Ing. Zlatko Tvrdoň

Vláda nařizuje podle 133b odst. 2 zákona č. 65/1965 Sb., zákoník práce, ve znění zákona č. 155/2000 Sb.:

Evidence dat v prostředí MS Excelu Kontingenční tabulka a kontingenční graf

5. Ř etězce (třída String)

Stavební mechanika přednáška, 2. května 2016

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

Algoritmus (nebo dřívějším pravopisem algorithmus)

1 - Prostředí programu WORD 2007

Ovoce do škol Příručka pro žadatele

MĚŘENÍ NÁKLADŮ, VÝKONNOSTI

Programování pro deskriptivní geometrii

Pocasicz.cz / pocasiesk.sk - zadání výroby

MINISTERSTVO PRO MÍSTNÍ ROZVOJ UŽIVATELSKÁ PŘÍRUČKA IS KP 14+ PRO INTEGROVANÉ NÁSTROJE: ŽÁDOST O PODPORU STRATEGIE CLLD. Verze: 1.

Na následující stránce je poskytnuta informace o tom, komu je tento produkt určen. Pro vyplnění nového hlášení se klikněte na tlačítko Zadat nové

Základní datové struktury

Kolekce, cyklus foreach

Co najdete v ASPI? (pro uživatele SVI FSE UJEP)

NERO SUCHOBĚŽNÉ LAMELOVÉ KOMPRESORY VAKUUM BOHEMIA 97/23/EC

DATABÁZE DŮLEŽITÉ: Před načtením nové databáze do vaší databáze si prosím přečtěte následující informace, které vám umožní:

Želva se nachází v tzv. grafickém okně (zviditelníme ji klávesou +), v němž jsou vidět i čáry, které nakreslila.

Použití GIS v práci krajské hygienické stanice

SITEMAP / STRUKTURA. VÝVOJ ONLINE PREZENTACE / ETAPA I. CLIENT / DHL Global Forwarding THEQ ALL GOOD THINGS

PŘÍLOHA 10 SMLOUVY O PŘÍSTUPU KE KONCOVÝM ÚSEKŮM. Pravidla a postupy

7. Silně zakřivený prut

Magnetic Levitation Control

Uživatelský manuál pro práci se stránkami OMS a MS provozované portálem Myslivost.cz. Verze 1.0

Matematický model kamery v afinním prostoru

Zkrácený manuál budování značky Platnost od 1. dubna 2016

Směrnice pro vedení, vypracování a zveřejňování bakalářských prací na Vysoké škole polytechnické Jihlava

B Kvantitativní test. Semestrální práce TUR. Novotný Michal

DYNAMICKÉ VÝPOČTY PROGRAMEM ESA PT

Návrhové vzory. Každý návrhový vzor má následující strukturu: Většina publikací návrhové vzory člení do následujících kategorií:

2 Trochu teorie. Tab. 1: Tabulka pˇrepravních nákladů

Kódování rastrových obrázků

Transkript:

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 1 Základy algoritmizace 6. Abstraktní datové typy doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 2 Základy algoritmizace Dnes: Abstraktní datové typy Zásobník Fronta Spojový seznam

Abstraktní datový typ Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 3

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 4 Abstraktní datový typ Datová struktura (typ) je množina dat a operací s těmito daty Abstraktní datový typ formálně definuje data a operace s nimi Příklady: Fronta (queue) Zásobník (stack) Pole (array) Tabulka (table) Seznam (list) Strom (tree) Množina (set) Nezávisle na konkrétní implementaci

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 5 Abstraktní datový typ Abstraktní datový typ je množina dat (hodnot) a příslušných operací, které jsou přesně specifikovány a to nezávisle na konkrétní implementaci Můžeme definovat: Matematicky signatura a axiomy Rozhraním (interface) a popisem operací, rozhraní poskytuje: Konstruktor vracející odkaz (na objekt nebo strukturu) Objektově orientovaný i procedurální přístup Operace, které akceptují odkaz na argument (data) jako argument a které mají přesně definovaný účinek na data Příklad matematického popisu datový typ Boolean

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 6 Matematický popis ADT - Boolean Syntax popisuje, jak správně vytvořit logický výraz: 1. true a false jsou logické výrazy 2. Jestliže x a y jsou logické výrazy, pak I.!(x) negace II. (x & y) logický součin and III. (x y) logický součet or IV. (x == y), (x!= y) relační operátory jsou logické výrazy Pokud se chceme vyhnout psát u každé operace závorky, musíme definovat priority operátorů Konkrétní implementace se může syntakticky lišit viz.! vs. not, atp.

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 7 Matematický popis ADT - Boolean Sémantika popisuje význam jednotlivých operací Můžeme definovat axiomy: true == true : true false == false : true!(true) : false x & false : false x & y : y & x x false : x true == false : false false == true : false!(false) : true x & true : x x y : y x x true : true

Abstraktní datový typ - vlastnosti Počet datových položek může být Neměnný statický datový typ počet položek je konstantní Např. pole, řetězec, třída, Proměnný dynamický datový typ počet položek se mění v závislosti na provedené operaci Např. vložení nebo odebrání určitého prvku Typ položek (dat) může být Homogenní všechny položky jsou stejného typu Nehomogenní položky můžou být různých typů Existence bezprostředního následníka je Lineární existuje bezprostřední následník prvku, např. pole, fronta, seznam, Nelineární neexistuje přímý jednoznačný následník, např. strom Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 8

Zásobník Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 9

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 10 Zásobník Dynamická datová struktura umožňující vkládání a odebírání hodnot tak, že naposledy vložená hodnota se odebere jako první Základní operace Vložení hodnoty na vrchol zásobníku Odebrání hodnoty z vrcholu zásobníku Test prázdnosti zásobníku LIFO Last In, First Out

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 11 Zásobník Základní operace push vložení hodnoty na vrchol zásobníku pop odebrání hodnoty z vrcholu zásobníku isempty test prázdnosti zásobníku push pop Další operace mohou být peek čtení hodnoty z vrcholu Alternativně také třeba top search vrátí pozici prvku Pokud se nachází v zásobníku, jinak -1 size aktuální počet prvků Nebývá potřeba Vrchol z. Poslední vložená pol. Předposlední vložená p. Druhá vložená položka První vložená položka

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 12 Zásobník Příklad implementace pomocí List push append pop pop isempty not len(stack) stack = [] stack.append("dela") stack.append("to") stack.append("co") stack.append("vime") while len(stack): print(stack.pop()) Uměli byste implementovat zásobník pomocí pole?

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 13 Zásobník Příklad implementace s definicí rozhraní class Stack: def init (self): self.items = [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def isempty(self): return (self.items == []) s = Stack() s.push("dela") s.push("to") s.push("co") s.push("vime") while not s.isempty(): print(s.pop())

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 14 Zásobník Příklad použití kontrola vyvážení závorek def parchecker(symbolstring): s = Stack() for symbol in symbolstring: if symbol == "(": s.push(symbol) elif symbol == ")": if s.isempty(): return False else: s.pop() return s.isempty() parchecker('(3+(2*(-2)+(3*5)-1)/(3-2)*2)') parchecker('((3+2)+(5*8)*(4)')

Fronta Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 15

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 16 Fronta Dynamická datová struktura umožňující vkládání a odebírání hodnot v pořadí, v jakém byly vloženy Základní operace Vložení hodnoty na konec fronty Odebrání hodnoty z čela fronty Test prázdnosti fronty FIFO First In, First Out

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 17 Fronta Základní operace push vložení hodnoty na konec fronty (nebo též enqueue) pop odebrání hodnoty z čela fronty (nebo též dequeue) isempty test prázdnosti fronty Další operace mohou být peek čtení hodnoty z čela back čtení hodnoty z konce Čelo fronty push poslední druhý první pop

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 18 Fronta Příklad implementace pomocí List push append pop pop(0) isempty not len(stack) stack = [] stack.append("dela") stack.append("to") stack.append("co") stack.append("vime") while len(stack): print(stack.pop(0)) Pozor, operace pop(0) je pomalá víte proč?

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 19 Fronta Příklad implementace s definicí rozhraní class Queue: def init (self): self.items = [] def isempty(self): return self.items == [] def enqueue(self, item): self.items.insert(0,item) def dequeue(self): return self.items.pop() Jaký je rozdíl v použití seznamu oproti minulému příkladu? q = Queue() q.enqueue("dela") q.enqueue("to") q.enqueue("co") q.enqueue("vime") def size(self): return len(self.items) while not q.isempty(): print(q.dequeue())

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 20 Fronta Rozšíření prioritní fronta Prvky jsou odebírány na základě priority (např. velikosti) Hledání největšího prvku při odebírání Seřazení po vložení Seřazení při vložení Jaký to lze naimplementovat? Určitě to jde lépe s pomocí složitějších struktur

Spojové struktury Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 21

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 22 Spojové struktury Seznam List Základní datová struktura pro uchovávání množiny prvků Vložení/vyjmutí prvku může být velmi pomalé Spojové seznamy Datová struktura realizující seznam dynamické délky Každý prvek obsahuje Datovou část (hodnota proměnné, objekt, ) Referenci na další prvek None v případě posledního prvku seznamu První prvek seznamu se zpravidla označuje jako head nebo start Realizováno jako referenční proměnná odkazující na první prvek seznamu

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 23 Spojové struktury Prvek seznamu Node Základ i pro komplikovanější struktury class Node: def init (self,initdata): self.data = initdata self.next = None Spojový seznam LinkedList class LinkedList: def init (self): self.head = None

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 24 Spojové struktury Test prázdnosti isempty def isempty(self): return self.head == None Přidání prvku push def push(self,item): node = Node(item) node.next = self.head self.head = node Přidání prvku není závislé na počtu prvků v seznamu

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 25 Spojové struktury Odebrání prvního prvku pop def pop(self): if self.head: ret = self.head.data self.head = self.head.next return ret Přidání prvku není závislé na počtu prvků v seznamu Zjištění počtu prvků size def size(self): current = self.head count = 0 while current!= None: count += 1 current = current.next return count Kompletní projití seznamu

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 26 Spojové struktury Zrychlení operace size Můžeme si pamatovat aktuální počet prvků count Zvyšujeme a snižujeme při každé operaci vložení/vyjmutí Práce s posledním prvkem Zavedeme si referenci na poslední prvek end Pracujeme obdobně jako s head V případě přidání prvku na začátek aktualizujeme pouze pokud byl seznam dosud prázdný Aktualizujeme v případě přidání prvku na konec Aktualizujeme při vyjmutí posledního prvku

Spojové struktury class LinkedList: def init (self): self.head = None self.count = 0 def push(self,item): node = Node(item) node.next = self.head self.head = node self.count +=1 def pop(self): if self.head: ret = self.head.data self.head = self.head.next self.count -=1 return ret def size(self): return self.count Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 27

Spojové struktury class LinkedList: def init (self): self.head = None self.end = None self.count = 0 def push(self,item): node = Node(item) if not self.head: self.head = self.end = node else: node.next = self.head self.head = node self.count +=1 def pop(self): if self.head: ret = self.head.data self.head = self.head.next if self.head == None: self.end = None self.count -=1 return ret Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 28

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 29 Spojové struktury Vložení prvku na konec pushend def pushend(self, item): node = Node(item) if not self.end: self.head = self.end = node else: self.end.next = node self.end = node self.count +=1

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 30 Spojové struktury Odebrání posledního prvku popend def popend(self): if self.head: self.count -=1 ret = self.end.data if self.head == self.end: self.head = self.end = None else: cur = self.head while cur.next!= self.end: cur = cur.next self.end = cur self.end.next = None return ret

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 31 Spojové struktury Obecně vkládání do seznamu Na začátek push Na konec pushend Za daný prvek potřebujeme referenci na prvek, za který chceme vkládat (node) newnode = Node(item) newnode.next = node.next node.next = newnode Na určitou pozici insertat Nutno najít odpovídající prvek průchod seznamu Vložit za daný prvek Ošetření mezních hodnot (velikost seznamu, head, end)

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 32 Spojové struktury Odebírání prvku Ze začátku pop Z konce popend Daný prvek potřebujeme referenci na prvek, který ho předchází (prevnode) if prevnode.next == node: prevnode.next = node.next node.next = None Z určité pozice removeat Nutno najít odpovídající prvek průchod seznamu Odstranit prvek Ošetření mezních hodnot (velikost seznamu, head, end)

Spojové struktury Složitější operace / práce s prvky Vkládání a odebírání Vyhledávání Výpis prvků, Příklad: search a remove Rozšíření základního spojového seznamu Čítač prvků count Reference na poslední prvek end Zjednodušuje některé operace z lineární náročnosti na konstantní Další možná rozšíření Kruhový spojový seznam Obousměrný spojový seznam Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 33

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 34 Spojové struktury Kruhový spojový seznam Položka next posledního prvku odkazuje na první prvek head a end ztrácejí smysl, ale je třeba držet odkaz na některý prvek (první, poslední přidaný, poslední vyhledaný, atp.)

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 35 Spojové struktury Obousměrný spojový seznam Každý prvek obsahuje odkaz na následující i předchozí položku v seznamu (prev a next) První prvek má nastavenu položku prev na None Poslední prvek má nastavenu položku next na None Snadný pohyb seznamem vpřed i vzad Srovnejte popend u jednosměrného spojového seznamu

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 36 Spojové struktury Kruhový obousměrný spojový seznam Kombinace předchozích

Základy algoritmizace Dnes: Abstraktní datové typy Zásobník Fronta Spojový seznam lineární, kruhový, obousměrný Zamyslete se Jak udělat zásobník (frontu) pomocí spojového seznamu s konstantní složitostí operací (bez nutnosti procházet seznam) Jak implementovat obousměrný spojový seznam Jak udržovat spojový seznam setříděný Jak implementovat prioritní frontu spojovým seznamem Příště vyhledávání a řazení grafy a stromy Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 37

Jiří Vokřínek, 2015 B6B36ZAL - Přednáška 6 38 Základy algoritmizace Dodatečné zdroje: Implementing a Stack in Python http://interactivepython.org/runestone/static/pythonds/basic DS/ImplementingaStackinPython.html Implementing a Queue in Python http://interactivepython.org/runestone/static/pythonds/basic DS/ImplementingaQueueinPython.html Linked Lists in Python http://interactivepython.org/runestone/static/pythonds/basic DS/ImplementinganUnorderedListLinkedLists.html Implementing a singly linked list in Python https://www.codefellows.org/blog/implementing-a-singlylinked-list-in-python Linked lists http://www.cs.dartmouth.edu/~cs1/lectures/lecture17/lecture 17.html