АСП1/К3 2019 — разлика између измена
м (Kategorizacija) |
м (Prebacivanje na jednostavno isticanje sintakse) ознака: visualeditor-wikitext |
||
Ред 67: | Ред 67: | ||
#* <code>ADD G, F, H</code> | #* <code>ADD G, F, H</code> | ||
</div> | </div> | ||
<syntaxhighlight lang="milo"> | |||
TOP SORT ALL PATHS R(G) | |||
if V = {} then | |||
return nil | |||
end_if | |||
return_paths = {} | |||
for {n : (n ∈ V) and ((u, n) ∉ E)} do | |||
MARK_REMOVED(G, n) | |||
paths = TOP_SORT_ALL_PATHS_R(G) | |||
for path ∈ paths do | |||
new_path = GETNODE | |||
value(new_path) = n | |||
next(new_path) = path | |||
path = new_path | |||
end_for | |||
UNMARK_REMOVED(G, n) | |||
return_paths = return_paths + paths | |||
end_for | |||
return return_paths | |||
</syntaxhighlight> | |||
== 4. zadatak == | == 4. zadatak == | ||
Ред 92: | Ред 94: | ||
=== Rešenje === | === Rešenje === | ||
Implementacija ispod čvorove vraća u ulančanoj listi. | Implementacija ispod čvorove vraća u ulančanoj listi. | ||
<syntaxhighlight lang="milo"> | |||
K-DISTANCE(G, n, k, id) | |||
dist[n] | |||
for i = 1 to n do | |||
dist[i] = ∞ | |||
end_for | |||
dist[id] = 0 | |||
curr_dist = 0 | |||
tail = head = GETNODE(id) | |||
next(head) = GETNODE(0) | |||
head = next(head) | |||
curr = 0 | |||
temp = nil | |||
while (tail ≠ nil) and (curr_dist ≠ k) do | |||
curr = value(tail) | |||
if curr = 0 then | |||
curr_dist = curr_dist + 1 | |||
if head ≠ tail then | |||
next(head) = GETNODE(0) | |||
head = next(head) | |||
end_if | |||
else | |||
for node ∈ {v : (curr, v) ∈ E} do | |||
if dist[node] ≠ curr_dist + 1 then | |||
dist[node] = curr_dist + 1 | |||
next(head) = GETNODE(node) | |||
head = next(head) | |||
end_if | |||
end_for | |||
end_if | |||
temp = tail | |||
tail = next(tail) | |||
FREENODE(temp) | |||
end_while | |||
return tail | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="milo"> | |||
GETNODE(node) | |||
ALLOCATE(node) | |||
next(node) = nil | |||
value(node) = value | |||
return node | |||
</syntaxhighlight> | |||
== 5. zadatak == | == 5. zadatak == | ||
Ред 177: | Ред 182: | ||
# U pseudokodu ispod podrazumeva se da je put predstavljen ulančanom listom. Ukoliko je vraćeno nil to znači da nema puta. | # U pseudokodu ispod podrazumeva se da je put predstavljen ulančanom listom. Ukoliko je vraćeno nil to znači da nema puta. | ||
</div> | </div> | ||
<syntaxhighlight lang="milo"> | |||
PATH(T, A, B, C) | |||
curr = GETNODE(C) | |||
next = nil | |||
while value(curr) ≠ B do | |||
if T[B][value(curr)] = 0 then | |||
return nil | |||
end_if | |||
next = GETNODE(T[B][value(curr)]) | |||
next(next) = curr | |||
curr = next | |||
end_while | |||
while value(curr) ≠ A do | |||
if T[A][value(curr)] = 0 then | |||
return nil | |||
end_if | |||
next = GETNODE(T[A][value(curr)]) | |||
next(next) = curr | |||
curr = next | |||
end_while | |||
return curr | |||
</syntaxhighlight> | |||
== 6. zadatak == | == 6. zadatak == | ||
Ред 293: | Ред 300: | ||
=== Rešenje === | === Rešenje === | ||
Složenost Dajkstrinog algoritma zavisi od operacija pronalaženja sledećeg čvora do kojeg je put najkraći i ažuriranja matrice D sa dodavanjem novog čvora u skup S. Može biti <math>\mathcal{O(n^2)}</math> u slučaju da se pronalaženje sledećeg čvora do kojeg je put najkraći izvršava u <math>\mathcal{O(n)}</math> i da je graf predstavljen matricom susednosti. Bolja složenost dostiže se onda kada je graf predstavljen listom susednosti i operacija pronalaženja sledećeg čvora sa najkraćim putem ima složenost od <math>\mathcal{O(\log{n})}</math>, kada je složenost <math>\mathcal{O(e + n\log{n})}</math>. | Složenost Dajkstrinog algoritma zavisi od operacija pronalaženja sledećeg čvora do kojeg je put najkraći i ažuriranja matrice D sa dodavanjem novog čvora u skup S. Može biti <math>\mathcal{O(n^2)}</math> u slučaju da se pronalaženje sledećeg čvora do kojeg je put najkraći izvršava u <math>\mathcal{O(n)}</math> i da je graf predstavljen matricom susednosti. Bolja složenost dostiže se onda kada je graf predstavljen listom susednosti i operacija pronalaženja sledećeg čvora sa najkraćim putem ima složenost od <math>\mathcal{O(\log{n})}</math>, kada je složenost <math>\mathcal{O(e + n\log{n})}</math>. | ||
<syntaxhighlight lang="milo"> | |||
DIJKSTRA ADJ LIST(G, x, y) | |||
S = {x} | |||
for i = 1 to n do | |||
d[i] = w[x, i] | |||
if d[i] = ∞ then | |||
t[i] = 0 | |||
else | |||
t[i] = x | |||
end_if | |||
end_for | |||
for k = 1 to n-1 do | |||
start_node = -1 | |||
for i ∈ (V - S) do | |||
if (start_node = -1) or (d[i] < d[start_node]) then | |||
start_node = i | |||
end_if | |||
end_for | |||
S = S + {start_node} | |||
adj_node = AL[start_node] | |||
while adj_node ≠ nil do | |||
if w[start_node, value(adj_node)] + d[start_node] < d[value(adj_node)] then | |||
d[value(adj_node)] = w[start_node, value(adj_node)] + d[start_node] | |||
t[value(adj_node)] = start_node | |||
end_if | |||
adj_node = next(adj_node) | |||
end_while | |||
end_for | |||
return d[y] | |||
</syntaxhighlight> | |||
[[Категорија:Рокови]] | [[Категорија:Рокови]] | ||
[[Категорија:АСП1]] | [[Категорија:АСП1]] |
Верзија на датум 28. август 2020. у 01:39
1. zadatak
Postavka
Na slici je prikazan netežinski usmereni graf.
- Prikazati redosled čvorova nakon obilaska grafa sa slike po širini, ukoliko se kao početni čvor zada čvor A. Čvorovi se ubacuju u strukturu prema leksikografskom poretku ukoliko postoji više mogućnosti.
- Prikazati redosled čvorova nakon iterativnog obilaska grafa sa slike po dubini, ukoliko se kao početni čvor zada čvor A. Čvorovi se ubacuju u strukturu prema leksikografskom poretku ukoliko postoji više mogućnosti.
Rešenje
- ABICDMFLK
- AIBCMLKDF
2. zadatak
Postavka
U nekom malom mestu se renovira mreža ulica. Sve ulice u mestu su dvosmerne. Da bi se renoviralo što više ulica, potrebno je obezbediti da između svaka dva važna objekta u mestu (škola, bolnica, opština, itd.) postoji put i da ukupna dužina svih otvorenih puteva za saobraćaj u mestu bude minimalna. Ukoliko je mreža ulica i važnih objekata predstavljena neusmerenim težinskim grafom sa slike, navesti koji algoritam bi se mogao iskoristiti za rešavanje ovog problema i njegovom primenom odrediti ulice koje treba da ostanu otvorene za saobraćaj tokom renoviranja, prema navedenim uslovima. Prikazati postupak.
Rešenje
Mogao bi se primeniti Primov ili Kruškalov algoritam za dobijanje minimlanog obuhvatnog stabla. U narednom postupku biće korišćen Primov algoritam:
- A-E
- E-F
- E-D
- D-C
- C-H
- H-I
- C-B
- H-G
- G-I
Grafovi se nalaze ispod.
- ASP1 K3 2019 zadatak 2 graf.png
Pojednostavljen graf iz postavke zadatka.
- ASP1 K3 2019 zadatak 2 MST.png
Minimalno obuhvatno stablo.
3. zadatak
Postavka
Neka se posmatra sekvencijalni programski kod koji se izvršavana na nekoj 3A mašini. Prvi operand instrukcije je odredišni, a preostala dva su izvorišni operandi. Prilikom prevođenja, prevodilac može da preuredi redosled izvršavanja instrukcija da bi izvršio određene optimizacije. Međutim, preuređivanje redosleda dve instrukcije se može izvršiti samo ukoliko ne postoji zavisnosti po podacima između njih. Zavisnost po podacima između instrukcija postoji ukoliko se odredišni operand (rezultat) ranije operacije koristi kao izvorišni operand kasnije operacije.
- Opisati model grafa koji se može iskoristiti za modelovanje zavisnosti po podacima između instrukcija.
- Objasniti koji algoritam bi se mogao iskoristiti za pronalaženje svih mogućih redosleda izvršavanja instrukcija na osnovu zadatog grafa zavisnosti po podacima.
- Na primeru zadatog programskog koda, nacrtati graf zavisnosti po podacima i odrediti (napisati) još jedan moguć redosled izvršavanja instrukcija koji zadovoljava prisutne zavisnosti po podacima.
ADD A, B, C MUL C, E, D SUB B, E, C ADD A, D, E SUB E, F, G DIV D, F, H ADD G, F, H
Rešenje
- U pitanju je acikličan netežinski usmeren graf u kom čvorovi predstavljaju instrukcije a grane od jednog ka drugom čvoru predstavljaju zavisnost izvorišnih operanada drugog čvora od odredišnog operanda prvog.
- Može se iskoristiti modifikacija topološkog sortiranja gde se nakon svakog prikupljanja čvorova sa ulaznim stepenom 0 za svaki od njih pokušavaju naći svi putevi koji na tom mestu sadrže taj čvor. Rekurzivna implementacija ovog algoritma je data ispod (gde su putevi predstavljeni ulančanim listama).
- Graf se sastoji od svih čvorova odvojenih i jedne grane između čvorova
MUL C, E, D
iSUB B, E, C
.ADD A, B, C
ADD A, D, E
MUL C, E, D
SUB B, E, C
SUB E, F, G
DIV D, F, H
ADD G, F, H
TOP SORT ALL PATHS R(G)
if V = {} then
return nil
end_if
return_paths = {}
for {n : (n ∈ V) and ((u, n) ∉ E)} do
MARK_REMOVED(G, n)
paths = TOP_SORT_ALL_PATHS_R(G)
for path ∈ paths do
new_path = GETNODE
value(new_path) = n
next(new_path) = path
path = new_path
end_for
UNMARK_REMOVED(G, n)
return_paths = return_paths + paths
end_for
return return_paths
4. zadatak
Postavka
Posmatra se usmeren netežinski graf. Napisati iterativnu funkciju u pseudokodu koja za prosleđeni graf sa datim brojem čvorova n pronalazi sve čvorove koji su putevima dužine tačno k udaljeni od zadatog početnog čvora id.
Rešenje
Implementacija ispod čvorove vraća u ulančanoj listi.
K-DISTANCE(G, n, k, id)
dist[n]
for i = 1 to n do
dist[i] = ∞
end_for
dist[id] = 0
curr_dist = 0
tail = head = GETNODE(id)
next(head) = GETNODE(0)
head = next(head)
curr = 0
temp = nil
while (tail ≠ nil) and (curr_dist ≠ k) do
curr = value(tail)
if curr = 0 then
curr_dist = curr_dist + 1
if head ≠ tail then
next(head) = GETNODE(0)
head = next(head)
end_if
else
for node ∈ {v : (curr, v) ∈ E} do
if dist[node] ≠ curr_dist + 1 then
dist[node] = curr_dist + 1
next(head) = GETNODE(node)
head = next(head)
end_if
end_for
end_if
temp = tail
tail = next(tail)
FREENODE(temp)
end_while
return tail
GETNODE(node)
ALLOCATE(node)
next(node) = nil
value(node) = value
return node
5. zadatak
Postavka
Floyd algoritam
- Na slici je dat izgled matrica D i T dobijenih kao izlaz Floyd algoritma. Nacrtati mogući izgled ulaznog grafa i obrazložiti odgovor.
- Napisati u pseudokodu funkciju koja na osnovu matrice T dobijene kao izlaz Floyd-ovog algoritma rekonstruiše najkraći put od čvora A do čvora C takav da se na njemu nalazi čvor B.
0 | 2 | 7 |
∞ | 0 | 5 |
∞ | ∞ | 0 |
0 | 1 | 2 |
0 | 0 | 2 |
0 | 0 | 0 |
Rešenje
- Pretpostavljajući da nema grana negativne težine vidimo da je najkraći put dužine 2 i zato sigurno mora biti direktna grana između A i B. Pošto vidimo da matrica D nije simetrična pretpostavljamo da se radi o usmerenom težinskom grafu. Na osnovu trenutnog grafa i D matrice vidimo da je grana B-C težine 5, i sve ostalo se slaže.
- U pseudokodu ispod podrazumeva se da je put predstavljen ulančanom listom. Ukoliko je vraćeno nil to znači da nema puta.
PATH(T, A, B, C)
curr = GETNODE(C)
next = nil
while value(curr) ≠ B do
if T[B][value(curr)] = 0 then
return nil
end_if
next = GETNODE(T[B][value(curr)])
next(next) = curr
curr = next
end_while
while value(curr) ≠ A do
if T[A][value(curr)] = 0 then
return nil
end_if
next = GETNODE(T[A][value(curr)])
next(next) = curr
curr = next
end_while
return curr
6. zadatak
Postavka
Za graf sa slike odrediti topološki poredak, a zatim naći kritični put i dozvoljena kašnjenja za pojedinačne čvorove.
Rešenje
- Topološki poredak: ABDCFEHGIJK
- Kritični put: ABCEHGJK (ili ABCEHGIJK)
- Tabela:
Čvor | EST | LST | L |
A | 0 | 0 | 0 |
B | 1 | 1 | 0 |
C | 10 | 0 | |
D | 3 | 6 | 3 |
E | 15 | 15 | 0 |
F | 13 | 2 | |
G | 19 | 19 | 0 |
H | 16 | 16 | 0 |
I | 21 | 21 | 0 |
J | 22 | 22 | 0 |
K | 24 | 24 | 0 |
7. zadatak
Postavka
Koja su dva karakteristična načina za izbor puta povećanog protoka u protočnom grafu? Na primeru protočnog grafa sa slike u okviru koga postoji već uspostavljen protok po pojedinim granama, nacrtati rezidualni graf i navesti dva karakteristična puta koji ilustruju navedene situacije.
Rešenje
Dva karakteristična načina za izbor puta povećanog protoka su:
- običan BFS koji će naći najkraći put od S do T, na primer SBT, i
- biranje puta koji najviše povećava protok, na primer SBAT.
Grafovi su dati ispod.
- ASP1 K3 2019 zadatak 7 graf.png
Graf iz postavke zadatka.
- ASP1 K3 2019 zadatak 7 rezidualni graf.png
Rezidualni graf.
8. zadatak
Postavka
Dijkstra-in algoritam
- Kolika je složenost Dijkstra-inog algoritma i od kojih operacija u okviru algoritma to zavisi? Objasniti.
- Napisati pseudokod Dijkstra-inog algoritma koji pronalazi najkraće rastojanje između para čvorova x i y pod pretpostavkom da se graf G predstavlja listama susednosti. Specijalizovati apstraktne operacije gde je to moguće.
Rešenje
Složenost Dajkstrinog algoritma zavisi od operacija pronalaženja sledećeg čvora do kojeg je put najkraći i ažuriranja matrice D sa dodavanjem novog čvora u skup S. Može biti u slučaju da se pronalaženje sledećeg čvora do kojeg je put najkraći izvršava u i da je graf predstavljen matricom susednosti. Bolja složenost dostiže se onda kada je graf predstavljen listom susednosti i operacija pronalaženja sledećeg čvora sa najkraćim putem ima složenost od , kada je složenost .
DIJKSTRA ADJ LIST(G, x, y)
S = {x}
for i = 1 to n do
d[i] = w[x, i]
if d[i] = ∞ then
t[i] = 0
else
t[i] = x
end_if
end_for
for k = 1 to n-1 do
start_node = -1
for i ∈ (V - S) do
if (start_node = -1) or (d[i] < d[start_node]) then
start_node = i
end_if
end_for
S = S + {start_node}
adj_node = AL[start_node]
while adj_node ≠ nil do
if w[start_node, value(adj_node)] + d[start_node] < d[value(adj_node)] then
d[value(adj_node)] = w[start_node, value(adj_node)] + d[start_node]
t[value(adj_node)] = start_node
end_if
adj_node = next(adj_node)
end_while
end_for
return d[y]