АСП1/К2 2019 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (Mala ispravks)
м (Замена начина истицања милокода.)
 
(Није приказано 20 међуизмена 3 корисника)
Ред 7: Ред 7:


=== Rešenje ===
=== Rešenje ===
<u>FORM TREE(''arr'', ''n'')</u>
{{Милокод|<nowiki>
ALLOCATE(''nodes''[''n''])
FORM TREE(arr, n)
''j'' = 1
ALLOCATE(nodes[n])
''nodes''[1] = GETNODE(''arr''[1])
if n = 0 then
'''for''' ''i'' = 1 to ''n'' '''do'''
    return nil
    ''nodes''[''i''] = GETNODE(''arr''[''i''])
end_if
    '''if''' ''j'' < ''n'' '''then'''
j = 1
        ''j'' = ''j'' + 1
nodes[1] = GETNODE(arr[1])
        ''left''(''nodes''[''i'']) = GETNODE(''arr''[''j''])
for i = 1 to n do
    '''end_if'''
    if j < n then
    '''if''' ''j'' < ''n'' '''then'''
        j = j + 1
        ''j'' = ''j'' + 1
        nodes[j] = GETNODE(arr[j])
        ''right''(''nodes''[''i'']) = GETNODE(''arr''[''j''])
        left(nodes[i]) = nodes[j]
    '''end_if'''
    end_if
'''end_for'''
    if j < n then
'''return''' ''nodes''[1]
        j = j + 1
 
        nodes[j] = GETNODE(arr[j])
<u>GETNODE(''value'')</u>
        right(nodes[i]) = nodes[j]
ALLOCATE(''node'')
    end_if
''left''(''node'') = nil
end_for
''right''(''node'') = nil
return nodes[1]
''value''(''node'') = ''value''
</nowiki>}}
'''return''' ''node''
{{Милокод|<nowiki>
GETNODE(value)
ALLOCATE(node)
left(node) = nil
right(node) = nil
value(node) = value
return node
</nowiki>}}


== 2. zadatak ==
== 2. zadatak ==
Ред 98: Ред 105:


=== Rešenje ===
=== Rešenje ===
<u>FIND CODES(''root'', ''k'')</u>
{{Милокод|<nowiki>
'''if''' ''root'' = nil '''then'''
FIND CODES(root, k)
    '''return''' nil
if (root = nil) or (k ≤ 0) then
'''end_if'''
    return nil
''symbols'' = nil
end_if
''node'' = nil
symbols = nil
''depth'' = 0
node = nil
''symb_node'' = nil
depth = 0
''p'' = symbols
symb_node = nil
QUEUE_INIT(''Q1'')
p = symbols
QUEUE_INIT(''Q2'')
QUEUE_INIT(Q1)
QUEUE_INSERT(''Q1'', ''root'')
QUEUE_INIT(Q2)
QUEUE_INSERT(''Q2'', 0)
QUEUE_INSERT(Q1, root)
'''while''' '''not''' QUEUE_EMPTY(''Q1'') '''do'''
QUEUE_INSERT(Q2, 0)
    ''node'' = QUEUE_DELETE(''Q1'')
while not QUEUE_EMPTY(Q1) do
    ''depth'' = QUEUE_DELETE(''Q2'')
    node = QUEUE_DELETE(Q1)
    '''if''' ''depth'' = ''k'' '''then'''
    depth = QUEUE_DELETE(Q2)
        '''if''' ''symbol''(''node'') ≠ nil '''then'''
    if depth = k then
            ''symb_node'' = GETNODE
        if symbol(node) ≠ nil then
            ''value''(''symb_node'') = ''symbol''(''node'')
            symb_node = GETNODE
            '''if''' ''symbols'' = nil '''then'''
            value(symb_node) = symbol(node)
                ''symbols'' = ''p'' = ''symb_node''
            if symbols = nil then
            '''else'''
                symbols = p = symb_node
                ''next''(''p'') = ''symb_node''
            else
                ''p'' = ''next''(''p'')
                next(p) = symb_node
            '''end_if'''
                p = next(p)
        '''end_if'''
            end_if
    '''else'''
        end_if
        '''if''' ''left''(''node'') ≠ nil '''then'''
    else
            QUEUE_INSERT(''Q1'', ''left''(''node''))
        if left(node) ≠ nil then
            QUEUE_INSERT(''Q2'', ''depth'' + 1)
            QUEUE_INSERT(Q1, left(node))
        '''end_if'''
            QUEUE_INSERT(Q2, depth + 1)
        '''if''' ''right''(''node'') ≠ nil '''then'''
        end_if
            QUEUE_INSERT(''Q1'', ''right''(''node''))
        if right(node) ≠ nil then
            QUEUE_INSERT(''Q2'', ''depth'' + 1)
            QUEUE_INSERT(Q1, right(node))
        '''end_if'''
            QUEUE_INSERT(Q2, depth + 1)
    '''end_if'''
        end_if
'''end_while'''
    end_if
'''return''' ''symbols''
end_while
return symbols
</nowiki>}}


