АСП1/Јун 2020 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (Dodato krajnje kodirano rešenje)
м (Замена начина истицања милокода.)
 
(Није приказано 9 међуизмена другог корисника)
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_jun_2020.pdf Zadaci]
== Prvi kolokvijum ==
== Prvi kolokvijum ==
=== 1. zadatak ===
=== 1. zadatak ===
==== Postavka ====
==== Postavka ====
Data je ulančana lista kod koje svaki element ima određeni informacioni sadržaj, pokazivač na sledeći element u listi, kao i pokazivač na neki proizvoljan element liste. Napisati u pseudokodu funkciju DEEP_COPY koja prihvata pokazivač na prvi element liste i pravi kopiju liste sa istim načinom i poretkom povezivanja kao u polaznoj listi (duboka kopija).
==== Rešenje ====
==== Rešenje ====
{{Милокод|<nowiki>
DEEP COPY(head)
p = head
q = r = new_node = nil
new_head = new_tail = nil
while p ≠ nil do
    new_node = GETNODE
    value(new_node) = value(p)
    other_p(new_node) = other_p(p)
    if new_head = nil then
        new_head = new_node
    else
        next(new_tail) = new_node
    end_if
    new_tail = new_node
    p = next(p)
end_while
p = head
q = new_head
while p ≠ nil do
    r = new_head
    while r ≠ nil do
        if other_p(r) = p then
            other_p(r) = q
        end_if
        r = next(r)
    end_while
    p = next(p)
    q = next(q)
end_while
return new_head
</nowiki>}}
=== 2. zadatak ===
=== 2. zadatak ===
==== Postavka ====
==== Postavka ====
Neka je datoj funkciji POST_TO_INF prosleđen neki aritmetički izraz u postfiksnom obliku (''expression''). Operandi su velika slova engleskog alfabeta. Napisati iterativnu implementaciju ove funkcije koja kao rezultat vraća dati aritmetički izraz transformisan u infiksnu formu. Rezultujući izraz formirati korišćenjem potpunih zagrada.
==== Rešenje ====
==== Rešenje ====
{{Милокод|<nowiki>
POST TO INF(expression)
stack = nil
expr1 = expr2 = nil
for c in expression do
    if IS_BINARY_OPERATOR(c) then
        expr1 = POP(stack)
        expr2 = POP(stack)
        PUSH(stack, "(" + expr1 + c + expr2 + ")")
    else if IS_UNARY_OPERATOR(c) then
        expr1 = POP(stack)
        PUSH(stack, "(" + c + expr1 + ")")
    else
        PUSH(stack, c)
    end_if
end_for
return POP(stack)
</nowiki>}}
{{Милокод|<nowiki>
PUSH(stack, value)
node = GETNODE
value(node) = value
next(node) = stack
stack = node
</nowiki>}}
{{Милокод|<nowiki>
POP(stack, value)
if stack = nil then
    ERROR(Underflow)
else
    node = stack
    value = value(node)
    stack = next(stack)
    FREENODE(node)
    return value
end_if
</nowiki>}}
=== 3. zadatak ===
=== 3. zadatak ===
==== Postavka ====
==== Postavka ====
Vektorska implementacija prioritetnog reda
U prioritetni red se prvo redom ubacuju sledeći elementi 2, 18, 19, 1, 9, 6. Nakon toga se iz reda uklanjaju dva elementa i potom dodaju elementi 15, 17 i 11, redom. Kapacitet vektora u koji se smeštaju elementi je 7. Manji broj označava veći prioritet. Za svaki od datih načina implementacije prikazati izgled reda nakon inicijalnog umetanja, nakon svakog brisanja i svakog umetanja poslednja tri elementa (15, 17 i 11). Ukoliko implementacija koristi neke dodatne pokazivače, naznačiti ih ispod odgovarajućeg indeksa u vektoru.
<div class="abc-list">
# Implementacija održavanjem uređenosti reda
# Implementacija markiranjem elemenata, bez umetanja preko markiranog elementa
# Implementacija markiranjem elemenata, sa umetanjem preko markiranog elementa
</div>
==== Rešenje ====
==== Rešenje ====
<div style="display: flex; justify-content: space-between;">
{| class="wikitable"
|+ Implementacija održavanjem uređenosti reda
| 1 || 2 || 6 || 9 || 18 || 19 ||
|-
| colspan="7" |
|-
| 2 || 6 || 9 || 18 || 19 ||  ||
|-
| colspan="7" |
|-
| 6 || 9 || 18 || 19 ||  ||  ||
|-
| colspan="7" |
|-
| 6 || 9 || 15 || 18 || 19 ||  ||
|-
| colspan="7" |
|-
| 6 || 9 || 15 || 17 || 18 || 19 ||
|-
| colspan="7" |
|-
| 6 || 9 || 11 || 15 || 17 || 18 || 19
|}
{| class="wikitable"
|+ Implementacija markiranjem elemenata, bez umetanja preko markiranog elementa
| 2 || 18 || 19 || 1 || 9 || 6 ||
|-
| colspan="7" |
|-
| 2 || 18 || 19 || X || 9 || 6 ||
|-
| colspan="7" |
|-
| X || 18 || 19 || X || 9 || 6 ||
|-
| colspan="7" |
|-
| X || 18 || 19 || X || 9 || 6 || 15
|-
| colspan="7" |
|-
| 18 || 19 || 9 || 6 || 15 || 17 ||
|-
| colspan="7" |
|-
| 18 || 19 || 9 || 6 || 15 || 17 || 11
|}
{| class="wikitable"
|+ Implementacija markiranjem elemenata, sa umetanjem preko markiranog elementa
| 2 || 18 || 19 || 1 || 9 || 6 ||
|-
| colspan="7" |
|-
| 2 || 18 || 19 || X || 9 || 6 ||
|-
| colspan="7" |
|-
| X || 18 || 19 || X || 9 || 6 ||
|-
| colspan="7" |
|-
| 15 || 18 || 19 || X || 9 || 6 ||
|-
| colspan="7" |
|-
| 15 || 18 || 19 || 17 || 9 || 6 ||
|-
| colspan="7" |
|-
| 15 || 18 || 19 || 17 || 9 || 6 || 11
|}
</div>
=== 4. zadatak ===
=== 4. zadatak ===
==== Postavka ====
==== Postavka ====
Neka se blok-dijagonalna matrica definiše kao kvadratna matrica ''A'' dimenzija ''n x n'' čiji su nenulti elementi smešteni samo u okviru blokova dimenzije ''k x k'' koji se nalaze na glavnoj dijagonali matrice, kao na slici i važi uslov ''n mod k = 0''. Ukratko objasniti postupak smeštanja i izvesti adresnu funkciju pri pristupu proizvoljnom elementu matrice ''A[1:n, 1:n]'' smeštene '''po vrstama'''. Smatrati da se jedan element matrice smešta u tačno jednu memorijsku reč.
{| class="wikitable"
|+ Primer matrice za <math>n = 6, k = 2</math>
! -
! 1 !! 2 !! 3 !! 4 !! 5 !! 6
|-
! 1
| X || X ||  ||  ||  ||
|-
! 2
| X || X ||  ||  ||  ||
|-
! 3
|  ||  || X || X ||  ||
|-
! 4
|  ||  || X || X ||  ||
|-
! 5
|  ||  ||  ||  || X || X
|-
! 6
|  ||  ||  ||  || X || X
|}
==== Rešenje ====
==== Rešenje ====
# Prvo gledamo u kojem se "bloku" na dijagonali nalazi element koji biramo. Taj blok možemo naći kao <math>i_b = \left\lfloor\frac{j-1}{k}\right\rfloor</math>.
# Nakon toga, možemo na osnovu indeksa bloka (koji kreće od 0) možemo naći <math>i</math> i <math>j</math> indekse za gornji levi ćošak tog bloka kao <math>i_{blok} = j_{blok} = i_b \cdot k + 1</math>.
# Sada računamo indeks trenutnog elementa na osnovu tri podatka: koliko se elemenata nalazi u prethodnim blokovima, koliko se elemenata nalazi iznad trenutnog elementa u trenutnom bloku i koliko se elemenata nalazi levo od trenutnog elementa u trenutnom bloku.
## '''Prethodni blokovi:''' <math>A_{pret} = i_b \cdot k^2</math> (u svakom bloku se nalazi po <math>k^2</math> elemenata)
## '''Iznad:''' <math>A_{izn} = (i - i_{blok}) k</math> (u svakom redu nalazi se <math>k</math> elemenata)
## '''Levo:''' <math>A_{lev} = j - j_{blok}</math>
# '''Konačna adresna funkcija:''' <math>A = A_{11} + (A_{pret} + A_{izn} + A_{lev}) S = A_{11} + (i_b \cdot k^2 + (i - i_{blok}) k + j - j_{blok}) S =</math>
#: <math>= A_{11} + \left(\left\lfloor\frac{j-1}{k}\right\rfloor \cdot k^2 + \left(i - \left\lfloor\frac{j-1}{k}\right\rfloor \cdot k - 1\right) k + j - \left\lfloor\frac{j-1}{k}\right\rfloor \cdot k - 1\right) S</math>
# '''Uslov:''' <math>|i - j| < k</math>


