Katedra za računarsku tehniku i informatiku Algoritmi i strukture podataka Milo V. Tomašević
Odsek za softversko inženjerstvo [SI]
Algoritmi i strukture podataka
Nelinearne strukture podataka Jedan element strukture može biti u vezi sa više od dva druga elementa – višedimenzionalnost Vrste struktura stabla grafovi Operacije Memorijska reprezentacija ulančana (češće) sekvencijalna
Algoritmi i strukture podataka
Stabla Konačan, neprazan skup elemenata - čvorova postoji poseban čvor - koren ostali čvorovi se mogu razdvojiti u disjunktne podskupove koji su stabla - podstabla nivo 0
A
B
E
C
F
nivo 1
D
G
H
J
nivo 2
I
K
L
nivo 3
Koreno stablo Nelinearne strukture podataka
Stabla
Definicije i terminologija
Algoritmi i strukture podataka
Terminologija grane stepen (ulazni, izlazni) čvorovi neterminalni i terminalni (listovi) otac, sinovi, braća predak, potomak put, dužina puta nivo, visina (dubina) šuma
Nelinearne strukture podataka
Stabla
Definicije i terminologija
Algoritmi i strukture podataka
Definicije stabla slična ekvivalentna uređena poziciona interna dužina puta - PI eksterna dužina puta - PE interni čvorovi nmax=(mh+1 - 1)/(m - 1) eksterni čvorovi e = n(m - 1) + 1
Nelinearne strukture podataka
Stabla
Definicije i terminologija
Algoritmi i strukture podataka
Interni i eksterni čvorovi A
B
A
C
D
E
B
F
C
D
G
E
F
G
a)
Nelinearne strukture podataka
b)
Stabla
Definicije i terminologija
Algoritmi i strukture podataka
Predstavljanje stabla A B
A
E J
D
a)
B
E J
F
I C
G
H
K
L
F
b)
C D G H I K L
Alternativne grafičke predstave: ugneždeni skupovi identacija Nelinearne strukture podataka
Stabla
Predstavljanje stabala
Algoritmi i strukture podataka
Ulančana reprezentacija A B D
C E
F
G
fleksibilna za proizvoljne topologije neefikasno korišćenje prostora ponekad i pokazivač na oca Nelinearne strukture podataka
Stabla
Predstavljanje stabala
Algoritmi i strukture podataka
Ulančana reprezentacija A
B
C
B
D A
E A
C
F
D E
G
F G
jedna ulančana lista za sinove svakog čvora efikasnije korišćenje prostora
Nelinearne strukture podataka
Stabla
Predstavljanje stabala
Algoritmi i strukture podataka
Sekvencijalna reprezentacija 1 2
A B
2 4
3 A
B
C
D
E
F
G
0
1
1
2
2
3
5
5 V
3
C
0
6
4
D
0
0
5
E
7
0
6
F
0
0
7
G
0
0
Za čvor k u vektoru: otac - ⌊(k + m – 2)/m⌋ = ⌈(k - 1)/m⌉ sinovi - m(k - 1) +2, m(k - 1) +3, ... , mk + 1 Nelinearne strukture podataka
Stabla
Predstavljanje stabala
Algoritmi i strukture podataka
Binarna stabla Konačan skup čvorova koji je ili prazan ili se sastoji od korena sa dva posebna podstabla (levim i desnim) koja su, takođe, binarna stabla Različito od uređenog stabla sa m=2! PE = PI + 2n 1: PI = 0, PE =2 n : PE(n) = PI (n) + 2n n+1:PE(n + 1) = PE(n) - k + 2(k + 1) = PE(n) + k +2 = PI(n) + 2n + k + 2 = PI(n + 1) + 2(n + 1)
Nelinearne strukture podataka
Stabla
Binarna stabla
Algoritmi i strukture podataka
Vrste binarnih stabala Puno stablo svi čvorovi grananja imaju stepen 2 n0 = n2 + 1 n = 2n2 + 1
Nelinearne strukture podataka
Stabla
Binarna stabla
Algoritmi i strukture podataka
Vrste binarnih stabala 1 a) 2
3
4
5
8
9
10
6
11
12
kompletno stablo
7
13
14
15
1 b)
2
3
4
8
Nelinearne strukture podataka
5
9
6
7
skoro kompletno stablo
10
Stabla
Binarna stabla
Algoritmi i strukture podataka
Vrste binarnih stabala broj čvorova nmax = 2h+1 – 1 visina hmin = ⌈log (n + 1)⌉ - 1 vektorska reprezentacija, za čvor i otac ⌊i/2⌋ levi sin 2i, 2i ≤ n desni sin 2i+1, 2i +1 ≤ n nivo 0
nivo 1
nivo 2
nivo 3
24444443 144424443 14243 123 1
2
Nelinearne strukture podataka
3
4
5
6
Stabla
7
8
9
10
Binarna stabla
Algoritmi i strukture podataka
Minimizacija interne dužine puta Najgori slučaj degenerisano stablo - jedan čvor po nivou PI = n(n – 1)/2 ~ O(n2) Prosečan slučaj O(n √n) Najbolji slučaj čvorovi što bliže koranu PImin = 0+1+1+2+2+2+2+... = ∑ ⌊logn ⌋ ⇒ O(n logn) svi listovi na dva susedna nivoa
Nelinearne strukture podataka
Stabla
Minimizacija dužine puta
Algoritmi i strukture podataka
Težinska eksterna dužina puta Eksternim čvorovima pridružene “težine” w Težinska eksterna dužina puta PWE = ∑ wi li
3
3
5
7
11
5
7
7
Nelinearne strukture podataka
11
11
Stabla
3
5
Minimizacija dužine puta
Algoritmi i strukture podataka
Huffman-ov algoritam HUFFMAN(W, e) for i = 1 to e do z = GETNODE w(z) = W[i] PQ-INSERT(H, z) end_for for i = 1 to e - 1 do z = GETNODE x = PQ-MIN-DELETE(H) y = PQ-MIN-DELETE(H) w(z) = w(x)+w(y) left(z) = x right(z) = y PQ-INSERT(H, z) end_for return z
Nelinearne strukture podataka
Stabla
~ O(e loge)
Minimizacija dužine puta
Algoritmi i strukture podataka
Huffman-ov algoritam Primena – Huffman-ovi kodovi E:4
B:6
D:7
F:10
C:31
A:42
a) D:7
F:10
10
C:31
0
1
E:4
B:6
A:42
b) 10
17
C:31
0
1
0
1
E:4
B:6
D:7
F:10
A:42
C:31
27 0
1
10
c)
A:42
17
0
1
0
1
E:4
B:6
D:7
F:10
d) Nelinearne strukture podataka
Stabla
Minimizacija dužine puta
Algoritmi i strukture podataka
Huffman-ov algoritam A:42
100
58 0
1
27
0
C:31
0
1
A:42
58 0
1
10
17
1
27
C:31 1
0
0
1
0
1
E:4
B:6
D:7
F:10
10
e)
17
0
1
0
1
E:4
B:6
D:7
F:10
f)
Simboli
A
B
C
D
E
F
Verovatnoće
42
6
31
7
4
10
Kodovi Nelinearne strukture podataka
0 1001 Stabla
11 1010 1000 1011 Minimizacija dužine puta
Algoritmi i strukture podataka
Huffman-ov algoritam Alternativno rešenje sa stablom veće visine 100 0
1
A:42
58 1
0 27
C:31
0
1
F:10
17 0
1
D:7
Nelinearne strukture podataka
10 0
1
E:4
B:6
Stabla
Minimizacija dužine puta
Algoritmi i strukture podataka
Operacije sa binarnim stablom A
A
B
F
E
B
H
I
D
F
E
G
H
G a)
b)
I
Umetanje čvora D
A
B
D
C
E
Umetanje čvora C
F
G
H
I
c)
Nelinearne strukture podataka
Stabla
Operacije umetanja i brisanja
Algoritmi i strukture podataka
Obilazak binarnog stabla Rekurzivne realizacije obilazaka PREORDER(root) if (root ≠ nil) then P(root) PREORDER(left(root)) PREORDER(right(root)) end_if
POSTORDER(root) if (root ≠ nil) then POSTORDER(left(root)) POSTORDER(right(root)) P(root) end_if
INORDER(root) if (root ≠ nil) then INORDER(left(root)) P(root) INORDER(right(root)) end_if Nelinearne strukture podataka
Stabla
Operacije obilaska
Algoritmi i strukture podataka
Preorder S
next
posećeni čvor
preorder poredak
A
A
A
C
B
B
AB
CE
D
D
ABD
CE
nil
C
E
E
ABDE
C
G
G
ABDEG
C
nil C
ABDEGC
F
F
ABDEGCF
I
H
H
ABDEGCFH
I
nil I
ABDEGCFHI
A
PREORDER-I(root) PUSH(S, root) while (not STACK-EMPTY(S)) do next = POP(S) while (next ≠ nil) do P(next) if (right(next) ≠ nil) then PUSH(S, right(next)) end_if next = left(next) end_while end_while
⇒ O(n)
C F
nil
I nil
Nelinearne strukture podataka
Stabla
Operacije obilaska
Algoritmi i strukture podataka Nelinearne strukture podataka
Postorder POSTORDER-I(root) next = root while (next ≠ nil) do PUSH(S, next) next =left(next) end_while while (not STACK-EMPTY(S)) do next = POP(S) if (next > 0) then PUSH(S, -next) next = right(next) while (next ≠ nil) do PUSH(S, next) next = left(next) end_while else next = - next P(next) end_if end_while Stabla
~ O(n)
Operacije obilaska
Algoritmi i strukture podataka
Obilazak po nivoima LEVEL-ORDER(root) next = root INSERT(Q, next) while (not QUEUE-EMPTY(Q)) do next = DELETE(Q) P(next) if (left(next) ≠ nil) then INSERT(Q, left(next)) end_if if (right(next) ≠ nil) then INSERT(Q, right(next)) end_if end_while
~ O(n)
Algoritam slične strukture i za preorder! Nelinearne strukture podataka
Stabla
Operacije obilaska
Algoritmi i strukture podataka
Povezana binarna stabla Problemi efikasniji obilazak određivanje prethodnika i sledbenika za proizvoljno zadati čvor neiskorišćeni pokazivači (n+1 – više od 50%) Povezana (threaded) binarna stabla strukturni pokazivači veze po izabranom načinu obilaska
Nelinearne strukture podataka
Stabla
Povezana binarna stabla
Algoritmi i strukture podataka
Povezana binarna stabla A B D
C E
G
F H
I
lf = 1 pokazivač na levo podstablo lf = 0 veza na prethodnika rf = 1 pokazivač na desno podstablo rf = 0 veza na sledbenika Nelinearne strukture podataka
Stabla
Povezana binarna stabla
Algoritmi i strukture podataka
Povezana binarna stabla Nalaženje sledbenika zadatog čvora po inorderu INSUCC(x) s = right(x) if (rf(x) = 1) then while (lf(s) = 1) do s = left(s) end_while end_if return s
INORDER-THR(root) next = root while (lf(next) = 1) do next = left(next) end_while repeat P(next) next = INSUCC(next) until next = nil
Obilazak povezanog stabla po inorderu Nelinearne strukture podataka
Stabla
Povezana binarna stabla
Algoritmi i strukture podataka
Povezana binarna stabla Umetanje u povezano stablo INSERT-RT(x, y) right(y) = right(x) rf(y) = rf(x) left(y) = x lf(y) = 0 right(x) = y rf(x) = 1 if (rf(y) = 1) then s = INSUCC(y) left(s) = y end_if
Nelinearne strukture podataka
X
X Z
Y
V a)
Stabla
Z b)
V
Povezana binarna stabla
Algoritmi i strukture podataka
Stabla višeg stepena Problem u stablima stepena m > 2 neefikasno korišćenje prostora u ulančanoj reprezentaciji neiskorišćeni pokazivači n(m-1)+1 iskorišćeni pokazivači n-1 Rešenje odgovarajuće binarno stablo iste semantike binarna relacija “najlevlji sin – desni brat” svi sinovi istog oca u ulančanoj listi
Nelinearne strukture podataka
Stabla
Stabla višeg stepena
Algoritmi i strukture podataka
Stabla višeg stepena a)
A
B
E
C
F
b)
Nelinearne strukture podataka
H
I
J
A
B
E
G
D
F
C
G
D
H
Stabla
I
J
Stabla višeg stepena
Algoritmi i strukture podataka
Stabla višeg stepena CON-M2BIN(P) m = INPUT(P) root = b = GETNODE info(b) = info(m) PUSH(S, (level(m), b))
Konverzija m-arnog stabla u odgovarajuće binarno stablo
Nelinearne strukture podataka
while (m = INPUT(P)) do b = GETNODE info(b) = info(m) pred_level = level(TOP(S)) pred_addr = addr(TOP(S)) if (level(m) > pred_level) then left(pred_addr) = b else while (pred_level > level(m)) do POP(S) pred_level = level(TOP(S)) pred_addr = addr(TOP(S)) end_while right(pred_addr) = b POP(S) end_if PUSH(S, (level(m), b)) end_while return root Stabla
Stabla višeg stepena
Algoritmi i strukture podataka
Stabla višeg stepena Tekući čvor
S
Pokazivač
0,A
0,A
1,B
0,A 1,B
left (A) = B
2,E
0,A 1,B 2,E
left (B) = E
2,F
0,A 1,B 2,F
right (E) = F
1,C
0,A 1,C
right (B) = C
2,G
0,A 1,C 2,G
left (C) = G
1,D
0,A 1,D
right (C) = D
2,H
0,A 1,D 2,H
left (D) = H
2,I
0,A 1,D 2,I
right (H) = I
2,J
0,A 1,D 2,J
right (I) = J
Nelinearne strukture podataka
Stabla
Stabla višeg stepena
Algoritmi i strukture podataka
Predstavljanje aritmetičkih izraza Binarno stablo predstavlja aritmetički izraz čvorovi grananja – unarni i binarni operatori listovi - operandi (A+B/C)(D-E)
A*B+C/D
*
+
+
A
-
/
B
D
*
E
A
B
C
D
C a)
Nelinearne strukture podataka
/
b) Stabla
Primene stabala
Algoritmi i strukture podataka
Predstavljanje aritmetičkih izraza Obilazak stabla preorder daje prefiksni izraz postorder daje postfiksni izraz inorder daje infiksni izraz (ako nema zagrada!) Izračunavanje izraza predstavljenog stablom CALC-EXP(r) case (info(r)) of op__add:return(CALC-EXP(left(r)) + CALC-EXP(right(r)) op__sub:return(CALC-EXP(left(r)) - CALC-EXP(right(r)) ... operand:return(VAL(right(r))) end_case
Nelinearne strukture podataka
Stabla
Primene stabala
Algoritmi i strukture podataka
Grafovi Modeliranje proizvoljnih nelinearnih relacija Graf G je par skupova (V, E) V (čvorovi) - konačan neprazan skup E (grane) - binarne relacije između čvorova grana (u, v) incidentna na čvorovima G1 2
4
G2 5
1
4
2 1
3
6
5 b)
a) Nelinearne strukture podataka
3
Grafovi
Definicije i terminologija
Algoritmi i strukture podataka
Terminologija Usmereni, neusmereni i mešoviti grafovi Susednost čvorova Ulazni i izlazni stepen čvora Petlje i paralelne grane Prosti graf, multigraf, hipergraf, podgraf Težinski graf Put, prost put, dostižnost
Nelinearne strukture podataka
Grafovi
Definicije i terminologija
Algoritmi i strukture podataka
Terminologija Ciklus, ciklični i aciklični grafovi Kompletni, gusti i retki grafovi Bipartitni graf Povezani graf, povezane komponente Slobodno stablo acikličan, povezan, neusmeren graf
Nelinearne strukture podataka
Grafovi
Definicije i terminologija
Algoritmi i strukture podataka
Matrična reprezentacija Matrica susednosti A a[i, j] = 1 ako (i, j) ∈ E a[i, j] = 0 ako (i, j) ∉ E a[i, j] = w(i, j) za težinske grafove
A=
0 0 0 0
1 0 0 1
0 1 0 1
0 0 0 0
0 0 1 1
0 0 0 0
0 0 0 0 0 1
A=
0 0 1 1
0 0 0 0
1 0 0 1
1 0 1 0
1 0 0 0
1 0 0 0 0
0 0 0 0 0 0 a)
Nelinearne strukture podataka
b)
Grafovi
Predstavljanje grafova
Algoritmi i strukture podataka
Ulančana reprezentacija Liste susednosti vektor zaglavlja ulančane liste suseda element liste odgovara grani AL
AL 1
2
1
2
3
2
3
5
4
2
5
6
3
5
3
4
3
1
4
4
1
3
5
1
5
b)
6 a)
Nelinearne strukture podataka
Grafovi
Predstavljanje grafova
Algoritmi i strukture podataka
Ulančana reprezentacija Inverzne liste susednosti lista za čvor sadrži sve čvorove kojima je sused pogodno za izračunavanje ulaznog stepena IAL 1 2
1 A
4
3
2
4
5
3
4
6
5
4
Multiliste element koji predstavlja granu ulančan u dve liste identifikacija oba čvora i dva pokazivača Nelinearne strukture podataka
Grafovi
Predstavljanje grafova
Algoritmi i strukture podataka
Predstavljanje grafova Prostorna složenost usmereni neusmereni
matrica
liste (netežinski)
liste (težinski)
n2
n + 2e
n + 3e
n(n + 1)/2
n + 4e
n + 6e
Matrična reprezentacija pogodnija za dinamičku promenu broja grana za direktan pristup grani Ulančana reprezentacija pogodnija za dinamičku promenu broja čvorova za određivanje suseda Nelinearne strukture podataka
Grafovi
Predstavljanje grafova
Algoritmi i strukture podataka
Obilazak grafa Svi čvorovi se posete samo jednom u nekom linearnom poretku Poredak zavisi od izbora početnog čvora Ako se ne posete svi zbog nedostižnosti, nastavlja se sa nekim od neposećenih Na čvor se može naići više puta, ali samo prvi put se poseti Osnovni algoritmi zasnovani na susednosti: obilazak po širini (BFS) obilazak po dubini (DFS)
Nelinearne strukture podataka
Grafovi
Obilazak grafa
Algoritmi i strukture podataka
Obilazak grafa po širini Strategija algoritma poseti početni čvor poseti njegove susede poseti njihove neposećene susede istim redom, ... Posete u “talasima”, po nivoima iste udaljenosti Koristi se neprioritetni red za čekanje i vektor posećenosti Vremenska složenost O(n2) za matričnu reprezentaciju O(max(n, e)) za ulančanu reprezentaciju
Nelinearne strukture podataka
Grafovi
Obilazak grafa
Algoritmi i strukture podataka
Obilazak grafa po širini BFS(G, v) for i = 1 to n do visit [i] = false end_for visit [v] = true INSERT(Q, v) while (not QUEUE-EMPTY(Q)) do v = DELETE(Q) for { u : (v, u) ∈ E} do if (not visit [u]) then visit [u] = true INSERT(Q, u) end_if end_for end_while
Nelinearne strukture podataka
Grafovi
Obilazak grafa
Algoritmi i strukture podataka
Obilazak grafa po širini A
l=0
A
A B
B
E
C
l=1
D
F
G
H
l=2
J l=3
C
D
ABCD
C
D
E
D
E
F
E
F
G
F
G
I
ABCDEFGI
G
I
ABCDEFGI
ABCDE ABCDEF ABCDEFG
I
H
J
ABCDEFGIHJ
I
Nelinearne strukture podataka
Grafovi
Obilazak grafa
Algoritmi i strukture podataka
Obilazak grafa po dubini Strategija algoritma poseti početni čvor poseti jednog njegovog suseda poseti jednog neposećenog suseda prethodnog ako ga nema, vraća se do poslednjeg prethodnika koji ima neposećenog suseda Slično preorderu kod stabla Vremenska složenost O(n2) za matričnu reprezentaciju O(max(n, e)) za ulančanu reprezentaciju
Nelinearne strukture podataka
Grafovi
Obilazak grafa
Algoritmi i strukture podataka
Obilazak grafa po dubini Rekurzivna realizacija DFS-VISIT(v) visit [v] = true for { u, (v, u) ∈ E } do if (not visit [u]) then DFS-VISIT(u) end_if end_for
DFS(G, v) for i = 1 to n do visit [i] = false end_for DFS-VISIT(v)
Može i iterativna realizacija korišćenjem steka
Nelinearne strukture podataka
Grafovi
Obilazak grafa
Algoritmi i strukture podataka
Obilazak grafa po dubini Primer 1/14
2/13
8/9
A
B
C 10/11 G
D
E
F
4/5
3/6
7/12
Nelinearne strukture podataka
Grafovi
ABEDFCG
Obilazak grafa
Algoritmi i strukture podataka
Primene obilaska grafa Određivanje najkraćeg rastojanja između dva čvora (i i j) u netežinskom grafu rastojanje do j jednako broju nivoa l[j] BFS se startuje od polaznog čvora i (l[i] = 0) pri poseti nekog čvora u preko drugog čvora v postavi se njegov nivo na l[u] = l[v] + 1 kad se poseti čvor j rastojanje je nađeno kao minimalni broj grana od čvora i Provera cikličnosti postojanje poprečnih ili povratnih grana
Nelinearne strukture podataka
Grafovi
Obilazak grafa
Algoritmi i strukture podataka
Primene obilaska grafa Određivanje povezanih komponenata u neusmerenom grafu CONN-COMP(G) n_cc = 0 for i = 1 to n do visit[i] = false end_for for i = 1 to n do if (not (visit[i]) then n_cc = n_cc + 1 DFS-VISIT(i) → CC(n_cc) end_if end_for
Nelinearne strukture podataka
Grafovi
Obilazak grafa
Algoritmi i strukture podataka
Primene obilazaka grafa 1/16
2/15
3/12
4/7
A
B
C
D
H
G
F
E
13/ 14
9/10
8/11
5/6
a)
A
B
C
D
ABH
CD
H
G
F
E
GF
E
b)
Nelinearne strukture podataka
c)
Grafovi
Obilazak grafa
Algoritmi i strukture podataka
Obuhvatna stabla Obuhvatno stablo ST = (U, E') neusmerenog, povezanog grafa G = (V, E) sadrži sve čvorove grafa, U = V sadrži određen broj grana, E' ⊆ E, tako da su svi čvorovi povezani, ali da nema ciklusa
a) Nelinearne strukture podataka
c)
b) Grafovi
d) Obuhvatna stabla
Algoritmi i strukture podataka
Obuhvatna stabla Obuhvatno stablo – slobodno stablo Za nepovezan graf – obuhvatna šuma STi = (Vi, Ei) Generiše se pomoću algoritama obilaska BFS ili DFS na početku E' prazan skup kada se dođe do neposećenog čvora u, dolazna grana (v, u) se uključi u stablo (E' = E' + {(v, u)} u then delu algoritma Broj grana u obuhvatnom stablu - n - 1 Primene
Nelinearne strukture podataka
Grafovi
Obuhvatna stabla
Algoritmi i strukture podataka
Obuhvatna stabla A
A
B
D
C
E
B
F
G
D
C
E
H
F
H
a)
G
BFS stablo
b) A
B
D
C
E
F
G
DFS stablo H
c)
Nelinearne strukture podataka
Grafovi
Obuhvatna stabla
Algoritmi i strukture podataka
Minimalna obuhvatna stabla Cena obuhvatnog stabla – ∑ w(u, v)
(u, v) ∈ E'
MST – obuhvatno stablo čija je cena minimalna Ako je U ⊆ V i ako je (u, v) grana najmanje težine takva da je u ∈ U i v ∈ (V – U), onda postoji MST koje sadrži (u, v) V-U U v u y x
Nelinearne strukture podataka
Grafovi
Obuhvatna stabla
Algoritmi i strukture podataka
Prim-ov algoritam Inkrementalno gradi MST počevši od polaznog čvora dodajući po jednu granu i jedan čvor Bira granu najmanje težine od onih koje povezuju čvorove koji su već uključeni u MST i čvorove koji još nisu uključeni PRIM(G, s) U = {s} E' = ∅ while (U ≠ V) do find (u, v) ⇒ min {w(u, v) : (u ∈ U) and (v ∈ (V- U)) } U = U + {v} E' = E' + {(u, v)} end_while MST = (U, E')
Nelinearne strukture podataka
Grafovi
Obuhvatna stabla
Algoritmi i strukture podataka
Prim-ov algoritam 16
E
F
E
F
5
21 11
a) 19
C
b) 19
D
6
33
C
10
14
A
10
14
B
A
B
18
18
16
E
16
E
F
F
5
c) 19
33
C
5 11
11
D
6
d) 19
A
B
A
E
F
F 5 11
11 6
D
C
f) A
B
6
D
B 18
18
Nelinearne strukture podataka
16
5
21
A
B 18
16
C
D
6 14
18
e) 19
C 33
10
14
E
D
6
33
Grafovi
Obuhvatna stabla
Algoritmi i strukture podataka
Kruskal-ov algoritam KRUSKAL(G) E' = ∅ for each (u, v) ∈ E do PQ-INSERT(PQ, w(u, v)) end_for num = 0 while (num < n - 1) do w(u,v) = PQ-MIN-DELETE(PQ) if ((u ∈ Ti) and (v ∈ Tj) and (i ≠ j)) then E' = E' + {(u, v)} Tk = Ti + Tj num = num + 1 end_if end_while MST = (V, E')
Nelinearne strukture podataka
Grafovi
Obuhvatna stabla
Algoritmi i strukture podataka
Kruskal-ov algoritam Polazi od šume nepovezanih čvorova - podstabala Inkrementalno dodaje po jednu granu Bira granu koja: ima najmanju težinu od preostalih, neuključenih ne zatvara ciklus Završava kada se uključi n - 1 grana Vremenska složenost - O(e log e)
Nelinearne strukture podataka
Grafovi
Obuhvatna stabla
Algoritmi i strukture podataka
Kruskal-ov algoritam 16
E
F
E
F
5
21
5
11 19
C
D
6
C
(D,F)+
D
(B,F) +
D
(B,C)(E,F) +
33 10
14
A
B
A
18 a)
b)
E
F
E 5
C
D
6
A
B
F 5
(B,D)(C,F) +
11
C
6
A
c)
E
B
B d)
16
F
E
16
F
5
5
11
C A
11 6
D
C
(A,B)+
B
A
6
D
B 18
e)
Nelinearne strukture podataka
f)
Grafovi
Obuhvatna stabla
Algoritmi i strukture podataka
Određivanje dostižnosti Matrica puta (dostižnosti) P p[i, j] = 1 ako postoji put od i do j p[i, j] = 0 ako ne postoji put od i do j a[i, k]a[k, j] = 1 ako postoji put od i do j preko k aij(2) = ∑ a[i, k]a[k, j] - broj puteva dužine 2 od i do j A(2) = A2 aij(3) = ∑ a[i, k](2)a[k, j] - broj puteva dužine 3 od i do j A(3) = A3 , ... , A(m) , ...
Nelinearne strukture podataka
Grafovi
Određivanje dostižnosti
Algoritmi i strukture podataka
Određivanje dostižnosti Algoritam za određivanje matrice puta Naći B(n) = A +A(2) + ... + A(n) = A +A2 + ... + An Članovi matrice puta P se određuju kao: p[i, j] = 1 ako je b[i, j](n) > 0 p[i, j] = 0 ako je b[i, j](n) = 0 Optimizacije: u prostoru - matrica bitova u vremenu – or i and umesto * i + Vremenska složenost - O(n4)
Nelinearne strukture podataka
Grafovi
Određivanje dostižnosti
Algoritmi i strukture podataka
Warshall-ov algoritam WARSHALL(A) P=A for k = 1 to n do for i = 1 to n do for j = 1 to n do p[i, j] = p[i, j] or (p[i, k] and p[k, j]) end_for end_for end_for if (p[i, k] = 1) then for j = 1 to n do p[i, j] = p[i, j] or p[k, j] end_for end_if
Nelinearne strukture podataka
Grafovi
Određivanje dostižnosti
Algoritmi i strukture podataka
Warshall-ov algoritam Složenost: vremenska - O(n3) prostorna - O(n2) U neusmerenom grafu može lakše: naći povezane komponente prostorna - O(n2) p[i, j] = p[j, i] = 1 za sve parove i i j u istoj povezanoj komponenti p[i, j] = p[j, i] = 0 za sve parove i i j u različitim povezanim komponentama vremenska složenost - O(n2)
Nelinearne strukture podataka
Grafovi
Određivanje dostižnosti
Algoritmi i strukture podataka
Najkraća rastojanja G = (V, E) – usmereni težinski graf w(i, j) - težina grane od i do j w(p1k) = ∑ w(i, j) – dužina puta od 1 do k Najkraće rastojanje između čvorova i i j je: d(i, j) = min{w(p)} po svim putevima od i do j
∞ ako j nije dostižan iz i pij
p1i v1
vi
pjk vj
vk
p'ij Nelinearne strukture podataka
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Najkraća rastojanja Grane mogu imati i negativne težine Nisu dozvoljeni ciklusi sa negativnom težinom
-4 B
E
6
5
1
A
G D
12 1 C
Nelinearne strukture podataka
2
-9 3
Grafovi
F
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Floyd-ov algoritam Najkraća rastojanja i putevi između svih parova čvorova Ulaz – matrica težina W w[i, j] = 0 ako je i = j w[i, j] = w(i, j) ako je i ≠ j i (i, j) ∈ E w[i, j] = ∞
ako je i ≠ j i (i, j) ∉ E
Izlaz – matrica najkraćih rastojanja D i matrica prethodnika T Inicijalizacija matrice prethodnika T t[i, j] = 0 ako je i = j ili w[i, j] = ∞ t[i, j] = i ako je i ≠ j ili w[i, j] < ∞ Nelinearne strukture podataka
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Floyd-ov algoritam
k pik(k-1)
pkj(k-1)
i
j pij(k)
FLOYD(W) D=W for k = 1 to n do for i = 1 to n do for j = 1 to n do if (d[i, j] > d[i, k] + d[k, j]) then t[i, j] = t[k, j] d[i, j] = d[i, k] + d[k, j] end_if end_for end_for end_for
~ O(n3)
Princip relaksacije Nelinearne strukture podataka
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Floyd-ov algoritam Rekonstrukcija puta PATH(i, j) if (i = j) then PRINT(i) return else if (t[i, j] = 0) then PRINT(Nema puta između i i j) else PATH(i, t[i, j]) PRINT(j) end_if end_if
Nelinearne strukture podataka
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Floyd-ov algoritam 8
D(1) =
1
2
8
5
0
1
1
3
0
8
2
0
1
∞
2
0
0
3
0
0
8
5
0
1
1
3
0
8
2
0
1
5
2
0
2
3
0
0
7
5
0
3
1
3
0
8
2
0
1
5
2
0
2
3
0
T(1) =
3 5
2
D(2) = 3
D(0) =
0
0
8
5
3
0
∞
∞
2
0
T(0) =
Nelinearne strukture podataka
0
1
1
2
0
0
0
3
0
Grafovi
D(3) =
T(2) =
T(3) =
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Floyd-ov algoritam Primena – određivanje središta grafa ecc(v) = max {d[i, v] : i ∈ V } - ekscentričnost čvora min {ecc(v), v ∈ V } - središte Određivanje središta: naći matricu najkraćih rastojanja D naći maksimume kolona naći minimume od ovih maksimuma čvor koji odgovara minimumu - središte
Nelinearne strukture podataka
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Dijkstra-in algoritam Najkraća rastojanja i putevi između jednog čvora (1) i svih ostalih Ne dozvoljava negativne težine grana Ulaz – matrica težina grana W Izlaz – vektor najkraćih rastojanja D i vektor prethodnika T Inicijalizacija: vektora D sa prvom vrstom matrice W vektora T (t[i, j] = 1 ako je w[1, i] < ∞)
Nelinearne strukture podataka
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Dijkstra-in algoritam DIJKSTRA(W) S = {1} for i = 2 to n do d [i] = w [1, i] if (w [1, i] ≠ ∞) then t [i] = 1 for k = 1 to n - 1 do else find min {d [i] : i ∈ (V – S) } t [i] = 0 S = S + {i} end_if for each j ∈ (V – S) do end_for if (d [i] + w [i, j] < d [j]) then d [j] = d [i] + w [i, j] t [j] = i end_if end_for end_for
Nelinearne strukture podataka
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Dijkstra-in algoritam Rekonstrukcija puta od čvora 1 do i PATH(i) if (i = 1) then PRINT(1) return else if (t [i ] = 0) then PRINT(Nema puta do i ) else PATH(t [i ]) PRINT(i) end_if end_if
Nelinearne strukture podataka
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Dijkstra-in algoritam 1 10
100
2
30
5
10
50 3
60
d[i]
4 20
Nelinearne strukture podataka
2
3
t[i] 4
5
2
3 4
5
1
- 10 ∞ 30 100 1
0
1
1
1,2
2 10 60 30 100 1
2
1
1
1,2,4
4 10 50 30 90 1
4
1
4
1,2,4,3
3 10 50 30 60 1
4
1
3
1,2,4,3,5 5 10 50 30 60 1
4
1
3
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Dijkstra-in algoritam Dokaz korektnosti: korektnost postupka relaksacije korektnost određivanja najkraćeg rastojanja
S
pxj
x vj
x v1
S
v1
d[i] pix vi
Nelinearne strukture podataka
vi
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Dijkstra-in algoritam Vremenska složenost: za matricu susednosti - O(n2) za liste susednosti - O(e + n log n) Algoritam se može iskoristiti i za određivanje: najkraćih rastojanja između svih parova čvorova najkraćeg rastojanja između dva čvora Bellman-Ford algoritam – ako su dozvoljene i grane sa negativnom težinom
Nelinearne strukture podataka
Grafovi
Određivanje najkraćih rastojanja
Algoritmi i strukture podataka
Protok u grafovima Problem optimizacije protoka u distributivnom sistemu Protočni graf – težinski, usmereni graf: protok f(u, v) i kapacitet grane c(u, v) ≥ 0 izvor S i odredišteT neograničenog kapaciteta Ograničenje kapaciteta f(u, v) ≤ c(u, v) za sve (u, v) ∈ E Simetrija f(u, v) = -f(v, u) za sve (u, v) ∈ E Održanje protoka: ∑ f(u, v) = 0 za sve u ∈ V, osim za S i T ∑ f(S, v) = ∑ f(u, T) za S i T
Nelinearne strukture podataka
Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Maksimizacija protoka Određivanje najvećeg protoka od S do T koji protočni graf G = (V, E) može da propusti uz data ograničenja Polazi se od nultih početnih protoka grana Iterativno se traži put povećanog protoka
Nelinearne strukture podataka
Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Maksimizacija protoka B 2/0 S
B 5/0
7/0 5/0
2/0 T
S
3/0
5/5 7/5
5/5
T 3/0
A
A
a)
b) B 2/2 S
5/5 7/3
5/5
T 3/2
A c) Nelinearne strukture podataka
Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Maksimizacija protoka Rezidualni kapacitet grane cf(u, v) = c(u, v) - f(u, v) Rezidualni graf Gf = (V, Ef) Ef = { (u,v) : u, v ∈ V , cf(u, v) > 0 } U početku rezidualni graf isti kao protočni Rezidualni graf može da sadrži i grane kojih nema u protočnom (ef ≤ 2e) Traži se put povećanog protoka od S do T u Gf Rezidualni kapacitet puta cf(p) = min {cf(u, v) : (u,v) ∈ p }
Nelinearne strukture podataka
Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Maksimizacija protoka Rezidualni graf B
B
2 S
5 2
5
2 T
S
5 4
3
T 1
5
Nelinearne strukture podataka
3
5
2
A
A
a)
b)
Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Maksimizacija protoka FORD-FULKERSON (G) for each (u,v) ∈ E do f(u,v) = 0 f(v,u) = 0 end_for while exists p(S, T) in Gf do cf(p) = min {cf(u, v) : (u,v) ∈ p} for each (u, v) ∈ p do f(u, v) = f(u, v) + cf(p) f(v, u) = - f(u, v) end_for end_while
Nelinearne strukture podataka
Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Maksimizacija protoka B
12
16 S
B
D 20
10
D
S
B
10/0
T
7/7
12
D
1
4
20/19
16/12 T
7
12/12
12 S
19
10
T
7
2 13 a)
4 A
14
13/7
C
c)
4/0 A
14/7
C
4
3
11
C
A
e)
11
B
12/12
D 20/12
16/12 S
T
7/0
10/0
13/0 b)
B
4/0 A
14/0
C
Nelinearne strukture podataka
12/12
D 20/19
16/12 S
10/0
T
7/7
13/11 d)
B
4/4 A
14/11
Grafovi
C
12/12
D 20/19
16/14 10/2
S 13/9 f)
T
7/7 4/4
A
14/11
C
Protok u grafovima
Algoritmi i strukture podataka
Maksimizacija protoka Vremenska složenost zavisi od načina traženja puta povećanog protoka Ako se traži preko obilaskom po širini ili dubini, gornja granica O(efmax) B F/0 S
B F/F
F/0 1/0
F/0
T
S
F/0
F/F 1/0
F/F
T F/F
A
A
a)
b)
Edmonds-Karp-ov algoritam traži put od S do T sa najmanjim brojem grana po BFS - O(en2) Nelinearne strukture podataka
Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Maksimizacija protoka Generalizacija : više izvora S1, ..., Sm više odredišta T1, …, Tn “Superizvor” S i “superodredište” T c(S, Si) = ∞ i = 1, …, m c(Ti , T) = ∞ i = 1, …, n Primeni se Ford-Fulkerson-ov algoritam
Nelinearne strukture podataka
Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Uparivanje grafa Problemi uparivanja dva skupa “jedan na jedan” Bipartitni neusmereni graf G = (V, E): V = V1 + V2 (u, v) ∈ E ⇒ (u ∈ V1 ⇒ v ∈ V2) ⇒ (u ∈ V2 ⇒ v ∈ V1) Upareni skup grana – podskup grana M tako da je za svaki čvor grafa najviše jedna grana iz M incidentna na njemu Maksimalni upareni skup – upareni skup sa najviše grana
Nelinearne strukture podataka
Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Uparivanje grafa Određivanje maksimalnog uparenog skupa se svodi na maksimizaciju protoka Za bipartitni graf G = (V, E) definiše se protočni graf G' = (V', E‘ ) V' = V + {S} + {T} E' = {(S, u) : u ∈ V1 } + E + {(v, T) : v ∈ V2} c(u,v) = 1 za sve (u, v) ∈ E' Na G' se primeni Ford-Fulkerson-ov algoritam Grane (u, v) ∈ E po kojima teče protok ulaze u maksimalni upareni skup grana fmax = min (n1, n2) ~ O(n e)
Nelinearne strukture podataka
Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Uparivanje grafa A
1
A
1
1
1 B
2
1 B
2
S
T
C
3
C
3
D
4
D
4
a)
b)
A
1
A
1
B
2
B
2
S
T
T
C
3
C
3
D
4
D
4
c) Nelinearne strukture podataka
S
d) Grafovi
Protok u grafovima
Algoritmi i strukture podataka
Topološko sortiranje Modeliranje složenih projekata usmerenim acikličnim grafovima Usmereni aciklični graf G = (V, E): čvorovi - događaji grane - aktivnosti Topološki poredak – linearni poredak čvorova tako da se, za svaku granu (u, v) ∈ E , čvor u pojavljuje ispred čvora v
Nelinearne strukture podataka
Grafovi
Topološko sortiranje
Algoritmi i strukture podataka
Topološko sortiranje TOP-SORT(G) A=V B=E for i = 1 to n do find u ∈ A : din(u) = 0 T[i] = u A = A – {u} for all v, (u, v) ∈ B do B = B - {(u, v)} end_for end_for
Vremenska složenost: za matricu susednosti - O(n2) za liste susednosti - O(e + n ) Nelinearne strukture podataka
Grafovi
Topološko sortiranje
Algoritmi i strukture podataka
Topološko sortiranje C
E
A
C
C
E
F
B
D
A
E
E
F
F
B
A
D
D
A
B
a)
F
B
D
C
A
B
c)
b)
C
D d)
E F F
A
B
C
D
E
e)
Nelinearne strukture podataka
A
A
B
C
D
E
B
C
D
E
F
F g)
f)
Grafovi
Topološko sortiranje
Algoritmi i strukture podataka
Određivanje kritičnog puta Težina grane – trajanje aktivnosti Čvor – događaj uslovljen završetkom svih aktivnosti simuliranih ulaznim granama, pa mogu početi aktivnosti simulirane izlaznim granama Kritični put – put najveće dužine od početnog do završnog čvora Najranije vreme početka izlaznih aktivnosti EST[i] = max{EST[j] + w(j, i) : j ∈ P(i) } Najkasnije vreme početka izlaznih aktivnosti LST[i] = min{LST[j] - w(i, j) : j ∈ S(i) }
Nelinearne strukture podataka
Grafovi
Određivanje kritičnog puta
Algoritmi i strukture podataka
Određivanje kritičnog puta CRITICAL-PATH(G) TOP-SORT(G) for u = 1 to n do i = T[u] for each j ∈ P(i) do EST[i] = max{EST[j] + w(j, i) } end_for end_for LST[n] = EST[n] for u = n downto 1 do i = T[u] for each j ∈ S(i) do LST[i] = min{EST[j] - w(i, j) } end_for end_for for i = 1 to n do L[i] = LST[i] – EST[i] end_for
Nelinearne strukture podataka
Grafovi
~ O(e + n)
Određivanje kritičnog puta
Algoritmi i strukture podataka
Određivanje kritičnog puta a6=7
3
5
a2=3
a9=5 a5=6 a8=4
1
a1=5
a4=9
6
a7=8
2
a3=2
4
Aktivnost
l
a1
0
a2
1
a3
3
a4
0
a5
1
a6
4
a7
2
i
EST
LST
L
1
0
0
0
2
5
5
0
3
3
4
1
4
9
10
1
5
14
14
0
a8
1
6
19
19
0
a9
0
Nelinearne strukture podataka
Grafovi
Određivanje kritičnog puta