== 5. zadatak ==
== 5. zadatak ==
Ред 143: Ред 152:


=== Rešenje ===
=== Rešenje ===
* Krajnje transmitovano: '''A 0B 00R 0 100K 0 1100D 0 10 110 0'''
* Krajnje transmitovano: '''A 0B 00R 0 100K 0 1100D 0 110 110 0'''
* Krajnje kodirano: '''000 0001 00010 0 100011 0 1100100 0 10 110 0'''
* Krajnje kodirano: '''000 0001 00010 0 100011 0 1100100 0 110 110 0'''
* Krajnje stablo:
* Krajnje stablo:
  11
    11
  /  \
  /  \
A   6
  A     6
5  / \
  5  /   \
     4
    2     4
     / \
     / \  / \
      R   2
  1  K R  B
      2  / \
  / \  1 2  2
        1  K
NYT D
      / \  1
  0 1
    NYT D
      0   1


== 6. zadatak ==
== 6. zadatak ==
Ред 164: Ред 171:


=== Rešenje ===
=== Rešenje ===
Može se modifikovati tako što čuvamo pokazivač na prethodno obrađeni čvor (<code>prev</code>) i pre obrađivanja trenutnog čvora (<code>P(''next'')</code>, gde je <code>next</code> trenutno obrađivani čvor) radimo sledeće:
{{Милокод|<nowiki>
if prev ≠ nil then
    if left(next) = nil then
        left(next) = prev
        lf(next) = 0
    end_if
    if right(prev) = nil then
        right(prev) = next
        rf(prev) = 0
    end_if
end_if
prev = next
</nowiki>}}


== 7. zadatak ==
== 7. zadatak ==
Ред 170: Ред 191:


=== Rešenje ===
=== Rešenje ===
Interna dužina puta postiže maksimum u degenerisanom binarnom stablu u kojem ima jedan čvor po nivou, na primer (za <code>n = 4</code>):
      A
      /
    B
    /
  C
  /
D
Interna dužina puta je zbir dužina puteva od korena stabla do svakog internog čvora, što je u ovom slučaju <math>PI = 1 + 2 + 3 = 6</math>. Možemo primetiti da je do svakog internog čvora putanja za jedan kraća od nivoa na kojem se nalazi i da ima za jedan manje puteva od broja čvorova iz čega dobijamo da je interna dužina puta za binarno stablo sa <math>n</math> čvorova jednaka <math>PI_n = 1 + 2 + 3 + ... + (n - 1) = \frac{(n-1) n}{2}</math>.


== 8. zadatak ==
== 8. zadatak ==
=== Postavka ===
=== Postavka ===
Na jednoj društvenoj mreži postoji simetrična relacija prijateljstva između korisnika i
Na jednoj društvenoj mreži postoji simetrična relacija prijateljstva između korisnika i asimetrična relacija praćenja kod koje jedan korisnik prati aktivnosti drugog. Potrebno je posmatranu društvenu mrežu modelirati grafom.
asimetrična relacija praćenja kod koje jedan korisnik prati aktivnosti drugog. Potrebno je
posmatranu društvenu mrežu modelirati grafom.
<div class="abc-list">
<div class="abc-list">
# Predložiti odgovarajući tip grafa i detaljno opisati njegove osobine.
# Predložiti odgovarajući tip grafa i detaljno opisati njegove osobine.
# Predložiti i obrazložiti odgovarajaću memorijsku reprezentaciju grafa, tako da se optimizuje određivanje ukupnog broja pratilaca nekog korisnika. Korisnikove aktivnosti mogu da prate i prijatelji i pratioci.
# Predložiti i obrazložiti odgovarajaću memorijsku reprezentaciju grafa, tako da se optimizuje određivanje ukupnog broja pratilaca nekog korisnika. Korisnikove aktivnosti mogu da prate i prijatelji i pratioci.
# Napisati pseudkod funkcije koja za zadatog korisnika vraća ukupan broj pratilaca.
# Napisati pseudkod<sup>[sic]</sup> funkcije koja za zadatog korisnika vraća ukupan broj pratilaca.
</div>
</div>