== Drugi kolokvijum ==
== Drugi kolokvijum ==
=== 1. zadatak ===
=== 1. zadatak ===
==== Postavka ====
==== Postavka ====
''Postorder'' i ''preorder'' obilazak
<div class="abc-list">
<div class="abc-list">
# Da li se binarno stablo može jednoznačno rekonstruisati iz ''preorder'' i ''postorder'' obilaska tog stabla?
# Da li je, pomoću datog ''preorder'' i ''postorder'' obilaska binarnog stabla moguće rekonstruisati jedinstveno binarno stablo? Detaljno obrazložiti odgovor.
# Dati sve moguće rekonstrukcije stabla čiji je ''preorder'' obilazak '''(?)''' a ''postorder'' '''(?)'''.
# Ukoliko je ''preorder'' obilazak stabla '''VALDENJOM''', a ''postorder'' obilazak stabla '''DLEAOMJNV''', rekonstruisati stablo. Ukoliko postoji više mogućih stabala, dati izgled svakog od njih.
</div>
</div>


Ред 25: Ред 221:
<div class="abc-list">
<div class="abc-list">
# 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.
# 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.)''
# Moguće su četiri rekonstrukcije, jer se ne zna da li je čvor D levo ili desno dete čvora L i takođe da li je čvor J levo ili desno dete čvora N.
</div>
</div>
        V            V              V                V
      /    \      /    \        /    \          /    \
    A      N    A      N      A      N        A      N
    / \    /    / \    /      / \      \      / \      \
  L  E  J    L  E  J      L  E      J    L  E      J
  /      / \    \    / \    /          / \    \        / \
