Download as pdf or txt
Download as pdf or txt
You are on page 1of 39

Visoka škola za informacijske tehnologije

Strukture podataka i algoritmi

Apstraktne tipovi podataka


(stog, red i stablo)
pbrodjanac@vsite.hr

Predrag Brođanac
Apstraktni tipovi podataka
• apstraktni tip podataka (ATP) – zadan je s:
– modelom podataka
– operacijama
• Definira se:
– što su podaci
– kako djeluju operacije nad podacima
• Ne definira se:
– kako su podaci predstavljeni u memoriji
– kako su implementirane operacije

Strukture podataka i algoritmi 2


Apstraktni tipovi podataka
• implementacija ATP-a – realizacija modela u
nekom programskom jeziku
• razne implementacije za isti ATP (djelovanje je
uvijek isto)
• interna struktura je skrivena (enkapsulacija), a
manipuliranje podacima isključivo je preko
metoda

Strukture podataka i algoritmi 3


Stog (stack)
• tanjur dodajemo na vrh
• tanjur uzimamo s vrha
• LIFO (Last-In, First-Out)
• dodavanje – push(v)
• brisanje – pop()
• ima li elemenata – isEmpty()

Strukture podataka i algoritmi 4


Stog - primjer
Što će ostati na stogu s nakon sljedećih operacija ako je
s na početku bio prazan?
s.push(1)
s.push(3)
t = s.pop()
s.push(4)
4
3
s.pop()
1
s.push(t)
t: 3

Strukture podataka i algoritmi 5


Stog – implementacija listom
class Stack:
def __init__(self):
self.data = list()

def push(self, v):


self.data.append(v)

def isEmpty(self):
return len(self.data) == 0

def pop(self):
if not self.isEmpty():
return self.data.pop()
else:
raise IndexError('Stog je prazan')
Strukture podataka i algoritmi 6
Stog – implementacija listom –
složenosti
• dodavanje (push) – O(1)
• brisanje (pop) – O(1)

Strukture podataka i algoritmi 7


Stog – implementacija vezanom
listom

head

Strukture podataka i algoritmi 8


Stog – implementacija vezanom
listom
class Stack(LinkedList):
def __init__(self):
super().__init__()

def push(self, v):


a = Node(v)
a.next = self.head
self.head = a

def isEmpty(self):
return self.head == None

def pop(self):
if self.isEmpty():
raise IndexError('Stog je prazan')
else:
t = self.head
self.head = self.head.next
return t
Strukture podataka i algoritmi 9
Stog – implementacija vezanom
listom – složenosti
• dodavanje (push) – O(1)
• brisanje (pop) – O(1)

Strukture podataka i algoritmi 10


Red (queue)
• novi kupac dolazi na kraj
• prvi će biti poslužen kupac s
početka
• FIFO (First-In, First-Out)
• dodavanje – enqueueu(v)
• brisanje – dequeue()
• ima li elemenata – isEmpty()

Strukture podataka i algoritmi 11


Red - primjer
Što će ostati na redu r nakon sljedećih operacija ako je r
na početku bio prazan?
r.enqueue(1)
r.enqueue(3)
1
t = r.dequeue()
4
r.enqueue(4)
3
r.dequeue()
1
r.enqueue(t)
t: 1

Strukture podataka i algoritmi 12


Red – implementacija listom
class Queue:
def __init__(self):
self.data = list()

def enqueue(self, v):


self.data.append(v)

def isEmpty(self):
return len(self.data) == 0

def dequeue(self):
if not self.isEmpty():
return self.data.pop(0)
else:
raise IndexError('Stog je prazan')
Strukture podataka i algoritmi 13
Red – implementacija listom –
složenosti
• dodavanje (push) – O(1)
• brisanje (pop) – O(n) – svaki se element
pomiče za jedno mjesto prema lijevo

Strukture podataka i algoritmi 14


Red – implementacija vezanom listom

head

tail

Strukture podataka i algoritmi 15


Red – implementacija vezanom listom
class Queue(LinkedList):
def __init__(self):
super().__init__()
self.tail = self.head

def enqueueu(self, v):


a = Node(v)
if self.head == None:
self.tail = a
self.head = a
else:
self.tail.next = a
self.tail = a

def isEmpty(self):
return self.head == None

def dequeue(self):
if self.isEmpty():
raise IndexError('Red je prazan')
else:
t = self.head
self.head = self.head.next
return t
Strukture podataka i algoritmi 16
Red – implementacija listom –
složenosti
• dodavanje (push) – O(1)
• brisanje (pop) – O(1)

Strukture podataka i algoritmi 17


Stablo (tree)
• čvor i poveznica
• korijen (root) - osnovni čvor (folder)
• čvorovi mogu imati više djece
• list – čvor bez djece
• unutarnji čvor – čvor koji ima najmanje
jedno dijete
• svaki čvor (osim korijena) ima samo
jednog roditelja

Strukture podataka i algoritmi 18


