You are on page 1of 8

Strukture podataka i algoritmi

2. kolokvija – 23. lipnja 2020.

RJEŠENJA ZADATAKA

1. Zadana je lista [7, 3, 2, 8, 9, 1].


a. (5) nacrtajte binarno stablo traženja u čijim će čvorovima pisati redom elementi liste.

Rješenje:
U binarno stablo traženja redom dodajemo vrijednosti 7, 3, 2, 8, 9, 1. Znamo da kod dodavanja
novog čvora prvo gledamo je li taj čvor obzirom na korijen veći ili manji. Ukoliko se radi o čvoru
čija je vrijednost manja od vrijednosti korijena dodati ćemo ga u lijevo podstablo, inače ćemo ga
dodati u desno podstablo.

3 8

2 9

b. (3) ispišite unutarnje čvorove stabla.

Rješenje:
Unutarnji čvorovi stabla su svi oni čvorovi koji imaju bar jedno dijete, a to su u ovom stablu
čvorovi: 7, 3, 8, 2.

c. (1) koji čvor je roditelj čvora 1?

Rješenje:
Roditelj čvora 1 je čvor 2.

d. (5) ispišite čvorove stabla onim redoslijedom kako bi ih obilazili preorder postupkom.

Rješenje:
Preorder obilazak prvo obilazi korijen pa onda rekurzivno obilazi lijevo podstablo, a nakon toga
desno podstablo. Preorder obilazak je: 7 3 2 1 8 9.
e. (9) zadana je klasa Tree:
class Tree:
def __init__(self, v, l=None, r=None):
self.value = v
self.left = l
self.right = r

Napišite naredbe koje će rezultirati da u varijabli root bude pokazivač na korijen


binarnog stabla traženja iz a) dijela zadatka.

Rješenje:
Stablo ćemo početi kreirati od listova te ga postupno graditi prema korijenu:
a = Tree(1)
b = Tree(2, l=a)
c = Tree(3, l=b)
d = Tree(9)
e = Tree(8, r=d)
root = Tree(7, l=c, r=e)

2. Zadana je hrpa (min-heap) kao na slici:


1

3 5

7 9

a. (4) Kako će izgledati hrpa nakon što na nju dodamo vrijednost 2?

Rješenje:
U binarnu hrpu element dodajemo na prvo slobodno mjesto (vodeći računa da konvergiramo
prema potpunom binarnom stablu), a nakon što dodamo element popravljamo svojstva hrpe.
Prvo slobodno mjesto je lijevo dijete čvora 5. Budući da je čvor koji dodajemo (2) manji od 5
zamijeniti ćemo mjesta elementima 5 i 2 te ćemo dobiti stablo:
1

3 2

7 9 5

b. (4) Kako izgleda zapis hrpe sa slike u obliku liste?

Rješenje:
Kod zapisa hrpe listom elemente u listu dodajemo po razinama (prvo korijen, pa njegova djeca,
…) te će zapis hrpe listom biti: [1, 3, 2, 7, 9, 5].

c. (2) Kolika je složenost skidanja korijena stabla s hrpe?

Rješenje:
Kod uzimanja korijena iz binarne hrpe trebamo na mjesto korijena dodati posljednji čvor u stablu
(zadnji element liste) te popraviti svojstva hrpe. Za popravljanje svojstava hrpe trebamo otići
najviše do lista u nekom smjeru u hrpi, a složenost tog postupka je: O ( logn ).

d. (10) Napišite funkciju koja će s binarne hrpe h (implementiranu listom) vratiti i obrisati
korijen (svojstva hrpe trebaju se zadržati).