D      O  M    D  O  M  D          O  M    D      O  M


=== 2. zadatak ===
=== 2. zadatak ===
==== Postavka ====
==== Postavka ====
Morzeovi kodovi se sastoje iz tački (<code>.</code>) i crta (<code>-</code>) 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.
Slova Morzeove azbuke kodiraju se kao kombinacija crtica (-) i tačaka (.) (A = .- , B= -… , itd.). Neka je poznat način kodiranja svih slova azbuke i poznato je da su kodovi prefiksni, odnosno da kraći kod '''može''' biti prefiks dužeg koda.
<div class="abc-list">
# Predložiti i opisati strukturu stabla pogodnu za operaciju dekodovanja pojedinačnih simbola poruke.
# Implementirati funkciju DECODE_MORSE koja na osnovu strukture predložene pod a) dekodira neku zadatu poruku. Poruka je prosleđena kao argument funkcije (''msg'') i predstavlja nisku crtica i tacaka. Smatrati da su kodirana slova odvojena blanko znakovima.
</div>


==== Rešenje ====
==== 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.
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.
<u>DECODE MORSE(''msg'', ''root'')</u>
{{Милокод|<nowiki>
''i'' = 0
DECODE MORSE(msg)
''new_msg'' = ""
i = 0
'''while''' ''msg''[''i''] ≠ 0 '''do'''
new_msg = ""
    ''p'' = ''root''
while msg[i] ≠ 0 do
    '''while''' (''msg''[''i''] ≠ ' ') and (''p'' ≠ nil) '''do'''
    p = root
        '''if''' ''msg''[''i''] = '.' '''then'''
    while (msg[i] ≠ ' ') and (p ≠ nil) do
            ''p'' = ''left''(''p'')
        if msg[i] = '.' then
        '''else if''' msg[i] = '-' '''then'''
            p = left(p)
            ''p'' = ''right''(''p'')
        else if msg[i] = '-' then
        '''else'''
            p = right(p)
            ERROR(Invalid code)
        else
        '''end_if'''
            ERROR(Invalid code)
        ''i'' = ''i'' + 1
        end_if
    '''end_while'''
        i = i + 1
    ''i'' = ''i'' + 1
    end_while
    '''if''' (''p'' = nil) or (''sign''(''p'') = 0) '''then'''
    i = i + 1
        ERROR(Invalid code)
    if (p = nil) or (sign(p) = 0) then
    '''end_while'''
        ERROR(Invalid code)
    ''new_msg'' = ''new_msg'' + ''sign''(''p'')
    end_while
'''end_while'''
    new_msg = new_msg + sign(p)
'''return''' ''new_msg''
end_while
return new_msg
</nowiki>}}


=== 3. zadatak ===
=== 3. zadatak ===
==== Postavka ====
==== Postavka ====
Kodirati sekvencu '''BIBBIDIBOBBIDIBOO''' po koracima.
Primenom LZW algoritma '''prikazati postupak''' kodiranja znakovnog niza BIBBIDIBOBBIDIBOO, ako je data početna tabela sa kodovima simbola. Napisati kodiranu poruku i izgled tabele simbola nakon postupka kodiranja.


==== Rešenje ====
==== Rešenje ====
Ред 148: Ред 357:
=== 4. zadatak ===
=== 4. zadatak ===
==== Postavka ====
==== Postavka ====
Dužine puteva u stablu
<div class="abc-list">
<div class="abc-list">
# Definisati internu dužinu puta, eksternu dužinu puta i eksternu težinsku dužinu puta.
# Formalno definisati i objasniti internu, eksternu i težinsku eksternu dužinu puta u binarnom stablu.
# 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.
# Napisati u pseudokodu implementaciju funkcije koja izračunava težinsku eksternu dužinu puta binarnog stabla na čiji koren ukazuje pokazivač root. Smatrati da listovi stabla poseduju informaciju o težini čvora. Dozvoljeno koristiti gotove linearne strukture podataka.
</div>
</div>


