АСП1/Јун 2020 — разлика између измена
м (Čvor nije nivo) |
м (Dodate postavke sa K1 i 1. zadatak sa K3) |
||
| Ред 3: | Ред 3: | ||
=== 1. zadatak === | === 1. zadatak === | ||
==== Postavka ==== | ==== Postavka ==== | ||
Napisati pseudokod za duboko kopiranje liste na koju pokazuje pokazivač ''head'' ako pored informacionog sadržaja svaki član liste sadrži pokazivač na sledeći čvor i pokazivač na neki element liste. | |||
==== Rešenje ==== | ==== Rešenje ==== | ||
<u>DEEP COPY(''head'')</u> | |||
=== 2. zadatak === | === 2. zadatak === | ||
==== Postavka ==== | ==== Postavka ==== | ||
Prebaciti izraz iz postfiksne u infiksnu notaciju. | |||
==== Rešenje ==== | ==== Rešenje ==== | ||
<u>POST2IN(''expr'')</u> | |||
=== 3. zadatak === | === 3. zadatak === | ||
==== Postavka ==== | ==== Postavka ==== | ||
Nacrtati promenu stanja vektorske implementacije prioritetnog reda prilikom umetanja i brisanja elemenata. | |||
==== Rešenje ==== | ==== Rešenje ==== | ||
=== 4. zadatak === | === 4. zadatak === | ||
==== Postavka ==== | ==== Postavka ==== | ||
Izvesti adresnu funkciju za retku matricu gde se nenulti elementi nalaze u kvadratima dimenzija ''k'' smeštenim na glavnoj dijagonali. | |||
{| class="wikitable" | |||
|+ Primer matrice za <math>n = 7, k = 2</math> | |||
! - | |||
! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 | |||
|- | |||
! 1 | |||
| 1 || 2 || 0 || 0 || 0 || 0 || 0 | |||
|- | |||
! 2 | |||
| 3 || 4 || 5 || 0 || 0 || 0 || 0 | |||
|- | |||
! 3 | |||
| 0 || 6 || 7 || 8 || 0 || 0 || 0 | |||
|- | |||
! 4 | |||
| 0 || 0 || 9 || 10 || 11 || 0 || 0 | |||
|- | |||
! 5 | |||
| 0 || 0 || 0 || 12 || 13 || 14 || 0 | |||
|- | |||
! 6 | |||
| 0 || 0 || 0 || 0 || 15 || 16 || 17 | |||
|- | |||
! 7 | |||
| 0 || 0 || 0 || 0 || 0 || 18 || 19 | |||
|} | |||
==== Rešenje ==== | ==== Rešenje ==== | ||
| Ред 186: | Ред 224: | ||
=== 1. zadatak === | === 1. zadatak === | ||
==== Postavka ==== | ==== Postavka ==== | ||
Dat je acikličan graf predstavljen matricom susednosti čiji su čvorovi numerisani na nasumičan način. Napisati pseudokod koji vraća način renumeracije čvorova tako da matrica susednosti bude donja trougaona. | |||
==== Rešenje ==== | ==== Rešenje ==== | ||
<u>RESEQUENCE(''G'')</u> | |||
''topsort_length'' = 0 | |||
'''for''' ''i'' = 1 '''to''' ''n'' '''do''' | |||
''in_deg''[''i''] = 0 | |||
'''for''' ''j'' = 1 '''to''' ''n'' '''do''' | |||
'''if''' ''M''[''j'', ''i''] '''then''' | |||
''in_deg''[''i''] = ''in_deg''[''i''] + 1 | |||
'''end_if''' | |||
'''end_for''' | |||
'''if''' ''in_deg''[''i''] = 0 '''then''' | |||
''topsort_length'' = ''topsort_length'' + 1 | |||
''topsort''[''topsort_length''] = ''i'' | |||
'''end_if''' | |||
'''end_for''' | |||
'''for''' ''i'' = 1 '''to''' ''n'' '''do''' | |||
''node'' = ''topsort''[''i''] | |||
'''for''' ''j'' = 1 '''to''' ''n'' '''do''' | |||
'''if''' ''M''[''node'', ''j''] '''then''' | |||
''in_deg''[''j''] = ''in_deg''[''j''] - 1 | |||
'''if''' ''in_deg''[''j''] = 0 '''then''' | |||
''topsort_length'' = ''topsort_length'' + 1 | |||
''topsort''[''topsort_length''] = ''j'' | |||
'''end_if''' | |||
'''end_if''' | |||
'''end_for''' | |||
'''end_for''' | |||
'''return''' ''topsort'' | |||
=== 2. zadatak === | === 2. zadatak === | ||
Верзија на датум 10. јул 2020. у 01:49
Prvi kolokvijum
1. zadatak
Postavka
Napisati pseudokod za duboko kopiranje liste na koju pokazuje pokazivač head ako pored informacionog sadržaja svaki član liste sadrži pokazivač na sledeći čvor i pokazivač na neki element liste.
Rešenje
DEEP COPY(head)
2. zadatak
Postavka
Prebaciti izraz iz postfiksne u infiksnu notaciju.
Rešenje
POST2IN(expr)
3. zadatak
Postavka
Nacrtati promenu stanja vektorske implementacije prioritetnog reda prilikom umetanja i brisanja elemenata.
Rešenje
4. zadatak
Postavka
Izvesti adresnu funkciju za retku matricu gde se nenulti elementi nalaze u kvadratima dimenzija k smeštenim na glavnoj dijagonali.
| - | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 2 | 0 | 0 | 0 | 0 | 0 |
| 2 | 3 | 4 | 5 | 0 | 0 | 0 | 0 |
| 3 | 0 | 6 | 7 | 8 | 0 | 0 | 0 |
| 4 | 0 | 0 | 9 | 10 | 11 | 0 | 0 |
| 5 | 0 | 0 | 0 | 12 | 13 | 14 | 0 |
| 6 | 0 | 0 | 0 | 0 | 15 | 16 | 17 |
| 7 | 0 | 0 | 0 | 0 | 0 | 18 | 19 |
Rešenje
Drugi kolokvijum
1. zadatak
Postavka
- Da li se binarno stablo može jednoznačno rekonstruisati iz preorder i postorder obilaska tog stabla?
- Dati sve moguće rekonstrukcije stabla čiji je preorder obilazak (?) a postorder (?).
Rešenje
- Ne može, jer ako neki čvor ima samo jedno dete ne može se odrediti da li je to levo ili desno dete samo iz preorder i postorder obilaska tog stabla.
- (Bile su četiri moguće rekonstrukcije jer su dva čvora imala samo jedno dete.)
2. zadatak
Postavka
Morzeovi kodovi se sastoje iz tački (.) i crta (-) i svako slovo alfabeta se kodira sekvencom tački i crta. Ako se zna da jedan kod može preklapati sa početkom nekog drugog koda, osmisliti strukturu koja bi mogla da se koristi za dekodiranje Morzeovih kodova i napisati pseudokod za dekodiranje poruke kodirane Morzeovim kodovima ako se zna da se između slova nalazi blanko znak.
Rešenje
Struktura pogodna za dekodiranje Morzeovih kodova jeste binarno stablo gde grane ulevo označavaju da kod na tom mestu sadrži tačku a grane udesno da kod na tom mestu sadrži crtu i u svakom čvoru se čuva u koje slovo se dekodira kod čije su grane praćene da bi se stiglo do tog čvora, ili 0 ako se taj kod ne dekodira ni u jedno slovo.
DECODE MORSE(msg, root)
i = 0
new_msg = ""
while msg[i] ≠ 0 do
p = root
while (msg[i] ≠ ' ') and (p ≠ nil) do
if msg[i] = '.' then
p = left(p)
else if msg[i] = '-' then
p = right(p)
else
ERROR(Invalid code)
end_if
i = i + 1
end_while
i = i + 1
if (p = nil) or (sign(p) = 0) then
ERROR(Invalid code)
end_while
new_msg = new_msg + sign(p)
end_while
return new_msg
3. zadatak
Postavka
Kodirati sekvencu BIBBIDIBOBBIDIBOO po koracima.
Rešenje
Krajnje kodirano: 0204153628033
| Slovo | Kod |
|---|---|
| B | 0 |
| D | 1 |
| I | 2 |
| O | 3 |
| BI | 4 |
| IB | 5 |
| BB | 6 |
| BID | 7 |
| DI | 8 |
| IBO | 9 |
| OB | 10 |
| BBI | 11 |
| ID | 12 |
| DIB | 13 |
| BO | 14 |
| OO | 15 |
| Unos | String | Ispis | Dodaje se u tabelu |
|---|---|---|---|
| B | B | ||
| I | BI | 0 (B) | BI |
| B | IB | 2 (I) | IB |
| B | BB | 0 (B) | BB |
| I | BI | ||
| D | BID | 4 (BI) | BID |
| I | DI | 1 (D) | DI |
| B | IB | ||
| O | IBO | 5 (IB) | IBO |
| B | OB | 3 (O) | OB |
| B | BB | ||
| I | BBI | 6 (BB) | BBI |
| D | ID | 2 (I) | ID |
| I | DI | ||
| B | DIB | 8 (DI) | DIB |
| O | BO | 0 (B) | BO |
| O | OO | 3 (O) | OO |
| O | 3 (O) |
4. zadatak
Postavka
- Definisati internu dužinu puta, eksternu dužinu puta i eksternu težinsku dužinu puta.
- Napisati algoritam koji za dato stablo računa eksternu težinsku dužinu puta. Smatrati da listovi stabla sadrže informacije o težini. Dozvoljeno je korišćenje linearnih struktura podataka.
Rešenje
- Interna dužina puta je zbir dužina puteva od korena do svakog internog čvora.
- Eksterna dužina puta je zbir dužina puteva od korena do svakog eksternog čvora.
- Eksterna težinska dužina puta je zbir proizvoda dužina puteva od korena do svakog eksternog čvora i težine tih eksternih čvorova.
Za potrebe ovog algoritma smatra se da su eksterni čvorovi izjednačeni sa listovima.
EXTERNAL WEIGHTED PATH LENGTH(root)
QUEUE_INIT(Q_nodes)
QUEUE_INIT(Q_levels)
INSERT(Q_nodes, root)
INSERT(Q_levels, 0)
node = nil
level = 0
pwe = 0
while not QUEUE_EMPTY(Q_nodes) do
node = DELETE(Q_nodes)
level = DELETE(Q_levels)
if (left(node) = nil) and (right(node) = nil) then
pwe = pwe + level * weight(node)
end_if
if left(node) ≠ nil then
INSERT(Q_nodes, left(node))
INSERT(Q_levels, level + 1)
end_if
if right(node) ≠ nil then
INSERT(Q_nodes, right(node))
INSERT(Q_levels, level + 1)
end_if
end_while
return pwe
Treći kolokvijum
1. zadatak
Postavka
Dat je acikličan graf predstavljen matricom susednosti čiji su čvorovi numerisani na nasumičan način. Napisati pseudokod koji vraća način renumeracije čvorova tako da matrica susednosti bude donja trougaona.
Rešenje
RESEQUENCE(G)
topsort_length = 0
for i = 1 to n do
in_deg[i] = 0
for j = 1 to n do
if M[j, i] then
in_deg[i] = in_deg[i] + 1
end_if
end_for
if in_deg[i] = 0 then
topsort_length = topsort_length + 1
topsort[topsort_length] = i
end_if
end_for
for i = 1 to n do
node = topsort[i]
for j = 1 to n do
if M[node, j] then
in_deg[j] = in_deg[j] - 1
if in_deg[j] = 0 then
topsort_length = topsort_length + 1
topsort[topsort_length] = j
end_if
end_if
end_for
end_for
return topsort
2. zadatak
Postavka
- (?)
- Napisati postupak za Flojdov algoritam na datom grafu. (?)
- Napisati najkraći put od čvora b do čvora d.
Rešenje
- (?)
- (?)
- bfaced
3. zadatak
Postavka
Dat je protočni graf na slici (?). Nacrtati rezidualni graf od tog protočnog grafa i navesti sve puteve povećanog protoka i napisati njihov protok.
Rešenje
- SCBT (2)
- SACBT (2)
- SDECBT (2)
- SDACBT (2)
4. zadatak
Postavka
Opisati na koji način se u neusmerenom grafu može detektovati ciklus pomoću obilaska po širini i dubini i napisati iterativni algoritam za detekciju ciklusa u neusmerenom grafu pomoću obilaska po širini. Dozvoljeno je koristiti linearne strukture podataka.
Rešenje
Obilaskom po širini ili dubini se u neusmerenom grafu može detektovati ciklus tako što prilikom obilaska detektujemo da posećujemo čvor koji smo već posetili, a da to nije otac trenutnog čvora u stablu obilaska.
IS CYCLIC(G)
for i = 1 to n do
visited[i] = 0
end_for
QUEUE_INIT(Q_nodes)
QUEUE_INIT(Q_parents)
INSERT(Q_nodes, 1)
INSERT(Q_parents, 0)
node = parent = 0
while not QUEUE_EMPTY(Q_nodes) do
node = DELETE(Q_nodes)
parent = DELETE(Q_parents)
for (node, i) ∈ E do
if i = parent then
continue
end_if
if visited[i] then
return true
end_if
INSERT(Q_nodes, i)
INSERT(Q_parents, node)
visited[i] = true
end_for
end_while
return false