Rješenje:
def remove(self):
if self.size > 1:
t = self.data[0]
self.data[0] = self.data.pop()
self.size -= 1
done = False
s = self.size
i = 0
while not done:
mini = i
left = 2 * i + 1
right = 2 * i + 2
if left < s and self.data[left] < self.data[mini]:
mini = left
if right < s and self.data[right] < self.data[mini]:
mini = right
if mini != i:
self.data[i], self.data[mini] =
self.data[mini], self.data[i]
i = mini
else:
done = True
return t
elif self.size == 1:
self.size = 0
return self.data.pop()
else:
raise Exception('Hrpa je prazna')

3. Zadana je hash funkcija h(k) = k % 5 te hash tablica od 5 pretinaca indeksiranih brojevima od 0


do 4. U koje pretince u tablici će biti dodavani sljedeći elementi ako se sudari rješavaju
ulančavanjem?
a) (1) 5
0
b) (1) 7 1
2
c) (2) 2 3

Rješenje:
Obzirom da se radi o hash funkciji: h(k) = k % 5 adrese na koje vrijednosti redom dolaze su:
- 5 -> h(5) = 5 % 5 = 0 -> na adresu 0
- 7 -> h(7) = 7 % 5 = 2 -> na adresu 2
- 2 -> h(2) = 2 % 5 = 2 -> na adresu 2

Budući da se sudari rješavaju ulančavanjem i vrijednost 7 i 2 doći će na istu lokaciju (2). Dakle, u
retku s indeksom 0 u hash tablici pisati će vrijednost 0, dok će u retku s indeksom 2 pisati
vrijednosti 7 i 2.

4. Za težinski graf na slici:

5
1 2
4
3
6
0 5 3
1
1 4

4 6 3

a. (1) odredite broj bridova grafa


Rješenje:
U grafu na slici ima 9 bridova (01, 05, 04, 15, 12, 23, 34, 35, 45).

b. (2) ispišite sve čvorove stupnja 2

Rješenje:
Za čvor stupnja 2 vrijedi da je on povezan s točno dva duga čvora (incidentan je s dva brida). Na
grafu na slici je to očito samo čvor čija je vrijednost 2.

c. (2) ispišite bar jedan ciklus duljine 4

Rješenje:
Ciklus duljine 4 ima 4 brida te započinje i završava u istom čvoru. Jedan takav ciklus je primjerice:
12351.

d. (4) napišite težinsku matricu grafa

Rješenje:
Težinska matrica grafa je:
0 4 ∞ ∞ 1 6

[ 4


1
6
0
5


3
5 ∞ ∞ 3
0 3 ∞ ∞
3 0 6 1
∞ 6 0 4
∞ 1 4 0
]
e. (6) ispišite čvorove grafa onim redoslijedom kako ih obilazimo dubinskim (DFS)
obilaskom

Rješenje:
Kod dubinskog pretraživanja krenemo od jednog čvora i idemo u dubinu do kuda god možemo
te kada više ne možemo u dubinu, a nismo još došli do kraja vraćamo se natrag i biramo neki
drugi smjer:
0 1 2 3 4 5

f. (9) ispišite redoslijed dodavanja bridova onako kako biste ih dodavali kod traženja
minimalnog razapinjućeg stabla Kruskalovim algoritmom.

Rješenje:
Kod Kruskalovog algoritma bridove poslažemo po težini (od onog s najmanjom prema onom s
najvećom težinom) te jedan po jedan dodajemo u stablo, vodeći računa da ne napravimo ciklus.
Bridovi poredani po težini su redom:
0 – 4 (1)
3 – 5 (1)
1 – 5 (3)
3 – 5 (3)
0 – 1 (4)
4 – 5 (4)
1 – 2 (5)
0 – 5 (6)
4 – 3 (6)

Redom ćemo dodavati bridove:


0–4
3–5
1–5
2–3
0–1

1 2
4
3

0 5 3
1
1

4 3

5. Za graf na slici:
9
0 1

8
1
3
2

7
3 2
a. (5) Opišite postupak traženja najmanje udaljenosti od čvora 0 do svih ostalih čvorova
Dijkstrinim algoritmom.