Ред 158: Ред 368:
* Eksterna težinska dužina puta je zbir proizvoda dužina puteva od korena do svakog eksternog čvora i težine tih eksternih čvorova.
* 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.
Za potrebe ovog algoritma smatra se da su eksterni čvorovi izjednačeni sa listovima.
<u>EXTERNAL WEIGHTED PATH LENGTH(''root'')</u>
{{Милокод|<nowiki>
QUEUE_INIT(''Q_nodes'')
CALC EXT WPL(root)
QUEUE_INIT(''Q_levels'')
QUEUE_INIT(Q_nodes)
INSERT(''Q_nodes'', ''root'')
QUEUE_INIT(Q_levels)
INSERT(''Q_levels'', ''root'')
INSERT(Q_nodes, root)
''node'' = nil
INSERT(Q_levels, 0)
''level'' = 0
node = nil
''pwe'' = 0
level = 0
'''while''' not QUEUE_EMPTY(''Q_nodes'') '''do'''
pwe = 0
    ''node'' = DELETE(''Q_nodes'')
while not QUEUE_EMPTY(Q_nodes) do
    ''level'' = DELETE(''Q_levels'')
    node = DELETE(Q_nodes)
    '''if''' (''left''(''node'') = nil) and (''right''(''node'') = nil) '''then'''
    level = DELETE(Q_levels)
        ''pwe'' = ''pwe'' + ''level'' * ''weight''(''node'')
    if (left(node) = nil) and (right(node) = nil) then
    '''end_if'''
        pwe = pwe + level * weight(node)
    '''if''' ''left''(''node'') ≠ nil '''then'''
    end_if
        INSERT(''Q_nodes'', ''left''(''node''))
    if left(node) ≠ nil then
        INSERT(''Q_levels'', ''level'' + 1)
        INSERT(Q_nodes, left(node))
    '''end_if'''
        INSERT(Q_levels, level + 1)
    '''if''' ''right''(''node'') ≠ nil '''then'''
    end_if
        INSERT(''Q_nodes'', ''right''(''node''))
    if right(node) ≠ nil then
        INSERT(''Q_levels'', ''level'' + 1)
        INSERT(Q_nodes, right(node))
    '''end_if'''
        INSERT(Q_levels, level + 1)
'''end_while'''
    end_if
'''return''' ''pwe''
end_while
return pwe
</nowiki>}}


== Treći kolokvijum ==
== Treći kolokvijum ==
=== 1. zadatak ===
=== 1. zadatak ===
==== Postavka ====
==== Postavka ====
Dat je usmeren, aciklični graf predstavljen pomoću matrice susednosti kod koga su čvorovi numerisani od 1 do ''n''. Objasniti kako se korišćenjem odgovarajućeg grafovskog algoritma mogu prenumerisati čvorovi tako da matrica susednosti postane gornja trougaona i napisati u pseudokodu funkciju RELABEL koja prenumerisanje.


==== Rešenje ====
==== Rešenje ====
{{Милокод|<nowiki>
RELABEL(G, n)
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
</nowiki>}}


=== 2. zadatak ===
=== 2. zadatak ===
==== Postavka ====
==== Postavka ====
[[{{ns:6}}:ASP1 jun 2020 zadatak 3.2 graf.svg|thumb|Graf iz postavke drugog zadatka.]]
''Floyd''-ov algoritam. Na slici je dat usmereni težinski graf.
<div class="abc-list">
<div class="abc-list">
# '''(?)'''
# Predstaviti dati graf odgovarajućom matričnom reprezentacijom.
# Napisati postupak za Flojdov algoritam na datom grafu. '''(?)'''
# Pronaći najkraća rastojanja među čvorovima upotrebom ''Floyd''-ovog algoritma. Postupak prikazati po koracima.
# Napisati najkraći put od čvora ''b'' do čvora ''d''.
# Na osnovu rezultat pod b) rekonstruisati najkraću putanju između čvorova ''b'' i ''d''.
</div>
</div>


