6. abstraktní datové typy · abstraktní datový typ datová struktura (typ) je množina dat a...

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

Upload: others

Post on 16-Dec-2020

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 6. Abstraktní datové typy · 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

doc. Ing. Jiří Vokřínek, Ph.D.Katedra počítačů

Fakulta elektrotechnickáČeské vysoké učení technické v Praze

Základy algoritmizace

6. Abstraktní datové typy

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 1

Page 2: 6. Abstraktní datové typy · 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

Základy algoritmizace

Dnes: Abstraktní datové typy

Zásobník

Fronta

Spojový seznam

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 2

Page 3: 6. Abstraktní datové typy · 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

Abstraktní datový typ

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 3

Page 4: 6. Abstraktní datové typy · 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

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

Nezávisle na konkrétní implementaci

Příklady: Fronta (queue)

Zásobník (stack)

Pole (array)

Tabulka (table)

Seznam (list)

Strom (tree)

Množina (set)

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 4

Page 5: 6. Abstraktní datové typy · 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

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, 2018 B6B36ZAL - Přednáška 6 5

Page 6: 6. Abstraktní datové typy · 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

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, 2018 B6B36ZAL - Přednáška 6 6

Page 7: 6. Abstraktní datové typy · 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

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

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 7

true == false : false

false == true : false

!(false) : true

x & true : x

x | y : y | x

x | true : true

Page 8: 6. Abstraktní datové typy · 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

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, 2018 B6B36ZAL - Přednáška 6 8

Page 9: 6. Abstraktní datové typy · 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

class MyAbstractDataType:

def __init__(self):

self.dataOne = 1

self.dataTwo = 2

def operationOne(self, argument):

self.dataOne = argument

def operationTwo(self):

return self.dataTwo

myData = MyAbstractDataType()

myData.operationOne(42)

myData.operationTwo()

Abstraktní datový typ jako objekt

Objekt je instancí třídy Třída je vzor – má rozhraní, data (vnitřní proměnné), metody

(funkce)Objektově orientované programování

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 9

Page 10: 6. Abstraktní datové typy · 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

Zásobník

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 10

Page 11: 6. Abstraktní datové typy · 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

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í

LIFO – Last In, First Out

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

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 11

Page 12: 6. Abstraktní datové typy · 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

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

Další operace mohou být peek – čtení hodnoty z vrcholu

Alternativně také třeba top

search – vrátí pozici prvkuPokud se nachází v zásobníku, jinak -1

size – aktuální počet prvkůNebývá potřeba

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 12

Poslední vložená pol.

Předposlední vložená p.

Druhá vložená položka

První vložená položka

Vrchol z.

push pop

Page 13: 6. Abstraktní datové typy · 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

Zásobník

Příklad implementace pomocí List push append

pop pop

isEmpty not len(stack)

Uměli byste implementovat zásobník pomocí pole?

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 13

stack = []

stack.append("dela")

stack.append("to")

stack.append("co")

stack.append("vime")

while len(stack):

print(stack.pop())

Page 14: 6. Abstraktní datové typy · 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

Zásobník

Příklad implementace s definicí rozhraní

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 14

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())

Page 15: 6. Abstraktní datové typy · 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

Zásobník

Příklad použití – kontrola vyvážení závorek

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

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)')

Page 16: 6. Abstraktní datové typy · 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

Fronta

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 16

Page 17: 6. Abstraktní datové typy · 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

Fronta

Dynamická datová struktura umožňující vkládání a odebírání hodnot v pořadí, v jakém byly vloženy

FIFO – First In, First Out

Základní operace Vložení hodnoty na konec fronty

Odebrání hodnoty z čela fronty

Test prázdnosti fronty

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 17

Page 18: 6. Abstraktní datové typy · 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

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

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 18

Čelo fronty

push popposlední … … druhý první

Page 19: 6. Abstraktní datové typy · 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

Fronta

Příklad implementace pomocí List push append

pop pop(0)

isEmpty not len(stack)

Pozor, operace pop(0) je pomalá – víte proč?

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 19

queue = []

queue.append("dela")

queue.append("to")

queue.append("co")

queue.append("vime")

while len(queue):

print(queue.pop(0))

Page 20: 6. Abstraktní datové typy · 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

Fronta

