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

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
м (Dodato rešenje osmog zadatka)
м (Замена начина истицања милокода.)
 
(Није приказано 17 међуизмена 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 ==
Ред 144: Ред 153:
=== Rešenje ===
=== Rešenje ===
* Krajnje transmitovano: '''A 0B 00R 0 100K 0 1100D 0 110 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
Ред 162: Ред 171:


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


== 7. zadatak ==
== 7. zadatak ==
Ред 194: Ред 207:
# 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.''
: ''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 B prati korisnika A. Optimalna reprezentacija grafa u ovom slučaju jeste preko 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 liste susednosti u zaglavlju onda je složenost algoritma konstantna.
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.
<u>FOLLOWERS(''G'', ''i'')</u>
{{Милокод|<nowiki>
''followers'' = 0
FOLLOWERS(G, i)
''p'' = ''e''[''i'']
followers = 0
'''while''' p ≠ nil ''do'''
p = IAL[i]
    ''followers'' = ''followers'' + 1
while' p ≠ nil do
    ''p'' = ''next''(''p'')
    followers = followers + 1
'''end_while'''
    p = next(p)
'''return''' ''followers''
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