==== Rešenje ====
==== Rešenje ====
<div class="abc-list">
Rešenje stavke pod c je '''bfaced'''.
# '''(?)'''
{| class="wikitable"
# '''(?)'''
|+ Matrična reprezentacija grafa
# ''bfaced''
! - !! a !! b !! c !! d !! e !! f
|-
! a
| ∞ || 7 || 3 || 10 || 8 || ∞
|-
! b
| ∞ || ∞ || ∞ || 22 || ∞ || 1
|-
! c
| ∞ || ∞ || ∞ || 5 || 2 || ∞
|-
! d
| ∞ || ∞ || ∞ || ∞ || ∞ || 12
|-
! e
| ∞ || ∞ || ∞ || 1 || ∞ || ∞
|-
! f
| 6 || ∞ || ∞ || ∞ || ∞ || ∞
|}
<div style="display: flex; flex-wrap: wrap; justify-content: space-between;">
{| class="wikitable"
|+ ''Floyd''-ov algoritam za <math>k = 1</math>
|-
| ∞ || 7 || 3 || 10 || 8 || ∞
|-
| ∞ || ∞ || ∞ || 22 || ∞ || 1
|-
| ∞ || ∞ || ∞ || 5 || 2 || ∞
|-
| ∞ || ∞ || ∞ || ∞ || ∞ || 12
|-
| ∞ || ∞ || ∞ || 1 || ∞ || ∞
|-
| 6 || 13 || 9 || 16 || 14 || ∞
|}
{| class="wikitable"
|+ Matrica prethodnika za <math>k = 1</math>
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 1 || 1 || 1 || 1 || 0
|}
{| class="wikitable"
|+ ''Floyd''-ov algoritam za <math>k = 2</math>
|-
| ∞ || 7 || 3 || 10 || 8 || 8
|-
| ∞ || ∞ || ∞ || 22 || ∞ || 1
|-
| ∞ || ∞ || ∞ || 5 || 2 || ∞
|-
| ∞ || ∞ || ∞ || ∞ || ∞ || 12
|-
| ∞ || ∞ || ∞ || 1 || ∞ || ∞
|-
| 6 || 13 || 9 || 16 || 14 || 14
|}
{| class="wikitable"
|+ Matrica prethodnika za <math>k = 2</math>
|-
| 0 || 0 || 0 || 0 || 0 || 2
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 1 || 1 || 1 || 1 || 2
|}
{| class="wikitable"
|+ ''Floyd''-ov algoritam za <math>k = 3</math>
|-
| ∞ || 7 || 3 || 8 || 5 || 8
|-
| ∞ || ∞ || ∞ || 22 || ∞ || 1
|-
| ∞ || ∞ || ∞ || 5 || 2 || ∞
|-
| ∞ || ∞ || ∞ || ∞ || ∞ || 12
|-
| ∞ || ∞ || ∞ || 1 || ∞ || ∞
|-
| 6 || 13 || 9 || 14 || 11 || 14
|}
{| class="wikitable"
|+ Matrica prethodnika za <math>k = 3</math>
|-
| 0 || 0 || 0 || 3 || 3 || 2
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 1 || 1 || 3 || 3 || 2
|}
{| class="wikitable"
|+ ''Floyd''-ov algoritam za <math>k = 4</math>
|-
| ∞ || 7 || 3 || 8 || 5 || 8
|-
| ∞ || ∞ || ∞ || 22 || ∞ || 1
|-
| ∞ || ∞ || ∞ || 5 || 2 || 17
|-
| ∞ || ∞ || ∞ || ∞ || ∞ || 12
|-
| ∞ || ∞ || ∞ || 1 || ∞ || 13
|-
| 6 || 13 || 9 || 14 || 11 || 14
|}
{| class="wikitable"
|+ Matrica prethodnika za <math>k = 4</math>
|-
| 0 || 0 || 0 || 3 || 3 || 2
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 4
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 4
|-
| 0 || 1 || 1 || 3 || 3 || 2
|}
{| class="wikitable"
|+ ''Floyd''-ov algoritam za <math>k = 5</math>
|-
| ∞ || 7 || 3 || 6 || 5 || 8
|-
| ∞ || ∞ || ∞ || 22 || ∞ || 1
|-
| ∞ || ∞ || ∞ || 3 || 2 || 15
|-
| ∞ || ∞ || ∞ || ∞ || ∞ || 12
|-
| ∞ || ∞ || ∞ || 1 || ∞ || 13
|-
| 6 || 13 || 9 || 12 || 11 || 14
|}
{| class="wikitable"
|+ Matrica prethodnika za <math>k = 5</math>
|-
| 0 || 0 || 0 || 5 || 3 || 2
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 5 || 0 || 5
|-
| 0 || 0 || 0 || 0 || 0 || 0
|-
| 0 || 0 || 0 || 0 || 0 || 4
|-
| 0 || 1 || 1 || 5 || 3 || 2
|}
{| class="wikitable"
|+ ''Floyd''-ov algoritam za <math>k = 6</math>
|-
| 14 || 7 || 3 || 6 || 5 || 8
|-
| 7 || 14 || 10 || 13 || 12 || 1
|-
| 21 || 28 || 24 || 3 || 2 || 15
|-
| 18 || 25 || 21 || 24 || 23 || 12
|-
| 19 || 26 || 22 || 1 || 24 || 13
|-
| 6 || 13 || 9 || 12 || 11 || 14
|}
{| class="wikitable"
|+ Matrica prethodnika za <math>k = 6</math>
|-
| 6 || 0 || 0 || 5 || 3 || 2
|-
| 6 || 6 || 6 || 6 || 6 || 0
|-
| 6 || 6 || 6 || 5 || 0 || 5
|-
| 6 || 6 || 6 || 6 || 6 || 0
|-
| 6 || 6 || 6 || 0 || 6 || 4
|-
| 0 || 1 || 1 || 5 || 3 || 2
|}
</div>
</div>


=== 3. zadatak ===
=== 3. zadatak ===
==== Postavka ====
==== 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.
[[{{ns:6}}:ASP1 jun 2020 zadatak 3.3 graf.svg|thumb|Graf iz postavke trećeg zadatka.]]
Na slici je dat protočni graf u okviru koga postoji već uspostavljen protok po pojedinim granama. Nacrtati rezidualni graf i navesti sve moguće puteve povećanog protoka u sledećoj iteraciji, uz navođenje kapaciteta za te puteve.