=== Rešenje ===
=== Rešenje ===
: ''U rešenju se pretpostavlja da se u postavci zadatka implicira da su prijatelji ujedno i pratioci.''
Ovu mrežu je moguće modelirati usmerenim netežinskim grafom gde čvorovi označavaju korisnike a grane označavaju relacije praćenja, gde grana od čvora A do čvora B označava da korisnik A prati korisnika B. Optimalna reprezentacija grafa u ovom slučaju jeste preko inverzne liste susednosti, jer na taj način mora proći kroz tačno onoliko pratilaca koliki će broj biti vraćen na kraju, a ako se čuva dužina inverzne liste susednosti u zaglavlju onda je složenost algoritma konstantna.
{{Милокод|<nowiki>
FOLLOWERS(G, i)
followers = 0
p = IAL[i]
while' p ≠ nil do
    followers = followers + 1
    p = next(p)
end_while
return followers
</nowiki>}}
[[Категорија:Рокови]]
[[Категорија:АСП1]]

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

Zadaci

1. zadatak

Postavka

Neka je skoro kompletno ili kompletno binarno stablo predstavljeno sekvencijalnom memorijskom reprezentacijom (nizom). Na osnovu prosleđenog niza u kome su smeštene celobrojne vrednosti koje predstavljaju informacioni sadržaj čvorova, formirati ekvivalentno binarno stablo ulančane reprezentacije.

Rešenje

FORM TREE(arr, n)
ALLOCATE(nodes[n])
if n = 0 then
    return nil
end_if
j = 1
nodes[1] = GETNODE(arr[1])
for i = 1 to n do
    if j < n then
        j = j + 1
        nodes[j] = GETNODE(arr[j])
        left(nodes[i]) = nodes[j]
    end_if
    if j < n then
        j = j + 1
        nodes[j] = GETNODE(arr[j])
        right(nodes[i]) = nodes[j]
    end_if
end_for
return nodes[1]
GETNODE(value)
ALLOCATE(node)
left(node) = nil
right(node) = nil
value(node) = value
return node

2. zadatak

Postavka

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

Rešenje

Kodovano: 014234

Simbol Kôd
K 0
U 1
R 2
I 3
KU 4
UK 5
KUR 6
RI 7
IK 8

3. zadatak

Postavka

Za neko binarno stablo preorder obilazak daje poredak HBIKCFDAEJG, a inorder obilazak HBIADJEGFCK. Odrediti poredak koji se dobija level-order obilaskom i objasniti postupak.

Rešenje

  H
   \
    B
     \
      I
       \
        K
       /
      C
     /
    F
   /
  D
 / \
A   E
   / \
  J   G

Level-order obilazak: HBIKCFDAEJG. Postupak se svodi na to da idemo po svakom nivou binarnog stabla i čitamo sadržaj tog nivoa sleva na desno.

4. pitanje

Postavka

Dato je stablo formirano primenom statičkog Huffman-ovog algoritma. Implementirati funkciju FIND_CODES koja za takvo stablo na čiji koren pokazuje pokazivač root vraća simbole čiji su kodovi dužine tačno k.

Rešenje

FIND CODES(root, k)
if (root = nil) or (k0) then
    return nil
end_if
symbols = nil
node = nil
depth = 0
symb_node = nil
p = symbols
QUEUE_INIT(Q1)
QUEUE_INIT(Q2)
QUEUE_INSERT(Q1, root)
QUEUE_INSERT(Q2, 0)
while not QUEUE_EMPTY(Q1) do
    node = QUEUE_DELETE(Q1)
    depth = QUEUE_DELETE(Q2)
    if depth = k then
        if symbol(node) ≠ nil then
            symb_node = GETNODE
            value(symb_node) = symbol(node)
            if symbols = nil then
                symbols = p = symb_node
            else
                next(p) = symb_node
                p = next(p)
            end_if
        end_if
    else
        if left(node) ≠ nil then
            QUEUE_INSERT(Q1, left(node))
            QUEUE_INSERT(Q2, depth + 1)
        end_if
        if right(node) ≠ nil then
            QUEUE_INSERT(Q1, right(node))
            QUEUE_INSERT(Q2, depth + 1)
        end_if
    end_if