Rješenje:
U listi (d) ćemo pratiti najkraće udaljenosti od čvora 0 do ostalih čvorova. Na početku lista d ima
oblik:
d[0] = 0
d[1] = 9
d[2] = 8
d[3] = 3

Uzimamo čvor koji je najbliži čvoru 0, a kojeg još nismo obradili. Radi se očito o čvoru 3.
Promatramo sve čvorove do kojih direktno možemo doći iz čvora 3 (1 i 2) te ako je moguće
popravljamo vrijednosti koje pišu u tablici na tim mjestima. Budući da je najkraća udaljenost do
čvora 3 3 te od čvora 3 do čvora 1 je udaljenost 2 slijedi da udaljenost od čvora 0 do čvora 1
može biti 5 što je manje od vrijednosti koja piše u d[1] (9) te relaksiramo vrijednost d[1].
Drugi čvor do kojega možemo direktno doći iz čvora 3 je čvor 2 te je udaljenost od čvora 3 do
čvora 2 jednaka 7 plus još udaljenost do čvora 3 koja je 3 dobivamo vrijednost 10, što je veće od
vrijednosti koja piše u čvoru 2 (8). Nakon obrade čvora 3 vrijednosti liste d su redom;
d[0] = 0
d[1] = 5
d[2] = 8
d[3] = 3

Nadalje ponovo uzimamo čvor koji je najbliži čvoru 0, a kojega još nismo obradili. Sada je to čvor
1 te relaksiramo udaljenosti svih čvorova koji su direktno povezani s čvorom 1, koje još nismo
obradili. Jedini čvor do kojega možemo doći iz čvora 1, a u kojem još nismo bili je čvor 2. Budući
da je d[1] = 5 te da je težina brida od čvora 1 do čvora 2 jednaka 1 slijedi da udaljenost do
čvora 2 preko čvora 1 može biti 6, što je manje od vrijednosti koja piše u d[2] (8). Nakon
obrade čvora 1 vrijednosti elemenata liste su redom:
d[0] = 0
d[1] = 5
d[2] = 6
d[3] = 3

Na kraju obrađujemo čvor 2 i budući da više nemamo što relaksirati završili smo.

b. (9) Implementirajte funkciju koja će za zadanu težinsku matricu vratiti listu najmanjih
udaljenosti od čvora 0 do svih ostalih čvorova.

Rješenje:
def dijkstra(a, v):
distance = [float('inf')] * len(a)
distance[v] = 0
parent = [-1] * len(a)
done = []
while len(done) < len(a):
mini = 0
minv = float('inf')
for i in range(len(a)):
if not i in done and distance[i] < minv:
minv = distance[i]
mini = i
done.append(mini)
for i in range(len(a)):
if a[mini][i] + distance[mini] < distance[i]:
distance[i] = a[mini][i] + distance[mini]
return distance

6. (15) Implementirajte funkciju čiji će parametar biti težinska matrica grafa (mat), a funkcija će
vraćati čvora koji ima najveći stupanj (ako je više takvih čvorova najvećeg stupnja treba vratiti
bilo koji takav).

Rješenje:
U zadanoj matrici (a) potrebno je pronaći redak koji ima najviše brojeva različitih od 0 i inf.
Naime, ako u težinskoj matrici na mjestu (i, j) piše inf znači da ne postoji direktan brid između
čvorova i i j. 
def najveci_stupanj(a):
    ##U listu stupnjevi čuvati ćemo broj stupnjeva
##za svaki čvor grafa
    stupnjevi = [0] * len(a)
    for i in range(len(a)):
        for j in range(len(a[i])):
               if a[i][j] < float('inf') and a[i][j] != 0
                     stupnjevi[i] += 1
    ##Najveći element liste
    maxs = max(stupnjevi)
    ##Indeks najvećeg elementa liste
    return stupnjevi.index(maxs)

You might also like