==== Rešenje ====
==== Rešenje ====
[[{{ns:6}}:ASP1 jun 2020 zadatak 3.3 rezidualni graf.svg|thumb|Rezidualni graf za treći zadatak.]]
Mogući putevi povećanog protoka:
* SCBT (2)
* SCBT (2)
* SACBT (2)
* SACBT (2)
* SDECBT (2)
* SDECBT (2)
* SDACBT (2)
* SADECBT (2)


=== 4. zadatak ===
=== 4. zadatak ===
==== Postavka ====
==== 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.
Neka se posmatra se neusmeren netežinski graf.
<div class="abc-list">
# Na koji način se u ovakvom grafu može ostvariti provera cikličnosti grafa korišćenjem algoritama za obilazak po širini i po dubini? Objasniti i nacrtati primer.
# Napisati u pseudokodu implementaciju funkcije koja korišćenjem obilaska po širini određuje da li je prosleđeni graf cikličan. Smatrati da je graf predstavljen matricom susednosti. Dozvoljeno je koristiti gotove linearne strukture podataka.
</div>


==== Rešenje ====
==== 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.
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.
<u>IS CYCLIC(''G'')</u>
{{Милокод|<nowiki>
'''for''' ''i'' = 1 '''to''' ''n'' '''do'''
IS CYCLIC(G)
    ''visited''[''i''] = 0
for i = 1 to n do
'''end_for'''
    visited[i] = 0
QUEUE_INIT(''Q_nodes'')
end_for
QUEUE_INIT(''Q_parents'')
QUEUE_INIT(Q_nodes)
INSERT(''Q_nodes'', 1)
QUEUE_INIT(Q_parents)
INSERT(''Q_parents'', 0)
INSERT(Q_nodes, 1)
''node'' = ''parent'' = 0
INSERT(Q_parents, 0)
'''while''' not QUEUE_EMPTY(''Q_nodes'') '''do'''
node = parent = 0
    ''node'' = DELETE(''Q_nodes'')
while not QUEUE_EMPTY(Q_nodes) do
    ''parent'' = DELETE(''Q_parents'')
    node = DELETE(Q_nodes)
    '''for''' (''node'', ''i'') ∈ ''E'' '''do'''
    parent = DELETE(Q_parents)
        '''if''' ''i'' = ''parent'' '''then'''
    for (node, i) ∈ E do
            '''continue'''
        if i = parent then
        '''end_if'''
            continue
        '''if''' ''visited''[''i''] '''then'''
        end_if
            '''return''' true
        if visited[i] then
        '''end_if'''
            return true
        INSERT(''Q_nodes'', ''i'')
        end_if
        INSERT(''Q_parents'', ''node'')
        INSERT(Q_nodes, i)
        ''visited''[''i''] = true
        INSERT(Q_parents, node)
    '''end_for'''
        visited[i] = true
'''end_while'''
    end_for
'''return''' false
end_while
return false
</nowiki>}}


[[Категорија:Рокови]]
[[Категорија:Рокови]]
[[Категорија:АСП1]]

Тренутна верзија на датум 13. септембар 2024. у 02:08

Zadaci

Prvi kolokvijum

1. zadatak

Postavka

Data je ulančana lista kod koje svaki element ima određeni informacioni sadržaj, pokazivač na sledeći element u listi, kao i pokazivač na neki proizvoljan element liste. Napisati u pseudokodu funkciju DEEP_COPY koja prihvata pokazivač na prvi element liste i pravi kopiju liste sa istim načinom i poretkom povezivanja kao u polaznoj listi (duboka kopija).

Rešenje

DEEP COPY(head)
p = head
q = r = new_node = nil
new_head = new_tail = nil
while p ≠ nil do
    new_node = GETNODE
    value(new_node) = value(p)
    other_p(new_node) = other_p(p)
    if new_head = nil then
        new_head = new_node
    else
        next(new_tail) = new_node
    end_if
    new_tail = new_node
    p = next(p)
end_while
p = head
q = new_head
while p ≠ nil do
    r = new_head
    while r ≠ nil do
        if other_p(r) = p then
            other_p(r) = q
        end_if
        r = next(r)
    end_while
    p = next(p)
    q = next(q)
end_while
return new_head

2. zadatak

Postavka

Neka je datoj funkciji POST_TO_INF prosleđen neki aritmetički izraz u postfiksnom obliku (expression). Operandi su velika slova engleskog alfabeta. Napisati iterativnu implementaciju ove funkcije koja kao rezultat vraća dati aritmetički izraz transformisan u infiksnu formu. Rezultujući izraz formirati korišćenjem potpunih zagrada.

Rešenje

POST TO INF(expression)
stack = nil
expr1 = expr2 = nil
for c in expression do
    if IS_BINARY_OPERATOR(c) then
        expr1 = POP(stack)
        expr2 = POP(stack)
        PUSH(stack, "(" + expr1 + c + expr2 + ")")
    else if IS_UNARY_OPERATOR(c) then
        expr1 = POP(stack)
        PUSH(stack, "(" + c + expr1 + ")")
    else
        PUSH(stack, c)
    end_if