end_while
return symbols

5. zadatak

Postavka

Primenom algoritma dinamički Huffman kodirati poruku ABRAKADABRA, ukoliko su početni fiksni kodovi za slova A, B, R, K, D redom 000, 001, 010, 011 i 100. Proces kodiranja prikazati po koracima.

Rešenje

  • Krajnje transmitovano: A 0B 00R 0 100K 0 1100D 0 110 110 0
  • Krajnje kodirano: 000 0001 00010 0 100011 0 1100100 0 110 110 0
  • Krajnje stablo:
   11
  /  \
 A     6
 5   /   \
    2     4
   / \   / \
  1   K R   B
 / \  1 2   2
NYT D
 0  1

6. zadatak

Postavka

Precizno objasniti kako se iterativni algoritam za obilazak po inorder-u može modifikovati tako da se zadato stablo transformiše u povezano (threaded) stablo po istom obilasku.

Rešenje

Može se modifikovati tako što čuvamo pokazivač na prethodno obrađeni čvor (prev) i pre obrađivanja trenutnog čvora (P(next), gde je next trenutno obrađivani čvor) radimo sledeće:

if prev ≠ nil then
    if left(next) = nil then
        left(next) = prev
        lf(next) = 0
    end_if
    if right(prev) = nil then
        right(prev) = next
        rf(prev) = 0
    end_if
end_if
prev = next

7. zadatak

Postavka

U kakvom binarnom stablu interna dužina puta postiže maksimum za dati broj čvorova? Izvesti i objasniti izraz za izračunavanje maksimalne interne dužine puta u binarnom stablu sa n čvorova. Nacrtati primer takvog stabla sa 4 čvora i izračunati internu dužinu puta.

Rešenje

Interna dužina puta postiže maksimum u degenerisanom binarnom stablu u kojem ima jedan čvor po nivou, na primer (za n = 4):

      A
     /
    B
   /
  C
 /
D

Interna dužina puta je zbir dužina puteva od korena stabla do svakog internog čvora, što je u ovom slučaju . Možemo primetiti da je do svakog internog čvora putanja za jedan kraća od nivoa na kojem se nalazi i da ima za jedan manje puteva od broja čvorova iz čega dobijamo da je interna dužina puta za binarno stablo sa čvorova jednaka .

8. zadatak

Postavka

Na jednoj društvenoj mreži postoji simetrična relacija prijateljstva između korisnika i asimetrična relacija praćenja kod koje jedan korisnik prati aktivnosti drugog. Potrebno je posmatranu društvenu mrežu modelirati grafom.

  1. Predložiti odgovarajući tip grafa i detaljno opisati njegove osobine.
  2. Predložiti i obrazložiti odgovarajaću memorijsku reprezentaciju grafa, tako da se optimizuje određivanje ukupnog broja pratilaca nekog korisnika. Korisnikove aktivnosti mogu da prate i prijatelji i pratioci.
  3. Napisati pseudkod[sic] funkcije koja za zadatog korisnika vraća ukupan broj pratilaca.

Rešenje

U rešenju se pretpostavlja da se u postavci zadatka implicira da su prijatelji ujedno i pratioci.

Ovu mrežu je moguće modelirati usmerenim netežinskim grafom gde čvorovi označavaju korisnike a grane označavaju relacije praćenja, gde grana od čvora A do čvora B označava da korisnik A prati korisnika B. Optimalna reprezentacija grafa u ovom slučaju jeste preko inverzne liste susednosti, jer na taj način mora proći kroz tačno onoliko pratilaca koliki će broj biti vraćen na kraju, a ako se čuva dužina inverzne liste susednosti u zaglavlju onda je složenost algoritma konstantna.

FOLLOWERS(G, i)
followers = 0
p = IAL[i]
while' p ≠ nil do
    followers = followers + 1
    p = next(p)
end_while
return followers