Příklad implementace s definicí rozhraníJaký je rozdíl v použití seznamu oproti minulému příkladu?

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 20

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()

def size(self):

return len(self.items)

q = Queue()

q.enqueue("dela")

q.enqueue("to")

q.enqueue("co")

q.enqueue("vime")

while not q.isEmpty():

print(q.dequeue())

Page 21: 6. Abstraktní datové typy · 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

Fronta

Rozšíření – prioritní fronta Prvky jsou odebírány na základě priority (např. velikosti)

Jak to lze naimplementovat?

Hledání největšího prvku při odebírání

Seřazení po vložení

Seřazení při vložení

Určitě to jde lépe s pomocí složitějších struktur

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 21

Page 22: 6. Abstraktní datové typy · 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

Spojové struktury

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 22

Page 23: 6. Abstraktní datové typy · 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

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ší prvekNone 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, 2018 B6B36ZAL - Přednáška 6 23

Page 24: 6. Abstraktní datové typy · 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

Spojové struktury

Prvek seznamu – Node

Základ i pro komplikovanější struktury

Spojový seznam – LinkedList

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 24

class Node:

def __init__(self,initdata):

self.data = initdata

self.next = None

class LinkedList:

def __init__(self):

self.head = None

Page 25: 6. Abstraktní datové typy · 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

Spojové struktury

Test prázdnosti – isEmpty

Přidání prvku – push

Přidání prvku není závislé na počtu prvků v seznamu

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 25

def isEmpty(self):

return self.head == None

def push(self,item):

node = Node(item)

node.next = self.head

self.head = node

Page 26: 6. Abstraktní datové typy · 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

Spojové struktury

Odebrání prvního prvku – pop

Odebrání prvního prvku není závislé na počtu prvků v seznamu

Zjištění počtu prvků – size

Kompletní projití seznamu!

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 26

def pop(self):

if self.head:

ret = self.head.data

self.head = self.head.next

return ret

def size(self):

current = self.head

count = 0

while current != None:

count += 1

current = current.next

return count

Page 27: 6. Abstraktní datové typy · 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

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

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 27

Page 28: 6. Abstraktní datové typy · 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

Spojové struktury

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 28

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

Page 29: 6. Abstraktní datové typy · 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

Spojové struktury

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 29

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

Page 30: 6. Abstraktní datové typy · 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

Spojové struktury

Vložení prvku na konec – pushEnd

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 30

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

Page 31: 6. Abstraktní datové typy · 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

Spojové struktury

Odebrání posledního prvku – popEnd

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 31

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

Page 32: 6. Abstraktní datové typy · 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

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)

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, 2018 B6B36ZAL - Přednáška 6 32

newNode = Node(item)

newNode.next = node.next

node.next = newNode

Page 33: 6. Abstraktní datové typy · 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

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)

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)

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 33

if prevNode.next == node:

prevNode.next = node.next

node.next = None

Page 34: 6. Abstraktní datové typy · 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

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 endZjednoduš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, 2018 B6B36ZAL - Přednáška 6 34

Page 35: 6. Abstraktní datové typy · 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

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, 2018 B6B36ZAL - Přednáška 6 35

Page 36: 6. Abstraktní datové typy · 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

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, 2018 B6B36ZAL - Přednáška 6 36

Page 37: 6. Abstraktní datové typy · 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

Spojové struktury

Kruhový obousměrný spojový seznam Kombinace předchozích

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 37

Page 38: 6. Abstraktní datové typy · 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

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 stromyJiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 38

Page 39: 6. Abstraktní datové typy · 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

Základy algoritmizace

Dodatečné zdroje: Implementing a Stack in Python

http://interactivepython.org/runestone/static/pythonds/BasicDS/ImplementingaStackinPython.html

Implementing a Queue in Pythonhttp://interactivepython.org/runestone/static/pythonds/BasicDS/ImplementingaQueueinPython.html

Linked Lists in Python http://interactivepython.org/runestone/static/pythonds/BasicDS/ImplementinganUnorderedListLinkedLists.html

Implementing a singly linked list in Python https://www.codefellows.org/blog/implementing-a-singly-linked-list-in-python

Linked listshttp://www.cs.dartmouth.edu/~cs1/chapter19/index.html

Jiří Vokřínek, 2018 B6B36ZAL - Přednáška 6 39