end_for
return POP(stack)
PUSH(stack, value)
node = GETNODE
value(node) = value
next(node) = stack
stack = node
POP(stack, value)
if stack = nil then
    ERROR(Underflow)
else
    node = stack
    value = value(node)
    stack = next(stack)
    FREENODE(node)
    return value
end_if

3. zadatak

Postavka

Vektorska implementacija prioritetnog reda

U prioritetni red se prvo redom ubacuju sledeći elementi 2, 18, 19, 1, 9, 6. Nakon toga se iz reda uklanjaju dva elementa i potom dodaju elementi 15, 17 i 11, redom. Kapacitet vektora u koji se smeštaju elementi je 7. Manji broj označava veći prioritet. Za svaki od datih načina implementacije prikazati izgled reda nakon inicijalnog umetanja, nakon svakog brisanja i svakog umetanja poslednja tri elementa (15, 17 i 11). Ukoliko implementacija koristi neke dodatne pokazivače, naznačiti ih ispod odgovarajućeg indeksa u vektoru.

  1. Implementacija održavanjem uređenosti reda
  2. Implementacija markiranjem elemenata, bez umetanja preko markiranog elementa
  3. Implementacija markiranjem elemenata, sa umetanjem preko markiranog elementa

Rešenje

Implementacija održavanjem uređenosti reda
1 2 6 9 18 19
2 6 9 18 19
6 9 18 19
6 9 15 18 19
6 9 15 17 18 19
6 9 11 15 17 18 19
Implementacija markiranjem elemenata, bez umetanja preko markiranog elementa
2 18 19 1 9 6
2 18 19 X 9 6
X 18 19 X 9 6
X 18 19 X 9 6 15
18 19 9 6 15 17
18 19 9 6 15 17 11
Implementacija markiranjem elemenata, sa umetanjem preko markiranog elementa
2 18 19 1 9 6
2 18 19 X 9 6
X 18 19 X 9 6
15 18 19 X 9 6
15 18 19 17 9 6
15 18 19 17 9 6 11

4. zadatak

Postavka

Neka se blok-dijagonalna matrica definiše kao kvadratna matrica A dimenzija n x n čiji su nenulti elementi smešteni samo u okviru blokova dimenzije k x k koji se nalaze na glavnoj dijagonali matrice, kao na slici i važi uslov n mod k = 0. Ukratko objasniti postupak smeštanja i izvesti adresnu funkciju pri pristupu proizvoljnom elementu matrice A[1:n, 1:n] smeštene po vrstama. Smatrati da se jedan element matrice smešta u tačno jednu memorijsku reč.

Primer matrice za
- 1 2 3 4 5 6
1 X X
2 X X
3 X X
4 X X
5 X X
6 X X

Rešenje

  1. Prvo gledamo u kojem se "bloku" na dijagonali nalazi element koji biramo. Taj blok možemo naći kao .
  2. Nakon toga, možemo na osnovu indeksa bloka (koji kreće od 0) možemo naći i indekse za gornji levi ćošak tog bloka kao .
  3. Sada računamo indeks trenutnog elementa na osnovu tri podatka: koliko se elemenata nalazi u prethodnim blokovima, koliko se elemenata nalazi iznad trenutnog elementa u trenutnom bloku i koliko se elemenata nalazi levo od trenutnog elementa u trenutnom bloku.
    1. Prethodni blokovi: (u svakom bloku se nalazi po elemenata)
    2. Iznad: (u svakom redu nalazi se elemenata)
    3. Levo:
  4. Konačna adresna funkcija:
  5. Uslov:

Drugi kolokvijum

1. zadatak

Postavka

Postorder i preorder obilazak

  1. Da li je, pomoću datog preorder i postorder obilaska binarnog stabla moguće rekonstruisati jedinstveno binarno stablo? Detaljno obrazložiti odgovor.
  2. Ukoliko je preorder obilazak stabla VALDENJOM, a postorder obilazak stabla DLEAOMJNV, rekonstruisati stablo. Ukoliko postoji više mogućih stabala, dati izgled svakog od njih.

Rešenje

  1. 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.
  2. Moguće su četiri rekonstrukcije, jer se ne zna da li je čvor D levo ili desno dete čvora L i takođe da li je čvor J levo ili desno dete čvora N.
        V             V              V                V
     /     \       /     \        /     \          /     \
    A       N     A       N      A       N        A       N
   / \     /     / \     /      / \       \      / \       \
  L   E   J     L   E   J      L   E       J    L   E       J
 /       / \     \     / \    /           / \    \         / \
D       O   M     D   O   M  D           O   M    D       O   M

2. zadatak

Postavka