Binarno stablo/1
0 A
• svaki čvor ima najviše dvoje
1 B C
djece (lijevo i desno dijete)
• razina čvora – duljina puta od
2 D E korijena do čvora (razina
korijena je 0)
3 F
• dubina stabla – udaljenost
korijena do najudaljenijeg čvora
(najveća razina)
• susjedi – čvorovi na istoj razini

Strukture podataka i algoritmi 19


Binarno stablo/2
0 A
• stupanj čvora – broj djece
1 B C • potpuno stablo – svaki čvor osim
lista ima stupanj 2
2 D E • potpuno binarno stablo dubine n
ima 2𝑛+1 − 1 čvorova:
3 F
– 2𝑛 listova i
– 2𝑛 − 1 unutarnjih čvorova
• binarno stablo s n čvorova ima
dubinu najmanje 𝑙𝑜𝑔2 𝑛 + 1 − 1

Strukture podataka i algoritmi 20


Binarno stablo - implementacija
value class Tree:
left right def __init__(self, v, l=None, r=None):
self.value = v
value value
None None
self.left = l
None right
self.right = r
value >>> x = Tree('F')
None None >>> x = Tree('E', l=x)
>>> y = Tree('D')
A >>> x = Tree('C', y, x)
>>> y = Tree('B')
>>> r = Tree('A', y, x)
B C >>> r
<__main__.Tree object at 0x000001EB65515A20>
>>> r.value
D E 'A'
>>> r.left.value
'B'
F >>> r.right.left.value
'D'

Strukture podataka i algoritmi 21


Obilasci binarnog stabla
• obilazak – prolazak kroz sve čvorove binarnog stabla
(antivirusni programi)
• stablo je rekurzivna struktura
A

B C

D E F

G H I

Strukture podataka i algoritmi 22


Obilasci binarnog stabla - preorder
A
• preorder
– korijen B C

– lijevo podstablo
D E F
– desno podstablo
G H I

Strukture podataka i algoritmi 23


Obilasci binarnog stabla - preorder
A
• preorder
– korijen B C

– lijevo podstablo
D E F
– desno podstablo
G H I

Strukture podataka i algoritmi 24


Obilasci binarnog stabla - preorder
A
• preorder
– korijen B C

– lijevo podstablo
D E F
– desno podstablo
G H I

A B

Strukture podataka i algoritmi 25


Obilasci binarnog stabla - preorder
A
• preorder
– korijen B C

– lijevo podstablo
D E F
– desno podstablo
G H I

A B D

Strukture podataka i algoritmi 26


Obilasci binarnog stabla - preorder
A
• preorder
– korijen B C

– lijevo podstablo
D E F
– desno podstablo
G H I

A B D E

Strukture podataka i algoritmi 27


Obilasci binarnog stabla - preorder
A
• preorder
– korijen B C

– lijevo podstablo
D E F
– desno podstablo
G H I

A B D E G

Strukture podataka i algoritmi 28


Obilasci binarnog stabla - preorder
A
• preorder
– korijen B C

– lijevo podstablo
D E F
– desno podstablo
G H I

A B D E G

Strukture podataka i algoritmi 29


Obilasci binarnog stabla - preorder
A
• preorder
– korijen B C

– lijevo podstablo
D E F
– desno podstablo
G H I

A B D E G C

Strukture podataka i algoritmi 30


Obilasci binarnog stabla - preorder
A
• preorder
– korijen B C

– lijevo podstablo
D E F
– desno podstablo
G H I

A B D E G C F H I

Strukture podataka i algoritmi 31


Obilasci binarnog stabla - inorder
A
• inorder
– lijevo podstablo B C

– korijen
D E F
– desno podstablo
G H I

D B G E

Strukture podataka i algoritmi 32


Obilasci binarnog stabla - inorder
A
• inorder
– lijevo podstablo B C

– korijen
D E F
– desno podstablo
G H I

D B G E A

Strukture podataka i algoritmi 33


Obilasci binarnog stabla - inorder
A
• inorder
– lijevo podstablo B C

– korijen
D E F
– desno podstablo
G H I

D B G E A C H F I

Strukture podataka i algoritmi 34


Obilasci binarnog stabla - postorder
A
• postorder
– lijevo podstablo B C

– desno podstablo
D E F
– korijen
G H I

D G E B

Strukture podataka i algoritmi 35


Obilasci binarnog stabla - postorder
A
• postorder
– lijevo podstablo B C

– desno podstablo
D E F
– korijen
G H I

D G E B H I F C

Strukture podataka i algoritmi 36


Obilasci binarnog stabla - postorder
A
• postorder
– lijevo podstablo B C

– desno podstablo
D E F
– korijen
G H I

D G E B H I F C A

Strukture podataka i algoritmi 37


Obislasci - implementacija
def preorder(self):
s = str(self.value)
if self.left != None:
s += self.left.preorder()
if self.right != None:
s += self.right.preorder()
return s
def inorder(self):
s = ''
if self.left != None:
s += self.left.inorder()
s += str(self.value)
if self.right != None:
s += self.right.inorder()
return s

Strukture podataka i algoritmi 38


Kraj 4. predavanja

Hvala na pozornosti!

Strukture podataka i algoritmi 39

You might also like