Slova Morzeove azbuke kodiraju se kao kombinacija crtica (-) i tačaka (.) (A = .- , B= -… , itd.). Neka je poznat način kodiranja svih slova azbuke i poznato je da su kodovi prefiksni, odnosno da kraći kod može biti prefiks dužeg koda.

  1. Predložiti i opisati strukturu stabla pogodnu za operaciju dekodovanja pojedinačnih simbola poruke.
  2. Implementirati funkciju DECODE_MORSE koja na osnovu strukture predložene pod a) dekodira neku zadatu poruku. Poruka je prosleđena kao argument funkcije (msg) i predstavlja nisku crtica i tacaka. Smatrati da su kodirana slova odvojena blanko znakovima.

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)
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

Primenom LZW algoritma prikazati postupak kodiranja znakovnog niza BIBBIDIBOBBIDIBOO, ako je data početna tabela sa kodovima simbola. Napisati kodiranu poruku i izgled tabele simbola nakon postupka kodiranja.

Rešenje

Krajnje kodirano: 0204153628033

Tablica LZW kodova (prva četiri data u postavci)
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
Postupak dekodovanja
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

Dužine puteva u stablu

  1. Formalno definisati i objasniti internu, eksternu i težinsku eksternu dužinu puta u binarnom stablu.
  2. Napisati u pseudokodu implementaciju funkcije koja izračunava težinsku eksternu dužinu puta binarnog stabla na čiji koren ukazuje pokazivač root. Smatrati da listovi stabla poseduju informaciju o težini čvora. Dozvoljeno koristiti gotove linearne strukture 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.

CALC EXT WPL(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 usmeren, aciklični graf predstavljen pomoću matrice susednosti kod koga su čvorovi numerisani od 1 do n. Objasniti kako se korišćenjem odgovarajućeg grafovskog algoritma mogu prenumerisati čvorovi tako da matrica susednosti postane gornja trougaona i napisati u pseudokodu funkciju RELABEL koja prenumerisanje.

Rešenje

RELABEL(G, n)
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

Graf iz postavke drugog zadatka.

Floyd-ov algoritam. Na slici je dat usmereni težinski graf.

  1. Predstaviti dati graf odgovarajućom matričnom reprezentacijom.
  2. Pronaći najkraća rastojanja među čvorovima upotrebom Floyd-ovog algoritma. Postupak prikazati po koracima.
  3. Na osnovu rezultat pod b) rekonstruisati najkraću putanju između čvorova b i d.

Rešenje

Rešenje stavke pod c je bfaced.

Matrična reprezentacija grafa
- a b c d e f
a 7 3 10 8
b 22 1
c 5 2
d 12
e 1
f 6
Floyd-ov algoritam za
7 3 10 8
22 1
5 2
12
1
6 13 9 16 14
Matrica prethodnika za
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 1 1 1 1 0
Floyd-ov algoritam za
7 3 10 8 8
22 1
5 2
12
1
6 13 9 16 14 14
Matrica prethodnika za
0 0 0 0 0 2
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 1 1 1 1 2
Floyd-ov algoritam za
7 3 8 5 8
22 1
5 2
12
1
6 13 9 14 11 14
Matrica prethodnika za
0 0 0 3 3 2
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 1 1 3 3 2
Floyd-ov algoritam za
7 3 8 5 8
22 1
5 2 17
12
1 13
6 13 9 14 11 14
Matrica prethodnika za
0 0 0 3 3 2
0 0 0 0 0 0
0 0 0 0 0 4
0 0 0 0 0 0
0 0 0 0 0 4
0 1 1 3 3 2
Floyd-ov algoritam za
7 3 6 5 8
22 1
3 2 15
12
1 13
6 13 9 12 11 14
Matrica prethodnika za
0 0 0 5 3 2
0 0 0 0 0 0
0 0 0 5 0 5
0 0 0 0 0 0
0 0 0 0 0 4
0 1 1 5 3 2
Floyd-ov algoritam za
14 7 3 6 5 8
7 14 10 13 12 1
21 28 24 3 2 15
18 25 21 24 23 12
19 26 22 1 24 13
6 13 9 12 11 14
Matrica prethodnika za
6 0 0 5 3 2
6 6 6 6 6 0
6 6 6 5 0 5
6 6 6 6 6 0
6 6 6 0 6 4
0 1 1 5 3 2

3. zadatak

Postavka

Graf iz postavke trećeg zadatka.

Na slici je dat protočni graf u okviru koga postoji već uspostavljen protok po pojedinim granama. Nacrtati rezidualni graf i navesti sve moguće puteve povećanog protoka u sledećoj iteraciji, uz navođenje kapaciteta za te puteve.

Rešenje

Rezidualni graf za treći zadatak.

Mogući putevi povećanog protoka:

  • SCBT (2)
  • SACBT (2)
  • SDECBT (2)
  • SADECBT (2)

4. zadatak

Postavka

Neka se posmatra se neusmeren netežinski graf.

  1. Na koji način se u ovakvom grafu može ostvariti provera cikličnosti grafa korišćenjem algoritama za obilazak po širini i po dubini? Objasniti i nacrtati primer.
  2. Napisati u pseudokodu implementaciju funkcije koja korišćenjem obilaska po širini određuje da li je prosleđeni graf cikličan. Smatrati da je graf predstavljen matricom susednosti. Dozvoljeno je koristiti gotove 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