<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sr">
	<id>https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=KockaBot</id>
	<title>SI Wiki - Кориснички доприноси [sr]</title>
	<link rel="self" type="application/atom+xml" href="https://siwiki.rs/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=KockaBot"/>
	<link rel="alternate" type="text/html" href="https://siwiki.rs/wiki/%D0%9F%D0%BE%D1%81%D0%B5%D0%B1%D0%BD%D0%BE:%D0%94%D0%BE%D0%BF%D1%80%D0%B8%D0%BD%D0%BE%D1%81%D0%B8/KockaBot"/>
	<updated>2026-06-04T02:15:15Z</updated>
	<subtitle>Кориснички доприноси</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2018&amp;diff=7816</id>
		<title>ОС1/Јун 2018</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%9E%D0%A11/%D0%88%D1%83%D0%BD_2018&amp;diff=7816"/>
		<updated>2024-09-13T00:09:21Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[http://os.etf.bg.ac.rs/OS1/rokovi/2018/jun/Jun%202018.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti razliku između pojmova &#039;&#039;proces&#039;&#039; i &#039;&#039;nit&#039;&#039; (engl. &#039;&#039;thread&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Proces je jedno izvršavanje programa sa jednim adresnim prostorom. Nit (&#039;&#039;thread&#039;&#039;) ili laki proces je tok kontrole koji teče uporedo sa drugim tokovima kontrole, ali koji deli virtuelni adresni prostor sa nekim drugim tokom ili tokovima kontrole.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem standardnih bibliotečnih operacija &amp;lt;code&amp;gt;setjmp&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;longjmp&amp;lt;/code&amp;gt;, implementirati operaciju &#039;&#039;wait&#039;&#039; na binarnom semaforu koji je realizovan klasom &amp;lt;code&amp;gt;Event&amp;lt;/code&amp;gt; poput one u školskom jezgru.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Event::wait() {&lt;br /&gt;
    if (val == 1) {&lt;br /&gt;
        val = 0;&lt;br /&gt;
    } else {&lt;br /&gt;
        if (setjmp(Thread::running-&amp;gt;context) == 0) {&lt;br /&gt;
            blocked.put(running);&lt;br /&gt;
            Thread::running = Scheduler::get();&lt;br /&gt;
            longjmp(Thread::running-&amp;gt;context, 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem sistemskih poziva &amp;lt;code&amp;gt;fork&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;, napisati funkciju &amp;lt;code&amp;gt;run&amp;lt;/code&amp;gt; koja kreira proces nad programom u fajlu sa zadatom putanjom i vraća negativnu vrednost u slučaju greške, a &amp;lt;code&amp;gt;pid&amp;lt;/code&amp;gt; kreiranog procesa u slučaju uspeha pri &amp;lt;code&amp;gt;fork&amp;lt;/code&amp;gt;. Ukoliko ne uspe &amp;lt;code&amp;gt;exec&amp;lt;/code&amp;gt;, kreirani proces-dete treba ugasiti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int run(char* path) {&lt;br /&gt;
    pid_t pid = fork();&lt;br /&gt;
    if (pid &amp;lt; 0) {&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    if (pid == 0) {&lt;br /&gt;
        int t = exec(path);&lt;br /&gt;
        if (t &amp;lt; 0) {&lt;br /&gt;
            exit(-2);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return pid;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dva procesa pristupaju kritičnoj sekciji. Dat je presudokod jednog od njih, koji bi trebalo da obezbedi međusobno isključenje uposlenim čekanjem (kod drugog procesa izgleda analogno). Da li ovo rešenje obezbeđuje međusobno isključenje? Da li ima neki problem (ako ima, koji)?&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
process P1&lt;br /&gt;
begin&lt;br /&gt;
    loop&lt;br /&gt;
        flag1 := true;&lt;br /&gt;
        while flag2 = true do null end;&lt;br /&gt;
        &amp;lt;critical section&amp;gt;&lt;br /&gt;
        flag1 := false;&lt;br /&gt;
        &amp;lt;non-critical section&amp;gt;&lt;br /&gt;
    end&lt;br /&gt;
end P1;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovo rešenje ne valja jer se dešava &#039;&#039;livelock&#039;&#039; odnosno oba procesa se međusobno zaključaju i ni jedan ni drugi se neće dalje izvršavati. To se desi kada proces P1 postavi &amp;lt;code&amp;gt;flag1&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a zatim se desi promena konteksta i P2 postavi &amp;lt;code&amp;gt;flag2&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za koju od ove dve tehnike, dinamičko učitavanje (&#039;&#039;dynamic loading&#039;&#039;) ili preklopi (&#039;&#039;overlays&#039;&#039;), se može očekivati duže izvršavanje istog programa u najgorem slučaju? Precizno obrazložiti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Duže vreme izvršavanja u najgorem slučaju se može očekivati kod preklopa jer će program stalno učitavati iz memorije iznova i iznova, dok će dinamičko učitavanje zauzeti više memorije, svaki potreban modul će učitati po jednom.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom sistemu primenjuje se &#039;&#039;worst-fit&#039;&#039; algoritam kontinualne alokacije memorije. Inicijalno je prostor veličine 256KB potpuno slobodan za alokaciju korisničkih procesa. Potom su različiti procesi zadavali sledeće zahteve (slovna oznaka označava proces koji je postavio zahtev, brojna oznaka označava veličinu alociranog prostora u KB, a minus označava gašenje procesa i oslobađanje njegove memorije): A64, B16, C128, D32, A-, E8, F32, B-&lt;br /&gt;
&lt;br /&gt;
Odgovoriti na sledeća pitanja koja se odnose na stanje memorije nakon ove sekvence zahteva: &lt;br /&gt;
# Koliko je ukupno slobodnih fragmenata?&lt;br /&gt;
# Kolika je veličina najmanjeg slobodnog fragmenta?&lt;br /&gt;
# Kolika je veličina najvećeg slobodnog fragmenta?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Jedno slovo označava 8KB prostora.&lt;br /&gt;
 AAAAAAAA------------------------&lt;br /&gt;
 AAAAAAAABB----------------------&lt;br /&gt;
 AAAAAAAABBCCCCCCCCCCCCCCCC------&lt;br /&gt;
 AAAAAAAABBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 --------BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 E-------BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 EFFFF---BBCCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
 EFFFF-----CCCCCCCCCCCCCCCCDDDD--&lt;br /&gt;
* Slobodnih fragmenata: 2&lt;br /&gt;
* Najmanji slobodan fragment: 16KB&lt;br /&gt;
* Najveći slobodan fragment: 40KB&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prilikom preslikavanja virtuelne adrese, procesor je generisao izuzetak zbog pokušaja upisa na tu adresu koji je u deskriptoru stranice označen kao zabranjen. Operativni sistem ipak neće ugasiti taj proces. Precizno objasniti zašto.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Neće ugasiti program jer se zapravo radi o tehnici &#039;&#039;copy-on-write&#039;&#039; odnosno kopiranja na upis. U ovoj tehnici, MMU vidi tu memoriju kao zabranjenu za upis. Prilikom generisanja greške, OS proverava da li je zabranjena, i kako vidi da zapravo nije nije, to znači da se radi o tehnici kopiranja na upis pa će operativni sistem kopirati stranicu i reći MMU da je dozvoljena za upis.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navesti tri usluge vezane za realno vreme koje operativni sistem može da nudi i predložiti i kratko objasniti funkcije – sistemske pozive za te usluge.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
# Informacija o tekućem realnom vremenu:&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;time_t time (time_t* tloc);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: Vraća broj sekundi koje su protekle od 1. 1. 1970. u 0 časova. Postoje i bibliotečke funkcije u &amp;lt;code&amp;gt;time.h&amp;lt;/code&amp;gt; koje vraćaju “kalendarsko” vreme, rastavljeno na datum i sat itd, a oslanjaju se na ovaj sistemski poziv: &amp;lt;code&amp;gt;asctime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ctime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gmtime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;localtime&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Suspenzija pozivajućeg procesa (“uspavljivanje”) za zadato vreme&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;unsigned int sleep (unsigned int seconds);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# Čekanje na događaje, uslove ili na sinhronizacione primitive, ali vremenski ograničeno (tzv. &#039;&#039;timeout&#039;&#039; kontrole); ako se proces ne deblokira u zadatom vremenu, biće deblokiran zbog isteka vremenske kontrole; npr. za semafore:&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; inline&amp;gt;int sem_timedwait (sem_t *sem, const struct timespec *abs_timeout);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako je tekući direktorijum nekog procesa &amp;lt;code&amp;gt;/a/b/c&amp;lt;/code&amp;gt;, koja je apsolutna putanja do fajla koji taj proces otvara davanjem putanje &amp;lt;code&amp;gt;d/../../e/f.txt&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Raščlanimo relativnu putanju na delove:&lt;br /&gt;
* &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;: idemo u direktorijum &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;, sada je putanja &amp;lt;code&amp;gt;/a/b/c/d&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; idemo jedan direktorijum iznad, sada je putanja &amp;lt;code&amp;gt;/a/b/c&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; idemo jedan direktorijum iznad, sada je putanja &amp;lt;code&amp;gt;/a/b&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; idemo u direktorijum &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt;, sada je putanja &amp;lt;code&amp;gt;/a/b/e&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;f.txt&amp;lt;/code&amp;gt; posećujemo fajl &amp;lt;code&amp;gt;f.txt&amp;lt;/code&amp;gt;, krajnja putanja je &amp;lt;code&amp;gt;/a/b/e/f.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Fajl sistem primenjuje ulančanu alokaciju, s tim da se i slobodni blokovi ulančavaju u listu. U strukturi FCB polje &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; sadrži broj prvog bloka sa sadržajem fajla, a polje &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; veličinu sadržaja. Funkcija jezgra &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt; prima kao argument broj prvog bloka u lancu blokova koje treba proglasiti slobodnim. Napisati funkciju jezgra &amp;lt;code&amp;gt;truncate&amp;lt;/code&amp;gt; koja briše sadržaj fajla na čiji &amp;lt;code&amp;gt;FCB&amp;lt;/code&amp;gt; ukazuje argument.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretpostavimo da &amp;lt;code&amp;gt;free_head&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;free_tail&amp;lt;/code&amp;gt; predstavljaju pokazivače na početak i kraj ulančane liste slobodnih blokova.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void truncate(FCB *f) {&lt;br /&gt;
    if (f-&amp;gt;head == NULL) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    int numOfBlocks = f-&amp;gt;size / BLOCK_SIZE, i = 0, cur = f-&amp;gt;head, tmp_head = f-&amp;gt;head, prev;&lt;br /&gt;
    while (i &amp;lt; numOfBlocks) {&lt;br /&gt;
        free(cur);&lt;br /&gt;
        prev = cur;&lt;br /&gt;
        cur = cur-&amp;gt;next;&lt;br /&gt;
        i++;&lt;br /&gt;
    }&lt;br /&gt;
    if (free_head == NULL) {&lt;br /&gt;
        free_head = tmp_head;&lt;br /&gt;
    } else {&lt;br /&gt;
        free_tail-&amp;gt;next = tmp_head;&lt;br /&gt;
    }&lt;br /&gt;
    free_tail = prev;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:ОС1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2020&amp;diff=7815</id>
		<title>АСП2/К3 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2020&amp;diff=7815"/>
		<updated>2024-09-13T00:09:18Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K3_1920.pdf Postavka na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Upotrebom tehnike objedinjenog ulančavanja implementirati funkciju DELETE_ENTRY koja treba da iz heš tabele (&#039;&#039;table&#039;&#039;) fizički ukloni prosledjeni&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; ključ (&#039;&#039;key&#039;&#039;) ukoliko on postoji. Tabela ima &#039;&#039;n&#039;&#039; ulaza, a funkcija treba da ažurira i index &#039;&#039;free&#039;&#039; tako da ne postoji slobodna lokacija sa većim indeksom.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvo tražimo lokaciju ključa za uklanjanje a zatim, ako je ključ pronađen, prevezujemo prethodnu posećenu zauzetu lokaciju, brišemo ključ iz tabele i ažuriramo pokazivač &#039;&#039;free&#039;&#039;.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DELETE ENTRY(table, n, key, free)&lt;br /&gt;
prev_adr = -1&lt;br /&gt;
adr = h(key)&lt;br /&gt;
while (adr ≠ -1) and (key(table[adr]) ≠ key) do&lt;br /&gt;
    prev_adr = adr&lt;br /&gt;
    adr = next(table[adr])&lt;br /&gt;
end_while&lt;br /&gt;
if adr ≠ -1 then&lt;br /&gt;
    if prev_adr ≠ -1 then&lt;br /&gt;
        next(table[prev_adr]) = next(table[adr])&lt;br /&gt;
    end_if&lt;br /&gt;
    key(table[adr]) = empty&lt;br /&gt;
    next(table[adr]) = -1&lt;br /&gt;
    if adr &amp;gt; free then&lt;br /&gt;
        free = adr&lt;br /&gt;
    end_if&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
Po novijoj verziji knjige profesora Mila V. Tomaševića pri objedinjenom ulančavanju bi trebalo da se na oslobođeno mesto prebacuje ključ sa kraja liste u kojoj se nalazio, i takav pristup se nalazi ispod:&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DELETE ENTRY(table, n, key, free)&lt;br /&gt;
prev_adr = -1&lt;br /&gt;
adr = h(key)&lt;br /&gt;
while (adr ≠ -1) and (key(table[adr]) ≠ key) do&lt;br /&gt;
    prev_adr = adr&lt;br /&gt;
    adr = next(table[adr])&lt;br /&gt;
end_while&lt;br /&gt;
if adr ≠ -1 then&lt;br /&gt;
    if next(table[adr]) = -1 then&lt;br /&gt;
        if prev_adr ≠ -1 then&lt;br /&gt;
            next(table[prev_adr]) = -1&lt;br /&gt;
        end_if&lt;br /&gt;
        key(table[adr]) = empty&lt;br /&gt;
        next(table[adr]) = -1&lt;br /&gt;
        if adr &amp;gt; free then&lt;br /&gt;
            free = adr&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        prev_adr = -1&lt;br /&gt;
        last_adr = adr&lt;br /&gt;
        while next(table[last_adr]) ≠ -1 do&lt;br /&gt;
            prev_adr = last_adr&lt;br /&gt;
            last_adr = next(table[last_adr])&lt;br /&gt;
        end_while&lt;br /&gt;
        next(table[prev_adr]) = -1&lt;br /&gt;
        key(table[adr]) = key(table[last_adr])&lt;br /&gt;
        key(table[last_adr]) = empty&lt;br /&gt;
        if last_adr &amp;gt; free then&lt;br /&gt;
            free = last_adr&lt;br /&gt;
        end_if&lt;br /&gt;
    end_if&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Radix exchange algoritam.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Prikazati prve tri iteracije algoritma radix exchange nad sledećom sekvencom 5-bitnih neoznačenih celobrojnih ključeva:&lt;br /&gt;
# Da li je algoritam stabilan? Obrazložiti ukratko.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvo odvajamo ključeve na bitove:&lt;br /&gt;
* 4 — 00100&lt;br /&gt;
* 7 — 00111&lt;br /&gt;
* 9 — 01001&lt;br /&gt;
* 10 — 01010&lt;br /&gt;
* 15 — 01111&lt;br /&gt;
* 16 — 10000&lt;br /&gt;
* 18 — 10010&lt;br /&gt;
* 23 — 10111&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Prve tri iteracije &#039;&#039;radix exchange&#039;&#039; algoritma nad sekvencom&lt;br /&gt;
! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 18 || 23 || 4 || 10 || 16 || 9 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 15 || 9 || 4 || 10 || 16 || 23 || 18&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 4 || 9 || 15 || 10 || 16 || 23 || 18&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 4 || 9 || 10 || 15 || 16 || 18 || 23&lt;br /&gt;
|}&lt;br /&gt;
Ovaj algoritam nije stabilan jer funkcioniše po sličnom principu kao &#039;&#039;quicksort&#039;&#039; zamena. Stabilnost algoritma podrazumeva da se jednaki elementi sortiraju po indeksu u originalnom poretku, a ovde se može desiti da se prilikom zamene element koji je bio prvi među jednakima prebaci na kraj.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se rastuće uređeni &#039;&#039;&#039;binarni hip&#039;&#039;&#039;, koji je dat u vidu niza ključeva &#039;&#039;heap&#039;&#039;. Napisati u pseudokodu efikasnu iterativnu funkciju koja menja vrednost zadatog ključa &#039;&#039;key&#039;&#039;, na zadatu vrednost &#039;&#039;new_key&#039;&#039;. Poznato je da hip ima &#039;&#039;n&#039;&#039; elemenata.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Algoritam prvo pronalazi ključ u hipu iterativnim obilaskom niza (ne postoji efikasnija tehnika od te jer hip ne daje nikakve garancije da će se dati element naći u levom ili desnom podstablu).&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
HEAP CHANGE(heap, n, key, new_key)&lt;br /&gt;
pos = -1&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    if heap[i] = key then&lt;br /&gt;
        pos = i&lt;br /&gt;
        break&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
if pos = -1 then&lt;br /&gt;
    ERROR(Ključ nije u hipu)&lt;br /&gt;
end_if&lt;br /&gt;
heap[pos] = new_key&lt;br /&gt;
parent_pos = pos / 2&lt;br /&gt;
child_pos_1 = pos * 2&lt;br /&gt;
child_pos_2 = pos * 2 + 1&lt;br /&gt;
if (parent_pos &amp;gt; 0) and (heap[parent_pos] &amp;gt; heap[pos]) then&lt;br /&gt;
    while (parent_pos &amp;gt; 0) and (heap[parent_pos] &amp;gt; heap[pos]) do&lt;br /&gt;
        heap[pos] = heap[parent_pos]&lt;br /&gt;
        heap[parent_pos] = new_key&lt;br /&gt;
        pos = parent_pos&lt;br /&gt;
        parent_pos = pos / 2&lt;br /&gt;
    end_while&lt;br /&gt;
else if ((child_pos_1 ≤ n) and (heap[child_pos_1] &amp;lt; heap[pos])) or ((child_pos_2 ≤ n) and (heap[child_pos_2] &amp;lt; heap[pos])) then&lt;br /&gt;
    while ((child_pos_1 ≤ n) and (heap[child_pos_1] &amp;lt; heap[pos])) or ((child_pos_2 ≤ n) and (heap[child_pos_2] &amp;lt; heap[pos])) do&lt;br /&gt;
        if (child_pos_1 ≤ n) and (heap[child_pos_2] &amp;lt; heap[child_pos_1] &amp;lt; heap[pos]) then&lt;br /&gt;
            heap[pos] = heap[child_pos_1]&lt;br /&gt;
            heap[child_pos_1] = new_key&lt;br /&gt;
            pos = child_pos_1&lt;br /&gt;
        else&lt;br /&gt;
            heap[pos] = heap[child_pos_2]&lt;br /&gt;
            heap[child_pos_2] = new_key&lt;br /&gt;
            pos = child_pos_2&lt;br /&gt;
        end_if&lt;br /&gt;
        child_pos_1 = pos * 2&lt;br /&gt;
        child_pos_2 = pos * 2 + 1&lt;br /&gt;
    end_while&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa 7 ulaza primenom heš funkcije h&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt;(K) = K mod 7. Za razrešavanje kolizija se koristi tehnika kvadratnog pretraživanja. U tabelu se umeću redom ključevi 38, 31, 10, 56, 21. Odrediti prosečan broj pristupa prilikom uspešnog i neuspešnog traženja i verovatnoću popunjavanja praznih ulaza, pod pretpostavkom da su svi ključevi jednako verovatni.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovaj zadatak je rešen na [https://rti.etf.bg.ac.rs/rti/ri3sp/materijali/si2asp2/09_Hesiranje.ppt prezentaciji iz heširanja] na stranici predmeta.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Popunjena heš tabela&lt;br /&gt;
| 0 || 10&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 56&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 21&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 38&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 31&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Ispitni nizovi za kvadratno pretraživanje&lt;br /&gt;
! i / K % 7 !! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6&lt;br /&gt;
|-&lt;br /&gt;
! 0&lt;br /&gt;
| 0 || 1 || 2 || 3 || 4 || 5 || 6&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
| 1 || 2 || 3 || 4 || 5 || 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| 4 || 5 || 6 || 0 || 1 || 2 || 3&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| 2 || 3 || 4 || 5 || 6 || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| 2 || 3 || 4 || 5 || 6 || 0 || 1&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| 4 || 5 || 6 || 0 || 1 || 2 || 3&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| 1 || 2 || 3 || 4 || 5 || 6 || 0&lt;br /&gt;
|}&lt;br /&gt;
* Umetanje:&lt;br /&gt;
** 38 % 7 = 3 (1 pristup)&lt;br /&gt;
** 31 % 7 = 3 (2 pristupa)&lt;br /&gt;
*** (3 + 1*1) % 7 = 4&lt;br /&gt;
** 10 % 7 = 3 (3 pristupa)&lt;br /&gt;
*** (3 + 1*1) % 7 = 4&lt;br /&gt;
*** (3 + 2*2) % 7 = 0&lt;br /&gt;
** 56 % 7 = 0 (2 pristupa)&lt;br /&gt;
*** (0 + 1*1) % 7 = 1&lt;br /&gt;
** 21 % 7 = 0 (4 pristupa)&lt;br /&gt;
*** (0 + 1*1) % 7 = 1&lt;br /&gt;
*** (0 + 2*2) % 7 = 4&lt;br /&gt;
*** (0 + 3*3) % 7 = 2&lt;br /&gt;
* Prosečan broj uspešnih pristupa: &amp;lt;math&amp;gt;P_u = \frac{1 + 2 + 3 + 2 + 4}{5} = \frac{12}{5} = 2.4&amp;lt;/math&amp;gt;&lt;br /&gt;
* Prosečan broj neuspešnih pristupa: &amp;lt;math&amp;gt;P_nu = 1 + \frac{5}{7} + \frac{5 \cdot 4}{7 \cdot 6} + \frac{5 \cdot 4 \cdot 3}{7 \cdot 6 \cdot 5} + \frac{5 \cdot 4 \cdot 3 \cdot 2}{7 \cdot 6 \cdot 5 \cdot 4} + \frac{5 \cdot 4 \cdot 3 \cdot 2 \cdot 1}{7 \cdot 6 \cdot 5 \cdot 4 \cdot 3} =&amp;lt;/math&amp;gt;&lt;br /&gt;
*: &amp;lt;math&amp;gt;= 1 + \frac{5}{7} + \frac{10}{21} + \frac{2}{7} + \frac{1}{7} + \frac{1}{21} = \frac{8}{3} \approx 2.67&amp;lt;/math&amp;gt;&lt;br /&gt;
* Verovatnoća popunjavanja:&lt;br /&gt;
** 5: &amp;lt;math&amp;gt;\frac{0 + 1 + 0 + 1 + 1 + 1 + 0}{7} = \frac{4}{7}&amp;lt;/math&amp;gt;&lt;br /&gt;
** 6: &amp;lt;math&amp;gt;\frac{0 + 0 + 1 + 0 + 0 + 0 + 1}{7} = \frac{2}{7}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prikazati izgled &#039;&#039;&#039;binomnog hipa&#039;&#039;&#039; nakon svake izmene, ukoliko se prvo obriše minimum, pa se nakon toga dodaju ključevi 2, 32, 4 i nakon toga ponovo obriše minimum.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U originalnoj postavci je umesto broja 19 stajao broj 9. Hip tada ne bi bio validan, tako da se u rešenju smatra da je tu broj 19.&lt;br /&gt;
&lt;br /&gt;
Ispod je dato konačno rešenje zadatka, a koraci se mogu simulirati u [https://www.cs.usfca.edu/~galles/visualization/BinomialQueue.html simulatoru binomnih hipova,] redom umetanjem ključeva 19, 41, 15, 29, 17, 25, 3, 10 i 14, pa zatim izvršavati zadate operacije.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery class=&amp;quot;transparent-svg&amp;quot;&amp;gt;&lt;br /&gt;
  ASP2 K3 2020 zadatak 5 hip postavka.svg | Ispravljena postavka zadatka&lt;br /&gt;
  ASP2 K3 2020 zadatak 5 hip rešenje.svg  | Konačni izgleda hipa&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sekvenca ključeva: 159, 57, 103, 7, 74, 95, 8, 101, 179, 45, 303, 42, 219. Prikazati rad &#039;&#039;shell sort&#039;&#039; algoritma po koracima. Navesti korišćenu sekvencu inkremenata i obrazložiti izbor.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Data sekvenca ima 13 ključeva, i ono što inkrementi u &#039;&#039;shell sort&#039;&#039; algoritmu treba idealno da postignu jeste mešanje ključeva između &amp;quot;grupa&amp;quot;, te se zato biraju uzajamno prosti inkrementi 7, 5, 3, 2 i 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Koraci &#039;&#039;shell sort&#039;&#039; algoritma&lt;br /&gt;
! Inkrement !! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 !! 8 !! 9 !! 10 !! 11 !! 12&lt;br /&gt;
|-&lt;br /&gt;
! Početak&lt;br /&gt;
| 159 || 57 || 103 || 7 || 74 || 95 || 8 || 101 || 179 || 45 || 303 || 42 || 219&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| 101 || 57 || 45 || 7 || 42 || 95 || 8 || 159 || 179 || 103 || 303 || 74 || 219&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| 95 || 8 || 45 || 7 || 42 || 101 || 57 || 159 || 179 || 103 || 303 || 74 || 219&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| 7 || 8 || 45 || 57 || 42 || 101 || 95 || 159 || 74 || 103 || 303 || 179 || 219&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| 7 || 8 || 45 || 57 || 42 || 74 || 95 || 159 || 101 || 103 || 303 || 179 || 219&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| 7 || 8 || 42 || 57 || 45 || 74 || 95 || 103 || 101 || 159 || 219 || 179 || 303&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
| 7 || 8 || 42 || 45 || 57 || 74 || 95 || 101 || 103 || 159 || 179 || 219 || 303&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se kod spoljašnjeg heširanja koristi tehnika dinamičkog heširanja. Heš tabela se sastoji od 4 baketa kapaciteta b = 2. Za heš funkciju se koriste viši bitovi heš funkcije K &#039;&#039;mod&#039;&#039; 8. Neka se u tabelu umeću redom ključevi 37, 33, 15, 24, 37, 46, 41 i 54. Ilustrovati stanje tabele nakon svakog razrešenja kolizije pri umetanju i u završnom stanju.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
 [  00  |  01  |  10  |  11  ]&lt;br /&gt;
                   |&lt;br /&gt;
                [37   ]&lt;br /&gt;
&lt;br /&gt;
 [  00  |  01  |  10  |  11  ]&lt;br /&gt;
    |              |&lt;br /&gt;
 [33   ]        [37   ]&lt;br /&gt;
&lt;br /&gt;
 [  00  |  01  |  10  |  11  ]&lt;br /&gt;
    |              |      |&lt;br /&gt;
 [33   ]        [37   ][15   ]&lt;br /&gt;
&lt;br /&gt;
 [  00  |  01  |  10  |  11  ]&lt;br /&gt;
    |              |      |&lt;br /&gt;
 [33 24]        [37   ][15   ]&lt;br /&gt;
&lt;br /&gt;
 [  00  |  01  |  10  |  11  ]&lt;br /&gt;
    |              |      |&lt;br /&gt;
 [33 24]        [37 37][15   ]&lt;br /&gt;
&lt;br /&gt;
 [  00  |  01  |  10  |  11  ]&lt;br /&gt;
    |              |      |&lt;br /&gt;
 [33 24]        [37 37][15 46]&lt;br /&gt;
&lt;br /&gt;
     [  00  |  01  |  10  |  11  ]&lt;br /&gt;
        |             |      |&lt;br /&gt;
      /   \           |      |&lt;br /&gt;
    |      |          |      |&lt;br /&gt;
 [24   ][33 41]    [37 37][15 46]&lt;br /&gt;
 000... 001...&lt;br /&gt;
&lt;br /&gt;
     [  00  |  01  |  10  |  11  ]&lt;br /&gt;
        |             |      |&lt;br /&gt;
      /   \         /      /   \&lt;br /&gt;
    |      |      |      |      |&lt;br /&gt;
 [24   ][33 41][37 37][46 54][15   ]&lt;br /&gt;
 000... 001...        110... 111...&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka je dat niz celih brojeva &#039;&#039;arr&#039;&#039; dužine &#039;&#039;n&#039;&#039; čiji se elementi nalaze u opsegu od 0 do &#039;&#039;k&#039;&#039;-1. Napisati u pseudokodu iterativnu funkciju koja pronalazi element koji se najčešće pojavljuje u nizu. Ukoliko ima više takvih elemenata dovoljno je pronaći jedan. Funkcija treba da ima što je moguće bolju vremensku i prostornu složenost. Dozvoljeno je modifikovati polazni niz.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovde su dva rešenja pogodna:&lt;br /&gt;
* Pošto nam je dat opseg vrednosti u nizu, može se koristiti &#039;&#039;counting sort&#039;&#039; kako bi se u vremenskoj složenosti &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt; i prostornoj složenosti &amp;lt;math&amp;gt;\mathcal{O}(k)&amp;lt;/math&amp;gt; pronašla vrednost koja se najviše ponavlja&lt;br /&gt;
* Pošto nam je dato da se polazni niz može modifikovati, može se koristiti &#039;&#039;heapsort&#039;&#039; kako bi se u vremenskoj složenosti &amp;lt;math&amp;gt;\mathcal{O}(n \log n)&amp;lt;/math&amp;gt; i prostornoj složenosti &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; pronašla tražena vrednost&lt;br /&gt;
Ispod je dato rešenje pomoću &#039;&#039;counting sort&#039;&#039;.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND MAX REP(arr, n, k)&lt;br /&gt;
rep_max = 0&lt;br /&gt;
rep_elem = 0&lt;br /&gt;
for i = 0 to k-1 do&lt;br /&gt;
    c[i] = 0&lt;br /&gt;
end_for&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    c[arr[i]] = c[arr[i]] + 1&lt;br /&gt;
    if c[arr[i]] &amp;gt; rep_max then&lt;br /&gt;
        rep_max = c[arr[i]]&lt;br /&gt;
        rep_elem = arr[i]&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
return rep_elem&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2019&amp;diff=7814</id>
		<title>АСП2/К3 2019</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2019&amp;diff=7814"/>
		<updated>2024-09-13T00:09:17Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K3_1819.pdf Postavka sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Upotrebom metode heširanja implementirati funkciju FIND_NUM_OF_PAIRS koja treba da pronađe ukupan broj parova celobrojnih vrednosti u zadatom nizu &#039;&#039;arr&#039;&#039; koji u sumi po modulu &#039;&#039;n&#039;&#039; daju vrednost &#039;&#039;k&#039;&#039; koja predstavlja parametar funkcije. Za realizaciju ove funkcije treba koristiti metodu odvojenog ulančavanja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovde nema potrebe koristiti bilo kakvo ulančavanje jer je &#039;&#039;counting sort&#039;&#039; dovoljan da izbroji ključeve koji daju neku vrednost po modulu &#039;&#039;n&#039;&#039; a zatim izmnoži izbrojano. Na primer, za &#039;&#039;n = 7&#039;&#039; i &#039;&#039;k = 1&#039;&#039; na sumu se redom dodaju:&lt;br /&gt;
# &amp;lt;math&amp;gt;\frac{C[0] \cdot C[1]}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\frac{C[1] \cdot C[0]}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\frac{C[2] \cdot C[6]}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\frac{C[3] \cdot C[5]}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\frac{C[4] \cdot (C[4] - 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\frac{C[5] \cdot C[3]}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;\frac{C[6] \cdot C[2]}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND NUM OF PAIRS(arr, n, k)&lt;br /&gt;
for i = 0 to n-1 do&lt;br /&gt;
    C[i] = nil&lt;br /&gt;
end_for&lt;br /&gt;
for i = 1 to LENGTH(arr) do&lt;br /&gt;
    adr = arr[i] mod n&lt;br /&gt;
    if C[adr] = nil then&lt;br /&gt;
        C[adr] = GETNODE&lt;br /&gt;
        value(C[adr]) = arr[i]&lt;br /&gt;
        next(C[adr]) = nil&lt;br /&gt;
    else&lt;br /&gt;
        curr = next(C[adr])&lt;br /&gt;
        prev = C[adr]&lt;br /&gt;
        while curr ≠ nil do&lt;br /&gt;
            prev = curr&lt;br /&gt;
            curr = next(curr)&lt;br /&gt;
        end_while&lt;br /&gt;
        next(prev) = GETNODE&lt;br /&gt;
        value(next(prev)) = arr[i]&lt;br /&gt;
        next(next(prev)) = nil&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
count = 0&lt;br /&gt;
for i = 0 to n-1 do&lt;br /&gt;
    node_count_1 = 0&lt;br /&gt;
    curr = C[i]&lt;br /&gt;
    while curr ≠ nil do&lt;br /&gt;
        node_count_1 = node_count_1 + 1&lt;br /&gt;
        curr = next(curr)&lt;br /&gt;
    end_while&lt;br /&gt;
    node_count_2 = 0&lt;br /&gt;
    j = (k - i) mod n&lt;br /&gt;
    curr = C[j]&lt;br /&gt;
    while curr ≠ nil do&lt;br /&gt;
        node_count_2 = node_count_2 + 1&lt;br /&gt;
        curr = next(curr)&lt;br /&gt;
    end_while&lt;br /&gt;
    if i = j then&lt;br /&gt;
        count = count + node_count_1 * (node_count_1 - 1) / 2&lt;br /&gt;
    else&lt;br /&gt;
        count = count + node_count_1 * node_count_2 / 2&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
for i = 0 to n-1 do&lt;br /&gt;
    curr = C[i]&lt;br /&gt;
    while curr ≠ nil do&lt;br /&gt;
        tmp = curr&lt;br /&gt;
        curr = next(curr)&lt;br /&gt;
        FREENODE(tmp)&lt;br /&gt;
    end_while&lt;br /&gt;
end_for&lt;br /&gt;
return count&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prikazati izgled &#039;&#039;&#039;binomnog hipa&#039;&#039;&#039; nakon svake izmene, ukoliko se umeću ključevi 19, 11, 25 i nakon toga obriše minimum.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ispod je dato konačno rešenje zadatka, a koraci se mogu simulirati u [https://www.cs.usfca.edu/~galles/visualization/BinomialQueue.html simulatoru binomnih hipova,] redom umetanjem ključeva 14, 27, 12, 23, 15, 22, 5, 9 i 17, pa zatim izvršavati zadate operacije.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery class=&amp;quot;transparent-svg&amp;quot;&amp;gt;&lt;br /&gt;
  ASP2 K3 2019 zadatak 2 hip postavka.svg | Postavka zadatka&lt;br /&gt;
  ASP2 K3 2019 zadatak 2 hip rešenje.svg  | Konačni izgleda hipa&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sekvenca ključeva: 27, 25, 14, 34, 7, 1, 5, 193, 33, 41, 73, 124. Prikazati rad &#039;&#039;radix sort&#039;&#039; algoritma po koracima.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Prvi korak &#039;&#039;radix sort&#039;&#039; algoritma&lt;br /&gt;
! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 !! 8 !! 9&lt;br /&gt;
|-&lt;br /&gt;
| || 1  || || 193 || 14  || 25 || || 27 || ||&lt;br /&gt;
|-&lt;br /&gt;
| || 41 || || 33  || 34  || 5  || || 7  || ||&lt;br /&gt;
|-&lt;br /&gt;
| ||    || || 73  || 124 ||    || ||    || ||&lt;br /&gt;
|}&lt;br /&gt;
Dobijena sekvenca posle prvog koraka: 1, 41, 193, 33, 73, 14, 34, 124, 25, 5, 27, 7&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Drugi korak &#039;&#039;radix sort&#039;&#039; algoritma&lt;br /&gt;
! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 !! 8 !! 9&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 14 || 124 || 33 || 41 || || || 73 || || 193&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||    || 25  || 34 ||    || || ||    || ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||    || 27  ||    ||    || || ||    || ||&lt;br /&gt;
|}&lt;br /&gt;
Dobijena sekvenca posle drugog koraka: 1, 5, 7, 14, 124, 25, 27, 33, 34, 41, 73, 193.&lt;br /&gt;
&lt;br /&gt;
Treći korak neće biti prikazan jer će u suštini samo prve dve kolone biti jako popunjene, ali se na kraju dobija poredak: 1, 5, 7, 14, 25, 27, 33, 34, 41, 73, 124, 193.&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa 10 ulaza primenom heš funkcije h&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt;(K) = K mod &#039;&#039;10&#039;&#039;. Za razrešavanje kolizija se koristi metoda objedinjenog ulančavanja. Prikazati popunjavanje date tabele nakon umetanja svakog od sledećih ključeva: 37, 41, 18, 16, 12. Nakon svih umetanja, odrediti verovatnoću popunjavanja praznih ulaza, pod pretpostavkom da su svi ključevi jednako verovatni.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela iz postavke zadatka&lt;br /&gt;
! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 !! 8 !! 9&lt;br /&gt;
|-&lt;br /&gt;
|    || 11 ||    ||    ||    ||    ||    ||    || 21  || 29&lt;br /&gt;
|-&lt;br /&gt;
| -1 || 8  || -1 || -1 || -1 || -1 || -1 || -1 || -1  || -1&lt;br /&gt;
|-&lt;br /&gt;
|    ||    ||    ||    ||    ||    ||    ||    || free ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela nakon umetanja 37&lt;br /&gt;
! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 !! 8 !! 9&lt;br /&gt;
|-&lt;br /&gt;
|    || 11 ||    ||    ||    ||    ||    || 37 || 21  || 29&lt;br /&gt;
|-&lt;br /&gt;
| -1 || 8  || -1 || -1 || -1 || -1 || -1 || -1 || -1  || -1&lt;br /&gt;
|-&lt;br /&gt;
|    ||    ||    ||    ||    ||    ||    ||    || free ||&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela nakon umetanja 41&lt;br /&gt;
! 0  !! 1  !! 2  !! 3  !! 4  !! 5  !! 6    !! 7  !! 8  !! 9&lt;br /&gt;
|-&lt;br /&gt;
|    || 11 ||    ||    ||    ||    || 41   || 37 || 21 || 29&lt;br /&gt;
|-&lt;br /&gt;
| -1 || 8  || -1 || -1 || -1 || -1 || -1   || -1 || 6  || -1&lt;br /&gt;
|-&lt;br /&gt;
|    ||    ||    ||    ||    ||    || free ||    ||    ||&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela nakon umetanja 18&lt;br /&gt;
! 0  !! 1  !! 2  !! 3  !! 4  !! 5    !! 6  !! 7  !! 8  !! 9&lt;br /&gt;
|-&lt;br /&gt;
|    || 11 ||    ||    ||    || 18   || 41 || 37 || 21 || 29&lt;br /&gt;
|-&lt;br /&gt;
| -1 || 8  || -1 || -1 || -1 || -1   || 5  || -1 || 6  || -1&lt;br /&gt;
|-&lt;br /&gt;
|    ||    ||    ||    ||    || free ||    ||    ||    ||&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela nakon umetanja 16&lt;br /&gt;
! 0  !! 1  !! 2  !! 3  !! 4    !! 5  !! 6  !! 7  !! 8  !! 9&lt;br /&gt;
|-&lt;br /&gt;
|    || 11 ||    ||    || 16   || 18 || 41 || 37 || 21 || 29&lt;br /&gt;
|-&lt;br /&gt;
| -1 || 8  || -1 || -1 || -1   || 4  || 5  || -1 || 6  || -1&lt;br /&gt;
|-&lt;br /&gt;
|    ||    ||    ||    || free ||    ||    ||    ||    ||&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela nakon umetanja 12&lt;br /&gt;
! 0  !! 1  !! 2  !! 3  !! 4    !! 5  !! 6  !! 7  !! 8  !! 9&lt;br /&gt;
|-&lt;br /&gt;
|    || 11 || 12 ||    || 16   || 18 || 41 || 37 || 21 || 29&lt;br /&gt;
|-&lt;br /&gt;
| -1 || 8  || -1 || -1 || -1   || 4  || 5  || -1 || 6  || -1&lt;br /&gt;
|-&lt;br /&gt;
|    ||    ||    ||    || free ||    ||    ||    ||    ||&lt;br /&gt;
|}&lt;br /&gt;
Verovatnoća popunjavanja ulaza 0 je &amp;lt;math&amp;gt;\frac{1}{10}&amp;lt;/math&amp;gt;, jer se on popunjava samo ukoliko se umeće broj kongruentan sa 0 po modulu 10. Verovatnoća popunjavanja ulaza 3 je, stoga, &amp;lt;math&amp;gt;\frac{9}{10}&amp;lt;/math&amp;gt;, jer se on popunjava za bilo koji drugi moduo.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Priloženi pseudokod prikazuje algoritam za uređivanje špila karata u jednoj kartaškoj igri. U igri se koristi špil od po 8 karata za svaki od 4 znaka (ukupno 32). Algoritam treba da grupiše karte istog znaka, pri čemu karte istog znaka sortira prema rastućoj vrednosti. Uočiti i objasniti greške ili nedostatke priloženog algoritma i napisati u pseudokodu ispravnu implementaciju u skladu sa zahtevima. Polje &#039;&#039;val&#039;&#039; predstavlja vrednost karte, a polje &#039;&#039;sign&#039;&#039; njen znak.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 2 to 32 do&lt;br /&gt;
  k = cards[i]&lt;br /&gt;
  j = i-1&lt;br /&gt;
  while(j&amp;gt;0 and cards[j].val&amp;gt;k.val) do&lt;br /&gt;
    cards[j+1] = cards[j]&lt;br /&gt;
    j = j-1&lt;br /&gt;
  end_while&lt;br /&gt;
  cards[j] = k&lt;br /&gt;
end_for&lt;br /&gt;
for i = 1 to 4 do&lt;br /&gt;
  c[i] = 0&lt;br /&gt;
end_for&lt;br /&gt;
for j = 1 to n do&lt;br /&gt;
  c[cards[j].sign] = c[cards[j].sign]+1&lt;br /&gt;
end_for&lt;br /&gt;
for i = 3 downto 1 do&lt;br /&gt;
  c[i] = c[i+1] - c[i]&lt;br /&gt;
end_for&lt;br /&gt;
for j = 1 to n do&lt;br /&gt;
  b[c[cards[j].sign]] = cards[j]&lt;br /&gt;
  c[cards[j].sign] = c[cards[j].sign]-1&lt;br /&gt;
end_for&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sledeće greške su uočene:&lt;br /&gt;
* Niz &amp;lt;code&amp;gt;cards&amp;lt;/code&amp;gt; počinje od 1 a na kraju &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; petlje se postavlja &amp;lt;code&amp;gt;cards[j]&amp;lt;/code&amp;gt; na vrednost &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, s tim što je jedan od uslova petlje &amp;lt;code&amp;gt;j &amp;gt; 0&amp;lt;/code&amp;gt;. Ovde se mora prepraviti na &amp;lt;code&amp;gt;cards[j + 1]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;Counting sort&#039;&#039; implementacija za sortiranje po znaku ne radi.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SORT(cards)&lt;br /&gt;
for i = 2 to 32 do&lt;br /&gt;
    k = cards[i]&lt;br /&gt;
    j = i - 1&lt;br /&gt;
    while (j &amp;gt; 0) and (val(cards[j]) &amp;gt; val(k)) do&lt;br /&gt;
        cards[j + 1] = cards[j]&lt;br /&gt;
        j = j - 1&lt;br /&gt;
    end_while&lt;br /&gt;
    cards[j + 1] = k&lt;br /&gt;
end_for&lt;br /&gt;
for i = 1 to 4 do&lt;br /&gt;
    c[i] = 0&lt;br /&gt;
end_for&lt;br /&gt;
for j = 1 to n do&lt;br /&gt;
    c[sign(cards[j])] = c[sign(cards[j])] + 1&lt;br /&gt;
end_for&lt;br /&gt;
for i = 2 to 4 do&lt;br /&gt;
    c[i] = c[i-1] + c[i]&lt;br /&gt;
end_for&lt;br /&gt;
for j = n downto 1 do&lt;br /&gt;
    b[c[sign(cards[j])]] = cards[j]&lt;br /&gt;
    c[sign(cards[j])] = c[sign(cards[j])] - 1&lt;br /&gt;
end_for&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koristeći ideju &#039;&#039;quick sort&#039;&#039; algoritma, napisati u pseudokodu funkciju koja vraća &#039;&#039;k&#039;&#039;-ti najmanji element u zadatom nizu celih brojeva &#039;&#039;arr&#039;&#039;. Prilikom izbora &#039;&#039;pivot&#039;&#039;-a, koristiti medijanu od tri pogodno izabrane vrednosti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
QUICK SELECT(arr, k)&lt;br /&gt;
min = FIND(arr, 1, n, k)&lt;br /&gt;
return min&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND(a, low, high, k)&lt;br /&gt;
j = PARTITION(a, low, high)&lt;br /&gt;
i = low + k - 1&lt;br /&gt;
if i = j then&lt;br /&gt;
    return a[i]&lt;br /&gt;
end_if&lt;br /&gt;
if j &amp;gt; i then&lt;br /&gt;
    return FIND(a, low, j - 1, k)&lt;br /&gt;
else&lt;br /&gt;
    return FIND(a, j + 1, high, k - j)&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PARTITION(a, down, up)&lt;br /&gt;
i = down&lt;br /&gt;
j = up&lt;br /&gt;
pivot_pos = MEDIAN(a[i], i, a[j], j, a[(i + j) / 2], (i + j) / 2)&lt;br /&gt;
pivot = a[pivot_pos]&lt;br /&gt;
while i &amp;lt; j do&lt;br /&gt;
    while (a[i] ≤ pivot) and (i &amp;lt; j) do&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end_while&lt;br /&gt;
    while a[j] &amp;gt; pivot do&lt;br /&gt;
        j = j - 1&lt;br /&gt;
    end_while&lt;br /&gt;
    if i &amp;lt; j then&lt;br /&gt;
        if j == pivot_pos then&lt;br /&gt;
            pivot_pos = i&lt;br /&gt;
        end_if&lt;br /&gt;
        a[i] ↔ a[j]&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
a[pivot_pos] = a[j]&lt;br /&gt;
a[j] = pivot&lt;br /&gt;
return j&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
MEDIAN(a, pos_a, b, pos_b, c, pos_c)&lt;br /&gt;
if (a &amp;gt; b) xor (a &amp;gt; c) then&lt;br /&gt;
    return pos_a&lt;br /&gt;
else if (b &amp;lt; a) xor (b &amp;lt; c) then&lt;br /&gt;
    return pos_b&lt;br /&gt;
else&lt;br /&gt;
    return pos_c&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa 9 ulaza primenom heš funkcije hp(K)=K mod 9. Za razrešavanje kolizija se koristi metoda linearnog pretraživanja sa korakom 2. Definisati pojam primarnog i sekundarnog grupisanja, a zatim na primeru delimično popunjene tabele sa slike, ilustrovati jedan scenario umetanja kod kojeg se dešava primarno grupisanje i jedan scenario umetanja kod kojeg se dešava sekundarno grupisanje.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela iz postavke zadatka&lt;br /&gt;
! 0&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| 8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sekundarno grupisanje je kada heš funkcija za dva različita ključa vraća istu matičnu adresu, pa su im i ispitni nizovi jednaki. Kada umetnemo ključ 18, dobijamo sekundarno grupisanje:&lt;br /&gt;
* 18 % 9 = 0 (ovde se desilo sekundarno grupisanje, jer ključevi 27 i 18 imaju istu matičnu adresu 0)&lt;br /&gt;
** (0 + 2) % 9 = 2 (ovde se desilo primarno grupisanje, jer se ispitni niz po modulu 0 i ispitni niz po modulu 2 ovde preklapaju)&lt;br /&gt;
** (2 + 2) % 9 = 4&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela nakon umetanja ključa 18&lt;br /&gt;
! 0&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| 8&lt;br /&gt;
|}&lt;br /&gt;
Primarno grupisanje je kada se dva ispitna niza od različitih matičnih adresa preklope. Ta pojava se takođe može ilustrovati na primeru umetanja ključa 20:&lt;br /&gt;
* 20 % 9 = 2 (ovde se desilo sekundarno grupisanje, jer ključevi 11 i 20 imaju istu matičnu adresu 2)&lt;br /&gt;
** (2 + 2) % 9 = 4 (ovde se desilo primarno grupisanje, jer se ispitni nizovi po modulu 2 i po modulu 0 ponovo preklapaju)&lt;br /&gt;
** (4 + 2) % 9 = 6&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela nakon umetanja ključa 20&lt;br /&gt;
! 0&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| 8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se kod spoljašnjeg heširanja koristi heš tabela sa 4 baketa, koji imaju kapacitet b = 3. Za heš funkciju se koristi metod deljenja &#039;&#039;K mod 4&#039;&#039;, a za razrešavanje kolizije linearno pretraživanje. Neka se pri brisanju koristi metod selektivnog pomeranja (analogno kao kod unutrašnjeg heširanja). U tabelu treba umetnuti ključeve 60, 18, 23, 50, 47, 34, 82, 14, 67 i 38, a zatim brisati ključeve 50, 47, 23 i 34. Prikazati izgled tabele nakon svakog razrešenja kolizije pri umetanju, kao nakon svakog brisanja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Konačan izgled heš tabele je:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 60 !!  !!  !!  !!  !!  !! 14 !! 18 !! 82 !! 38 !! 67 !!  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2018&amp;diff=7813</id>
		<title>АСП2/К3 2018</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2018&amp;diff=7813"/>
		<updated>2024-09-13T00:09:15Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K3_1718.pdf Postavka zadataka na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prikazati izgled &#039;&#039;&#039;binarnog hipa&#039;&#039;&#039; nakon uklanjanja minimalnog ključa i nakon umetanja ključeva 9 i 30.&lt;br /&gt;
          5&lt;br /&gt;
        /   \&lt;br /&gt;
      10      7&lt;br /&gt;
     /  \    / \&lt;br /&gt;
    47  32  12 31&lt;br /&gt;
   /&lt;br /&gt;
 54&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Nakon uklanjanja minimalnog ključa:&lt;br /&gt;
       7&lt;br /&gt;
     /   \&lt;br /&gt;
   10      12&lt;br /&gt;
  /  \    /  \&lt;br /&gt;
 47  32  54  31&lt;br /&gt;
Nakon umetanja ključeva 9 i 30:&lt;br /&gt;
        7&lt;br /&gt;
      /   \&lt;br /&gt;
     9     12&lt;br /&gt;
    / \   /  \&lt;br /&gt;
   10 32 54  31&lt;br /&gt;
  /  \&lt;br /&gt;
 47  30&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati iterativnu implementaciju sledećeg algoritma heširanja. Za heširanje se koriste dve heš funkcije, &#039;&#039;h&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(K)&#039;&#039; i &#039;&#039;h&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(K)&#039;&#039;, dok se za razrešavanje kolizija koristi sekundarna heš funkcija &#039;&#039;g(k)&#039;&#039;. Nad ključem &#039;&#039;K&#039;&#039; koji se ubacuje u tabelu se primenjuju i funkcija &#039;&#039;h&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(K)&#039;&#039; i &#039;&#039;h&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(K)&#039;&#039;, a kao ulaz se koristi rezultat funkcije za koju se dobije manje kolizija. U slučaju jednakog broja kolizija, koristi se funkcija &#039;&#039;h&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(K)&#039;&#039;. Potrebno je realizovati operacije umetanja i pretrage.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prilikom umetanja tražimo prvu poziciju na kojoj je prazno mesto, prvo jednom a zatim i drugom heš funkcijom. Ako se desi da se vratimo na početnu poziciju, to znači da je tabela puna i ključ se ne može umetnuti.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
INSERT(table, K)&lt;br /&gt;
adr1 = adr1_init = h1(K)&lt;br /&gt;
adr2 = adr2_init = h2(K)&lt;br /&gt;
repeat&lt;br /&gt;
    if table[adr1] = empty then&lt;br /&gt;
        table[adr1] = K&lt;br /&gt;
        return&lt;br /&gt;
    else&lt;br /&gt;
        adr1 = (adr1 + g(K)) mod n&lt;br /&gt;
    end_if&lt;br /&gt;
    if table[adr2] = empty then&lt;br /&gt;
        table[adr2] = K&lt;br /&gt;
        return&lt;br /&gt;
    else&lt;br /&gt;
        adr2 = (adr2 + g(K)) mod n&lt;br /&gt;
    end_if&lt;br /&gt;
until (adr1 = adr1_init) or (adr2 = adr2_init)&lt;br /&gt;
ERROR(Tabela je puna)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
Pretraga je slična umetanju, s tim što ako naiđemo na neprazno polje prvo proveravamo da li to polje sadrži traženi ključ i nastavljamo pretragu ako ne sadrži. Pretraga se takođe završava ako su obe pretrage došle do praznog polja.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SEARCH(table, K)&lt;br /&gt;
adr1 = adr1_init = h1(K)&lt;br /&gt;
adr2 = adr2_init = h2(K)&lt;br /&gt;
repeat&lt;br /&gt;
    if table[adr1] = K then&lt;br /&gt;
        return true&lt;br /&gt;
    else if table[adr1] ≠ empty then&lt;br /&gt;
        adr1 = (adr1 + g(K)) mod n&lt;br /&gt;
    end_if&lt;br /&gt;
    if table[adr2] = K then&lt;br /&gt;
        return true&lt;br /&gt;
    else if table[adr2] ≠ empty then&lt;br /&gt;
        adr2 = (adr2 + g(K)) mod n&lt;br /&gt;
    end_if&lt;br /&gt;
until (adr1 = adr1_init) or (adr2 = adr2_init) or ((table[adr1] = empty) and (table[adr2] = empty))&lt;br /&gt;
return false&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je sekvenca ključeva: 169, 84, 99, 6, 61, 84, 9, 96, 158, 42, 495, 46, 223. Prikazati rad &#039;&#039;shell sort&#039;&#039; algoritma po koracima. Navesti korišćenu sekvencu inkremenata i obrazložiti izbor.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Inkrementi su izabrani kao u [[АСП2/К3 2020#6. zadatak|rešenju šestog zadatka sa trećeg kolokvijuma 2020. godine]].&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Inkrement !! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 !! 8 !! 9 !! 10 !! 11 !! 12&lt;br /&gt;
|-&lt;br /&gt;
! Početak&lt;br /&gt;
| 169 || 84 || 99 || 6 || 61 || 84 || 9 || 96 || 158 || 42 || 495 || 46 || 223&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| 96 || 84 || 42 || 6 || 46 || 84 || 9 || 169 || 158 || 99 || 495 || 61 || 223&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| 84 || 9 || 42 || 6 || 46 || 96 || 61 || 169 || 158 || 99 || 495 || 84 || 223&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| 6 || 9 || 42 || 61 || 46 || 96 || 84 || 169 || 84 || 99 || 495 || 158 || 223&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| 6 || 9 || 42 || 61 || 46 || 84 || 84 || 169 || 96 || 99 || 495 || 158 || 223&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| 6 || 9 || 42 || 61 || 46 || 84 || 84 || 99 || 96 || 158 || 223 || 169 || 495&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
| 6 || 9 || 42 || 46 || 61 || 84 || 84 || 96 || 99 || 158 || 169 || 223 || 495&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Priloženi pseudokod prikazuje jednu varijantu &#039;&#039;bubble sort&#039;&#039; algoritma za sortiranje podataka. Objasniti glavne nedostatke priloženog algoritma i napisati u pseudokodu alternativnu implementaciju ovog algoritma koja te nedostatke ispravlja.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i:=1 to n-1 do&lt;br /&gt;
    for j:=n-1 downto 1 do&lt;br /&gt;
        if arr[j]&amp;gt;arr[j+1] then&lt;br /&gt;
            b:=arr[j]; arr[j]:=arr[j+1]; arr[j+1]:=b;&lt;br /&gt;
        end_if&lt;br /&gt;
     end_for&lt;br /&gt;
end_for&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kod ovog algoritma jeste najveći problem to što &amp;lt;code&amp;gt;n-1&amp;lt;/code&amp;gt; puta radi iteraciju kroz niz, kada je to potrebno raditi samo dok se ne desi da nije bilo nijedne zamene u unutrašnjoj petlji. Drugi problem jeste nepotreban prolazak od kraja do početka niza, kada je prolazak od početka do kraja potencijalno efikasniji zbog keš memorije. Takođe, nije potrebno prolaziti kroz sortirani deo prilikom zamene elemenata.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
BUBBLE SORT REVISITED(arr, n)&lt;br /&gt;
pos = n&lt;br /&gt;
repeat&lt;br /&gt;
    granica = pos&lt;br /&gt;
    broj_zamena = 0&lt;br /&gt;
    for i = 1 to granica - 1 do&lt;br /&gt;
        if arr[i] &amp;gt; arr[i+1] then&lt;br /&gt;
            arr[i] ↔ arr[i+1]&lt;br /&gt;
            granica = i&lt;br /&gt;
            broj_zamena = broj_zamena + 1&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
until broj_zamena = 0&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa 7 ulaza primenom heš funkcije h&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt;(K) = K mod 7. Za razrešavanje kolizija se koristi metoda dvostrukog heširanja sa sekundarnom heš funkcijom h&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;(K) = 4 + K mod 3. Odrediti prosečan broj pristupa prilikom neuspešnog traženja i verovatnoću popunjavanja praznih ulaza, pod pretpostavkom da su svi ključevi jednako verovatni.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela iz postavke zadatka&lt;br /&gt;
! 0&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| 13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Ispitni nizovi&lt;br /&gt;
! 0 !! 1 !! 2&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 5 || 6&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 5&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 6 || 3&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 4 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 2 || 1&lt;br /&gt;
|}&lt;br /&gt;
* Prosečan broj neuspešnih pristupa: &amp;lt;math&amp;gt;P_{nu} = 1 + \frac{5}{7} + \frac{5 \cdot 4}{7 \cdot 6} + \frac{5 \cdot 4 \cdot 3}{7 \cdot 6 \cdot 5} + \frac{5 \cdot 4 \cdot 3 \cdot 2}{7 \cdot 6 \cdot 5 \cdot 4} + \frac{5 \cdot 4 \cdot 3 \cdot 2 \cdot 1}{7 \cdot 6 \cdot 5 \cdot 4 \cdot 3} =&amp;lt;/math&amp;gt;&lt;br /&gt;
*: &amp;lt;math&amp;gt;= 1 + \frac{5}{7} + \frac{10}{21} + \frac{2}{7} + \frac{1}{7} + \frac{1}{21} = \frac{8}{3} \approx 2.67&amp;lt;/math&amp;gt;&lt;br /&gt;
* Verovatnoća popunjavanja:&lt;br /&gt;
** 1: &amp;lt;math&amp;gt;\frac{1}{3} \left(\frac{6}{7} + \frac{2}{7} + \frac{4}{7}\right) = \frac{4}{7}&amp;lt;/math&amp;gt;&lt;br /&gt;
** 5: &amp;lt;math&amp;gt;\frac{1}{3} \left(\frac{1}{7} + \frac{5}{7} + \frac{3}{7}\right) = \frac{3}{7}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu funkciju za uklanjanje minimalnog ključa u binomnom hipu i njegovu naknadnu reorganizaciju. Nije potrebno sprovesti potencijalno spajanje stabala nakon uklanjanja čvora sa minimalnim ključem. Binomni hip predstavljen pomoću objekta klase BinHeap koja sadrži ulančanu listu objekata BinTree koji predstavljaju pojedinačna binomna stabla. Lista je uređena rastuće po stepenu stabla. Binomno stablo se sastoji od čvorova predstavljenih objektima klase BinNode. Funkcija kao argument prima objekat klase BinHeap. U nastavku je dat spisak metoda koje su na raspolaganju, njihove povratne vrednosti i klase objekata za koje ih treba pozvati.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Metoda&lt;br /&gt;
! Povratna vrednost&lt;br /&gt;
! Objekat klase&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;getFirst&#039;&#039;&lt;br /&gt;
| pokazivač na početak liste šume binomnih stabala&lt;br /&gt;
| &#039;&#039;BinHeap&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;findMin&#039;&#039;&lt;br /&gt;
| pokazivač na binomno stablo u čijem korenu je minimalni ključ&lt;br /&gt;
| &#039;&#039;BinHeap&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;getOrder&#039;&#039;&lt;br /&gt;
| red stabla&lt;br /&gt;
| &#039;&#039;BinTree&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;setOrder&#039;&#039;&lt;br /&gt;
| nema&lt;br /&gt;
| &#039;&#039;BinTree&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;getRoot&#039;&#039;&lt;br /&gt;
| pokazivač na koren binomnog stabla&lt;br /&gt;
| &#039;&#039;BinTree&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;getNumOfChildren&#039;&#039;&lt;br /&gt;
| broj potomaka čvora binomnog stabla&lt;br /&gt;
| &#039;&#039;BinNode&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;getChildAtPos(index)&#039;&#039;&lt;br /&gt;
| pokazivač na čvor koji je potomak objekta &#039;&#039;BinNode&#039;&#039; na poziciji index&lt;br /&gt;
| &#039;&#039;BinNode&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Sledeće pretpostavke su usvojene pri implementaciji:&lt;br /&gt;
* &amp;lt;code&amp;gt;getFirst&amp;lt;/code&amp;gt; vraća promenljivu referencu na lvrednost do početka ulančane liste, kako bismo mogli da ažuriramo taj početak&lt;br /&gt;
* &amp;lt;code&amp;gt;getChildAtPos&amp;lt;/code&amp;gt; isto vraća promenljivu referencu na lvrednost. Ovo je kako bismo decu trenutnog čvora mogli da postavimo na nil, kako ne bi bila uništena prilikom dealokacije stabla (pretpostavljamo da postoji funkcija FREETREE koja to radi, slično FREENODE)&lt;br /&gt;
* Postoji funkcija GETTREE koja samo alocira stablo i kao koren postavlja svoj prvi argument&lt;br /&gt;
* Ulančana lista je jednostruko ulančana, pa naknadno moramo dohvatati elemente liste koje sadrže stablo sa minimalnim korenom nakon pozivanja &amp;lt;code&amp;gt;findMin&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ulančana lista u hipu sadrži polje &#039;&#039;next&#039;&#039; koje pokazuje do sledećeg čvora ulančane liste i polje &#039;&#039;value&#039;&#039; koje pokazuje na &#039;&#039;BinTree&#039;&#039; objekat, i sve operacije kao što su se koristile na ASP1 su podržane&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
REMOVE MIN KEY(binheap)&lt;br /&gt;
first_node = binheap.getFirst()&lt;br /&gt;
if first_node = nil then&lt;br /&gt;
    return&lt;br /&gt;
end_if&lt;br /&gt;
min_tree = binheap.getMin()&lt;br /&gt;
prev_node = nil&lt;br /&gt;
curr_node = first_node&lt;br /&gt;
while value(curr_node) ≠ min_tree do&lt;br /&gt;
    prev_node = curr_node&lt;br /&gt;
    curr_node = next(curr_node)&lt;br /&gt;
end_while&lt;br /&gt;
next(prev_node) = next(curr_node)&lt;br /&gt;
root = min_tree.getRoot()&lt;br /&gt;
for i = 1 to root.getNumOfChildren() do&lt;br /&gt;
    child = root.getChildAtPos(i)&lt;br /&gt;
    tree = GETTREE(child)&lt;br /&gt;
    tree.setOrder(child.getNumOfChildren())&lt;br /&gt;
    INSERT_TREE(binheap, tree)&lt;br /&gt;
    root.getChildAtPos(i) = nil&lt;br /&gt;
end_for&lt;br /&gt;
FREETREE(min_tree)&lt;br /&gt;
FREENODE(curr_node)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
INSERT TREE(binheap, bintree)&lt;br /&gt;
curr = binheap.getFirst()&lt;br /&gt;
prev = nil&lt;br /&gt;
while curr ≠ nil do&lt;br /&gt;
    if value(curr).getOrder() ≥ bintree.getOrder() then&lt;br /&gt;
        if prev = nil then&lt;br /&gt;
            binheap.getFirst() = GETNODE&lt;br /&gt;
            value(binheap.getFirst()) = bintree&lt;br /&gt;
            next(binheap.getFirst()) = curr&lt;br /&gt;
        else&lt;br /&gt;
            next(prev) = GETNODE&lt;br /&gt;
            value(next(prev)) = bintree&lt;br /&gt;
            next(next(prev)) = curr&lt;br /&gt;
        end_if&lt;br /&gt;
        return&lt;br /&gt;
    end_if&lt;br /&gt;
    prev = curr&lt;br /&gt;
    curr = next(curr)&lt;br /&gt;
end_while&lt;br /&gt;
next(prev) = GETNODE&lt;br /&gt;
value(next(prev)) = bintree&lt;br /&gt;
next(next(prev)) = nil&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa 8 ulaza primenom heš funkcije po metodu deljenja. Za razrešavanje kolizija se koristi metoda slučajnog pretraživanja (c = 3). Prikazati proces razrešavanja kolizije i generisati ispitne nizove za ključeve 21 i 18. Objasniti da li kod ovog metoda u opštem slučaju dolazi do primarnog i sekundarnog grupisanja i zašto.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pošto se koristi metoda slučajnog pretraživanja, moramo generisati slučajni niz za generisanje ispitnog niza:&lt;br /&gt;
     011 = 3&lt;br /&gt;
 *2  110 = 6&lt;br /&gt;
 *2 1100&lt;br /&gt;
 -8  100&lt;br /&gt;
 ⊕3  111 = 7&lt;br /&gt;
 *2 1110&lt;br /&gt;
 -8  110&lt;br /&gt;
 ⊕3  101 = 5&lt;br /&gt;
 *2 1010&lt;br /&gt;
 -8  010&lt;br /&gt;
 ⊕3  001 = 1&lt;br /&gt;
 *2  010 = 2&lt;br /&gt;
 *2  100 = 4&lt;br /&gt;
 *2 1000&lt;br /&gt;
 -8  000&lt;br /&gt;
 ⊕3  011 ...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Ispitni nizovi za 21 i 18&lt;br /&gt;
! 21 !! 18&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 5&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 7&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 3&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 6&lt;br /&gt;
|}&lt;br /&gt;
Proces razrešavanja kolizije:&lt;br /&gt;
* 21 % 8 = 5&lt;br /&gt;
* Ako je ulaz 5 zauzet: (5 + 3) % 8 = 0&lt;br /&gt;
* Ako je ulaz 0 zauzet: (5 + 6) % 8 = 3&lt;br /&gt;
* itd.&lt;br /&gt;
U opštem slučaju neće doći do primarnog grupisanja jer je sekvenca ključeva u ispitnom nizu nasumična a ne linearna, ali će doći do sekundarnog grupisanja jer ispitni niz zavisi samo od matične adrese i rednog broja pokušaja.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Precizno objasniti kako se dolazi do složenosti algoritama za sortiranje a) kvadratnom selekcijom b) stablom selekcije i c) spajanjem. U kojem od ovih algoritama se razlikuju najbolji, srednji i najgori slučaj složenosti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2017&amp;diff=7812</id>
		<title>АСП2/К3 2017</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A3_2017&amp;diff=7812"/>
		<updated>2024-09-13T00:09:14Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Treći kolokvijum 2017. godine&#039;&#039;&#039; održan je 20. januara. Postavka zadataka je dostupna sa [https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K3_1617.pdf stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Kako izgleda niz sa slike nakon prvih pet iteracija &#039;&#039;shakersort&#039;&#039; algoritma?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Niz nakon pet iteracija &#039;&#039;shakersort&#039;&#039; algoritma&lt;br /&gt;
| 12 || 3 || 34 || 83 || 21 || 95 || 34 || 1 || 18 || 20 || 83 || 17 || 44 || 39&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 12 || 34 || 21 || 83 || 34 || 1 || 18 || 20 || 83 || 17 || 44 || 39 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 34 || 21 || 83 || 34 || 17 || 18 || 20 || 83 || 39 || 44 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 21 || 34 || 34 || 17 || 18 || 20 || 83 || 39 || 44 || 83 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 17 || 21 || 34 || 34 || 18 || 20 || 39 || 83 || 44 || 83 || 95&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 3 || 12 || 17 || 21 || 34 || 18 || 20 || 34 || 39 || 44 || 83 || 83 || 95&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je heš tabela sa 10 ulaza. U tabelu se unose ključevi koje se mogu sastojati od velikih i malih slova. Primarna heš funkcija je &#039;&#039;H&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(K) = (1 + len(K)) mod 10&#039;&#039;, gde &#039;&#039;len(K)&#039;&#039; vraća broj slova u prosleđenom ključu &#039;&#039;K&#039;&#039;. Vremenska lokalnost je veoma izražena, jer se nakon umetanja svakog ključa javlja veliki broj pretraživanja na taj ključ pre nego što se umetne sledeći. Kolizije se razrešavaju nestandardnom primenom dvostrukog heširanja kod koga je sekundarna funkcija &#039;&#039;H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(K) = 3 + up_case_cnt(K)&#039;&#039;, gde &#039;&#039;up_case_cnt(K)&#039;&#039; vraća ukupan broj velikih slova u ključu &#039;&#039;K&#039;&#039;.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti modifikaciju načina za razrešavanje kolizije tako da se minimizuje vreme uspešnog pretraživanja u datim uslovima.&lt;br /&gt;
# Primenom predloženog rešenja u donju tabelu umetnuti sledeće ključeve:&lt;br /&gt;
#: ČoKoLaDa, PalAčINka, kafA, TORtA, RoLaT, SLadoled, koLAČ&lt;br /&gt;
#: Prikazati finalno stanje heš tabele i celokupan postupak primenom tehnike opisane u rešenju pod a).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Prilikom razrešavanja kolizije, postojeće ključeve možemo pomeriti da budu niže u ispitnom nizu duplim heširanjem a novoumetnuti ključ staviti na njegov početak kako bi se sa što manjim brojem kolizija dolazilo do najskorije umetnutih ključeva.&lt;br /&gt;
# Umetanje u tabelu ide ovako:&lt;br /&gt;
## ČoKoLaDa se umeće na mesto 9&lt;br /&gt;
## PalAčINka se umeće na mesto 0&lt;br /&gt;
## kafA se umeće na mesto 5&lt;br /&gt;
## TORtA se umeće na mesto 6&lt;br /&gt;
## RoLaT se umeće na mesto 6, TORtA se pomera na mesto 3&lt;br /&gt;
## SLadoled se umeće na mesto 9, ČoKoLaDa se pomera na mesto 6, RoLaT se pomera na mesto 2&lt;br /&gt;
## koLAČ se umeće na mesto 6, ČoKoLaDa se pomera na mesto 3, TORtA se pomera na mesto 0, PalAčINka se pomera na mesto 7&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Konačni izgled heš tabele nakon umetanja&lt;br /&gt;
! 0&lt;br /&gt;
| TORtA&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| RoLaT&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
| ČoKoLaDa&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
| kafA&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
| koLAČ&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
| PalAčINka&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 9&lt;br /&gt;
| SLadoled&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati iterativnu implementaciju &#039;&#039;quicksort&#039;&#039; algoritma. U telu funkcije QUICKSORT koja će predstavljati ovu implementaciju, nakon izbora pivota, pozivati funkciju PARTITION koja vraća konačnu poziciju pivota u nizu. Algoritam realizovati &amp;lt;u&amp;gt;što efikasnije&amp;lt;/u&amp;gt;, a za pivot uzeti element niza koji je srednji po vrednosti u izboru između elemenata sa prve tri pozicije u particiji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pošto se pominje velika efikasnost, bitno je da na stek guramo veće particije a direktno obilazimo manje kako bi dubina steka bila što manja.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
QUICKSORT(arr, n)&lt;br /&gt;
STACK_INIT(S_down)&lt;br /&gt;
STACK_INIT(S_up)&lt;br /&gt;
down = 1&lt;br /&gt;
up = n&lt;br /&gt;
from_stack = false&lt;br /&gt;
while (not STACK_EMPTY(S_down)) or (not from_stack) do&lt;br /&gt;
    if from_stack then&lt;br /&gt;
        down = POP(S_down)&lt;br /&gt;
        up = POP(S_up)&lt;br /&gt;
    end_if&lt;br /&gt;
    if (up - down = 0) or (up - down = 1) then&lt;br /&gt;
        if (up - down = 1) and (arr[up] &amp;lt; arr[down]) then&lt;br /&gt;
            arr[up] ↔ arr[down]&lt;br /&gt;
        end_if&lt;br /&gt;
        from_stack = true&lt;br /&gt;
        continue&lt;br /&gt;
    end_if&lt;br /&gt;
    first = arr[down]&lt;br /&gt;
    second = arr[down+1]&lt;br /&gt;
    third = arr[down+2]&lt;br /&gt;
    if (first ≤ second ≤ third) or (third ≤ second ≤ first) then&lt;br /&gt;
        pivot = 2&lt;br /&gt;
    else if (second ≤ first ≤ third) or (third ≤ first ≤ second) then&lt;br /&gt;
        pivot = 1&lt;br /&gt;
    else&lt;br /&gt;
        pivot = 3&lt;br /&gt;
    end_if&lt;br /&gt;
    pivot_pos = PARTITION(arr, down, up, pivot)&lt;br /&gt;
    lower_down = down&lt;br /&gt;
    lower_up = pivot_pos-1&lt;br /&gt;
    higher_down = pivot_pos+1&lt;br /&gt;
    higher_up = up&lt;br /&gt;
    if (lower_up - lower_down &amp;lt; 1) and (higher_up - higher_down &amp;lt; 1) then&lt;br /&gt;
        from_stack = true&lt;br /&gt;
    else if lower_up - lower_down &amp;lt; higher_up - higher_down then&lt;br /&gt;
        up = lower_up&lt;br /&gt;
        down = lower_down&lt;br /&gt;
        from_stack = false&lt;br /&gt;
        PUSH(S_down, higher_down)&lt;br /&gt;
        PUSH(S_up, higher_up)&lt;br /&gt;
    else&lt;br /&gt;
        up = higher_up&lt;br /&gt;
        down = higher_down&lt;br /&gt;
        from_stack = false&lt;br /&gt;
        PUSH(S_down, lower_down)&lt;br /&gt;
        PUSH(S_up, lower_up)&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
Pošto je rečeno da se izbor pivota radi u QUICKSORT, pretpostavićemo da se taj pivot zatim prosleđuje PARTITION kao parametar.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PARTITION(arr, down, up, pivot_pos)&lt;br /&gt;
i = down&lt;br /&gt;
j = up&lt;br /&gt;
pivot = arr[pivot_pos]&lt;br /&gt;
while i &amp;lt; j do&lt;br /&gt;
    while (arr[i] ≤ pivot) and (i &amp;lt; j) do&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end_while&lt;br /&gt;
    while arr[j] &amp;gt; pivot do&lt;br /&gt;
        j = j - 1&lt;br /&gt;
    end_while&lt;br /&gt;
    if i &amp;lt; j then&lt;br /&gt;
        if j == pivot_pos then&lt;br /&gt;
            pivot_pos = i&lt;br /&gt;
        end_if&lt;br /&gt;
        arr[i] ↔ arr[j]&lt;br /&gt;
    end_while&lt;br /&gt;
end_while&lt;br /&gt;
arr[pivot_pos] ↔ arr[j]&lt;br /&gt;
return j&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu funkciju za dekrementiranje ključa koji se nalazi u binarnom nerastućem (max) hipu. Smatrati da je hip smešten u nizu čiji indeksi počinju od 0. Funkcija kao svoj parametar dobija indeks ključa u nizu koga treba dekrementirati.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
HEAP KEY DEC(i)&lt;br /&gt;
arr[i] = arr[i]-1&lt;br /&gt;
left = 2 * i + 1&lt;br /&gt;
right = 2 * i + 2&lt;br /&gt;
while ((left ≤ n) and (arr[left] &amp;gt; arr[i])) or ((right ≤ n) and (arr[right] &amp;gt; arr[i])) do&lt;br /&gt;
    if right ≤ n then&lt;br /&gt;
        if arr[right] &amp;gt; arr[left] then&lt;br /&gt;
            high = right&lt;br /&gt;
        else&lt;br /&gt;
            high = left&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        high = left&lt;br /&gt;
    end_if&lt;br /&gt;
    arr[i] ↔ arr[high]&lt;br /&gt;
    i = high&lt;br /&gt;
    left = 2 * i + 1&lt;br /&gt;
    right = 2 * i + 2&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa 7 ulaza primenom heš funkcije h&amp;lt;sub&amp;gt;p&amp;lt;/sub&amp;gt;(K) = K mod 7. Za razrešavanje kolizija se koristi metoda dvostrukog heširanja sa sekundarnom heš funkcijom h&amp;lt;sub&amp;gt;s&amp;lt;/sub&amp;gt;(K) = 4 + K mod 2. Obrazložiti na koji način u ovom slučaju može doći do sekundarnog grupisanja i navesti sekvencu od tri ključa koja proizvodi ovaj efekat u konkretnom slučaju. Navedene ključeve uneti u tabelu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U ovom slučaju može doći do sekundarnog grupisanja kada uneti ključevi daju isti ostatak pri deljenju sa 7 i pri deljenju sa 2. Takvi su recimo ključevi 0, 14 i 28.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela sa unetim ključevima&lt;br /&gt;
! 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
! 8&lt;br /&gt;
| 28&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Fibonačijev hip&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Koja je razlika između dodavanja u binomni hip i Fibonačijev hip? Objasniti kratko i precizno, u jednoj do dve rečenice.&lt;br /&gt;
# U prazan Fibonačijev hip dodaju se elementi 10, 5, 17, 3, 12, 11, 1, potom se briše element sa vrednošću 1, nakon čega se dodaju elementi 7 i 2. Nacrtati izgled hipa nakon prvih sedam umetanja i nakon svake naredne izmene hipa.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Pri dodavanju u Fibonačijev hip uneti čvor se samo ulančava, a grupisanje slično binomnom hipu se dešava tek kod izbacivanja najmanjeg elementa.&lt;br /&gt;
# Ispod su dati izgledi hipa nakon date četiri operacije.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;gallery class=&amp;quot;transparent-svg&amp;quot;&amp;gt;&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip umetanje 1.svg | Izgled hipa nakon umetanja 10, 5, 17, 3, 12, 11, 1.&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip brisanje.svg | Izgled hipa nakon brisanja 1.&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip umetanje 2.svg | Izgled hipa nakon umetanja 7.&lt;br /&gt;
  ASP2 K3 2017 zadatak 6 hip umetanje 3.svg | Izgled hipa nakon umetanja 2.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Podaci se smeštaju u heš tabelu sa &#039;&#039;n&#039;&#039; ulaza primenom heš funkcije h(K) = K mod n. Za razrešavanje kolizija se koristi metoda kvadratnog pretraživanja, ali nije dozvoljeno koristiti operaciju množenja (kvadriranja). Predložiti metod brisanja i napisati pseudokodove operacija brisanja i umetanja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Možemo primetiti da &amp;lt;math&amp;gt;2^2 - 1^2 = 3, 3^2 - 2^2 = 5, 4^2 - 3^2 = 7, ...&amp;lt;/math&amp;gt; što znači da umesto kvadriranja možemo da radimo samo sabiranje sa sledećim neparnim brojem.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DELETE(H, key)&lt;br /&gt;
i = init = H(key)&lt;br /&gt;
step = 3&lt;br /&gt;
while (T[i] ≠ key) and (T[i] ≠ empty) do&lt;br /&gt;
    if (step ≠ 3) and (i = init) then&lt;br /&gt;
        return&lt;br /&gt;
    end_if&lt;br /&gt;
    i = i + step&lt;br /&gt;
    step = step + 2&lt;br /&gt;
end_while&lt;br /&gt;
if T[i] ≠ empty then&lt;br /&gt;
    T[i] = deleted&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
INSERT(H, key)&lt;br /&gt;
i = init = H(key)&lt;br /&gt;
step = 3&lt;br /&gt;
while (T[i] ≠ empty) and (T[i] ≠ deleted) do&lt;br /&gt;
    if (step ≠ 3) and (i = init) then&lt;br /&gt;
        ERROR(Tabela puna)&lt;br /&gt;
    end_if&lt;br /&gt;
    i = i + step&lt;br /&gt;
    step = step + 2&lt;br /&gt;
end_while&lt;br /&gt;
T[i] = key&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Objasniti kako se može modelirati ponašanje algoritama sortiranja poređenjem. Za dati model izvesti teorijsku granicu složenosti u najgorem slučaju.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ponašanje algoritma se može modelirati stablom odlučivanja. Svako odlučivanje se modeluje unutrašnjim čvorom a svaki ishod listom, tako da složenost u najgorem slučaju dobijamo kao visinu tog stabla. Pošto je broj ishoda ovakvog stabla odlučivanja jednak &amp;lt;math&amp;gt;n!&amp;lt;/math&amp;gt;, a najveći broj listova u stablu visine &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; jednak &amp;lt;math&amp;gt;2^h&amp;lt;/math&amp;gt;, možemo da izjednačimo &amp;lt;math&amp;gt;n! = 2^h&amp;lt;/math&amp;gt;. Kad logaritmujemo obe strane jednačine i primenimo Stirlingovu aproksimaciju (&amp;lt;math&amp;gt;n! &amp;gt; \left(\frac{n}{e}\right)^n&amp;lt;/math&amp;gt;) dobijamo &amp;lt;math&amp;gt;h = \log(n!) &amp;gt; n \log\left(\frac{n}{e}\right) &amp;gt; n \log n - n \log e = O(n \log n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A2_2019&amp;diff=7811</id>
		<title>АСП2/К2 2019</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A2_2019&amp;diff=7811"/>
		<updated>2024-09-13T00:09:13Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K2_1920.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Izomorfizam crveno-crnih i 2-3-4 stabala.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dato binarno crveno-crno stablo transformisati u izomorfno 2-3-4 stablo. Osenčeni čvorovi su crni.&lt;br /&gt;
# Iz stabla dobijenog pod a) brišu se ključevi 63 i 60. Nacrtati stabla dobijena nakon svakog od ova dva brisanja.&lt;br /&gt;
# Ako se stablo dobijeno pod a) posmatra kao obično B stablo reda 4, da li bi bilo razlike u konačnom izgledu stabla nakon brisanja ključeva 63 i 60? Ukratko objasniti.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ekvivalentno izomorfno 2-3-4 stablo je:&lt;br /&gt;
            [57|74|  ]&lt;br /&gt;
           /   |      \&lt;br /&gt;
 [21|43|  ] [60|63|  ] [88|91|94]&lt;br /&gt;
Pri izbacivanju ključa 63, ključ 60 dolazi na njegovo mesto (i postaje crn).&lt;br /&gt;
            [57|74|  ]&lt;br /&gt;
           /     |    \&lt;br /&gt;
 [21|43|  ] [  |60|  ] [88|91|94]&lt;br /&gt;
Pri izbacivanju ključa 60, vrši se pozajmljivanje od pravog brata, koji je ovde levi brat u izomorfnom 2-3-4 stablu, pa ključ 43 postaje razdelni a ključ 57 silazi u čvor iz kojeg se briše.&lt;br /&gt;
            [43|74|  ]&lt;br /&gt;
           /     |    \&lt;br /&gt;
 [  |21|  ] [  |57|  ] [88|91|94]&lt;br /&gt;
Ekvivalentna crveno-crna stabla su data ispod.&lt;br /&gt;
&lt;br /&gt;
Da je stablo bilo obično B stablo reda 4, u drugom koraku bi se pozajmljivalo od desnog brata umesto od levog brata, jer B stabla nemaju pravilo da se prvo pozajmljuje od pravog brata. Takođe, ključevi 21 i 57 ne bi stajali u središnjem polju čvora, već najlevljem.&lt;br /&gt;
&amp;lt;gallery class=&amp;quot;transparent-svg&amp;quot;&amp;gt;&lt;br /&gt;
  ASP2 K2 2019 zadatak 1 stablo.svg  | Originalno crveno-crno stablo&lt;br /&gt;
  ASP2 K2 2019 zadatak 1 korak 1.svg | Crveno-crno stablo nakon brisanja čvora 63&lt;br /&gt;
  ASP2 K2 2019 zadatak 1 korak 2.svg | Crveno-crno stablo nakon brisanja čvora 60&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U B+ stablo sa slike redom se umeću ključevi 6, 25, 21 i 27, nakon čega se uklanjaju ključevi 33, 27 i 6. Prikazati ažuriranje stabla po koracima.&lt;br /&gt;
             [33|64|  ]&lt;br /&gt;
           /     |     \&lt;br /&gt;
 [20|22|33]-&amp;gt;[42|64|  ]-&amp;gt;[71|81|  ]&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Red stabla: &amp;lt;math&amp;gt;m = 4&amp;lt;/math&amp;gt;&lt;br /&gt;
* Minimalni broj ključeva u unutrašnjim čvorovima: &amp;lt;math&amp;gt;\left\lceil\frac{m}{2}\right\rceil-1 = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
* Minimalni broj ključeva u listovima: &amp;lt;math&amp;gt;\left\lfloor\frac{m}{2}\right\rfloor = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
Ključ 6 se umeće levo od čvora 20. Dolazi do preloma i 6 i 20 ostaju u čvoru, 20 ide u roditelja, a 22 i 33 se odvajaju u novi čvor.&lt;br /&gt;
                   (20|33|64)&lt;br /&gt;
             /        |  |     \&lt;br /&gt;
 [ 6|20|  ]-&amp;gt;[22|33|  ]-&amp;gt;[42|64|  ]-&amp;gt;[71|81|  ]&lt;br /&gt;
Ključ 25 se umeće između ključeva 22 i 33.&lt;br /&gt;
                   (20|33|64)&lt;br /&gt;
             /        |  |     \&lt;br /&gt;
 [ 6|20|  ]-&amp;gt;[22|25|33]-&amp;gt;[42|64|  ]-&amp;gt;[71|81|  ]&lt;br /&gt;
Ključ 21 se umeće levo od ključa 22. Dolazi do preloma, 21 i 22 ostaju u čvoru, 22 ide u roditeljski čvor, a 25 i 33 se odvajaju u novi čvor. Pošto u roditelju nema mesta, i on se prelama tako da koren postaje čvor sa 22, levi čvor sa 20 i desni sa 33 i 64.&lt;br /&gt;
                          (22|  |  )&lt;br /&gt;
                       /              \&lt;br /&gt;
           (20|  |  )                   (33|64|  )&lt;br /&gt;
          /   |                    /       |   \&lt;br /&gt;
 [ 6|20|  ]-&amp;gt;[21|22|  ]-&amp;gt;[25|33|  ]-&amp;gt;[42|64|  ]-&amp;gt;[71|81|  ]&lt;br /&gt;
Ključ 27 se umeće između ključeva 25 i 33.&lt;br /&gt;
                          (22|  |  )&lt;br /&gt;
                       /              \&lt;br /&gt;
           (20|  |  )                   (33|64|  )&lt;br /&gt;
          /   |                    /       |   \&lt;br /&gt;
 [ 6|20|  ]-&amp;gt;[21|22|  ]-&amp;gt;[25|27|33]-&amp;gt;[42|64|  ]-&amp;gt;[71|81|  ]&lt;br /&gt;
Pri uklanjanju ključa 33, pošto je najveći ključ u čvoru, mora se ažurirati roditeljski čvor tako da 33 u roditeljskom čvoru postaje 27.&lt;br /&gt;
                          (22|  |  )&lt;br /&gt;
                       /              \&lt;br /&gt;
           (20|  |  )                   (27|64|  )&lt;br /&gt;
          /   |                    /       |   \&lt;br /&gt;
 [ 6|20|  ]-&amp;gt;[21|22|  ]-&amp;gt;[25|27|  ]-&amp;gt;[42|64|  ]-&amp;gt;[71|81|  ]&lt;br /&gt;
Pri uklanjanju ključa 27, ostaje manje nego dovoljno ključeva u tom čvoru. Pozajmica od oba brata nije moguća, i zato se taj čvor spaja sa svojim desnim bratom. U tom procesu se takođe izbacuje ključ iz roditeljskog čvora.&lt;br /&gt;
                          (22|  |  )&lt;br /&gt;
                       /              \&lt;br /&gt;
           (20|  |  )                   (64|  |  )&lt;br /&gt;
          /   |                    /       |&lt;br /&gt;
 [ 6|20|  ]-&amp;gt;[21|22|  ]-&amp;gt;[25|42|64]-&amp;gt;[71|81|  ]&lt;br /&gt;
Pri uklanjanju ključa 6, ostaje manje nego dovoljno ključeva u tom čvoru. Pozajmica od brata nije moguća, i zato se taj čvor spaja sa svojim desnim bratom. U tom procesu roditeljski čvor ostaje prazan, tako da se spajaju svi unutrašnji čvorovi u jedan, čime se dobija konačno stablo:&lt;br /&gt;
             (22|64|  )&lt;br /&gt;
           /    |       \&lt;br /&gt;
 [20|21|22]-&amp;gt;[25|42|64]-&amp;gt;[71|81|  ]&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato digitalno stablo je potrebno transformisati u kompaktniju formu kako bi se smanjila veličina stabla.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti i objasniti način na koji se može ostvariti transformacija digitalnog stabla u kompaktniju formu i prikazati izgled digitalnog stabla nakon opisane transformacije.&lt;br /&gt;
# Implementirati funkciju &amp;lt;u&amp;gt;TRIE COMPACTION&amp;lt;/u&amp;gt; koja transformiše stablo na prethodno opisani način. Pokazivač na koren stabla &#039;&#039;root&#039;&#039; je prosleđen funkciji. Smatrati da je digitalno stablo predstavljeno po principu levi sin - desni brat.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
       A&lt;br /&gt;
    /  |  \&lt;br /&gt;
   B   C   S&lt;br /&gt;
   |   |   |&lt;br /&gt;
   K   J   4&lt;br /&gt;
  / \  |   |&lt;br /&gt;
 D   T M   6&lt;br /&gt;
 |   | |   |&lt;br /&gt;
 9   * *   A&lt;br /&gt;
 |         |&lt;br /&gt;
 3         *&lt;br /&gt;
 |&lt;br /&gt;
 *&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kompaktnija forma ovog stabla može se dobiti tako što sve čvorove koji imaju samo jednu putanju do listova zamenimo sa listovima koji sadrže pokazivače na zapise na koje su listovi prethodno pokazivali i celu vrednost ključa. U tom slučaju ne mora da postoji čvor za kraj ključa.&lt;br /&gt;
&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
TRIE COMPACTION(root)&lt;br /&gt;
if root ≠ nil then&lt;br /&gt;
    compacted_root = COMPACT(root, &amp;quot;&amp;quot;)&lt;br /&gt;
    if compacted_root ≠ nil then&lt;br /&gt;
        root = compacted_root&lt;br /&gt;
    end_if&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
COMPACT(node, str)&lt;br /&gt;
if key(node) = &#039;*&#039; then&lt;br /&gt;
    FREENODE(node)&lt;br /&gt;
    return str&lt;br /&gt;
end_if&lt;br /&gt;
compacted_child = COMPACT(left(node), str + key(node))&lt;br /&gt;
if right(node) = nil then&lt;br /&gt;
    FREENODE(node)&lt;br /&gt;
    return compacted_child&lt;br /&gt;
else&lt;br /&gt;
    COMPACT(right(node), str)&lt;br /&gt;
    if compacted_child ≠ nil then&lt;br /&gt;
        left(node) = compacted_child&lt;br /&gt;
    end_if&lt;br /&gt;
    return nil&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu funkciju koja iz &#039;&amp;lt;nowiki /&amp;gt;&#039;&#039;top-down&#039;&#039;&#039; stabla &#039;&#039;m&#039;&#039;-arnog pretraživanja na čiji koren pokazuje pokazivač &#039;&#039;root&#039;&#039; briše zadati ključ key.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DELETE(root, m, key)&lt;br /&gt;
parent = nil&lt;br /&gt;
parent_index = 0&lt;br /&gt;
p = root&lt;br /&gt;
i = 0&lt;br /&gt;
found = false&lt;br /&gt;
while (p ≠ nil) and (not found) do&lt;br /&gt;
    for i = 1 to num(p) do&lt;br /&gt;
        if keys(p)[i] = key then&lt;br /&gt;
            found = true&lt;br /&gt;
            break&lt;br /&gt;
        else if keys(p)[i] &amp;gt; key then&lt;br /&gt;
            parent = p&lt;br /&gt;
            parent_index = i&lt;br /&gt;
            p = pointers(p)[i-1]&lt;br /&gt;
            break&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    if i = num(p) + 1 then&lt;br /&gt;
        p = pointers(p)[i-1]&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
if p = nil then&lt;br /&gt;
    ERROR(Ključ nije pronađen)&lt;br /&gt;
end_if&lt;br /&gt;
q = pointers(p)[i]&lt;br /&gt;
if q ≠ nil then&lt;br /&gt;
    prev = p&lt;br /&gt;
    while q ≠ nil do&lt;br /&gt;
        parent = prev&lt;br /&gt;
        parent_index = 1&lt;br /&gt;
        prev = q&lt;br /&gt;
        q = pointers(q)[0]&lt;br /&gt;
    end_while&lt;br /&gt;
    keys(p)[i] = key(prev)&lt;br /&gt;
    p = prev&lt;br /&gt;
    i = 1&lt;br /&gt;
end_if&lt;br /&gt;
for j = i to num(p) do&lt;br /&gt;
    keys(node)[i-1] = keys(node)[i]&lt;br /&gt;
end_for&lt;br /&gt;
num(p) = num(p) - 1&lt;br /&gt;
if num(p) = 0 then&lt;br /&gt;
    FREENODE(p)&lt;br /&gt;
    pointers(parent)[parent_index-1] = nil&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U B* stablo reda 5 sa slike se umeću ključevi 18, 23, 7, 37, 19. Nakon toga se redom brišu ključevi 80, 55, 18, 9 i 15. Nacrtati izgled stabla nakon svake izmene.&lt;br /&gt;
                             [15|24|41|80]&lt;br /&gt;
              /             /      |      \             \&lt;br /&gt;
 [ 2| 9|10|  ] [16|20|21|  ] [27|33|40|  ] [55|75|  |  ] [93|96|  |  ]&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Red stabla: &amp;lt;math&amp;gt;m = 5&amp;lt;/math&amp;gt;&lt;br /&gt;
* Minimalan broj ključeva u ne-korenskim čvorovima: &amp;lt;math&amp;gt;\left\lceil\frac{2m - 1}{3}\right\rceil-1 = 3 - 1 = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
* Maksimalan broj ključeva u korenu: &amp;lt;math&amp;gt;2\left\lfloor\frac{2m - 2}{3}\right\rfloor = 4&amp;lt;/math&amp;gt;&lt;br /&gt;
* Raspodela ključeva pri prelomu: 2-3-3&lt;br /&gt;
Ključ 18 umećemo između ključeva 16 i 20.&lt;br /&gt;
                             [15|24|41|80]&lt;br /&gt;
              /             /      |      \             \&lt;br /&gt;
 [ 2| 9|10|  ] [16|18|20|21] [27|33|40|  ] [55|75|  |  ] [93|96|  |  ]&lt;br /&gt;
Ključ 23 umećemo desno od ključa 21. Dešava se prelivanje u desni čvor, 23 završava u roditelju a 24 u desnom čvoru.&lt;br /&gt;
                             [15|23|41|80]&lt;br /&gt;
              /             /      |      \             \&lt;br /&gt;
 [ 2| 9|10|  ] [16|18|20|21] [24|27|33|40] [55|75|  |  ] [93|96|  |  ]&lt;br /&gt;
Ključ 7 umećemo između ključeva 2 i 9.&lt;br /&gt;
                             [15|23|41|80]&lt;br /&gt;
              /             /      |      \             \&lt;br /&gt;
 [ 2| 7| 9|10] [16|18|20|21] [24|27|33|40] [55|75|  |  ] [93|96|  |  ]&lt;br /&gt;
Ključ 37 umećemo između ključeva 33 i 40. Dešava se prelivanje u desni čvor, 40 završava u roditelju a 41 u desnom čvoru.&lt;br /&gt;
                             [15|23|40|80]&lt;br /&gt;
              /             /      |      \             \&lt;br /&gt;
 [ 2| 7| 9|10] [16|18|20|21] [24|27|33|37] [41|55|75|  ] [93|96|  |  ]&lt;br /&gt;
Ključ 19 umećemo između ključeva 18 i 20. Prelivanje u levog i desnog brata je nemoguće, pa se dešava prelom. Ključevi 16 i 18 ostaju u čvoru, 19 ide u roditeljski čvor, 20, 21 i 23 idu u novi čvor, 24 ide u roditeljski čvor i 27, 33 i 37 ostaju u desnom bratu. Prelom se dešava i u roditeljskom čvoru, tako da 15 i 19 idu u levo dete novog korena, 24 ide u novi koren a 40 i 80 idu u desno dete novog korena.&lt;br /&gt;
                                                 [24|  |  |  ]&lt;br /&gt;
                                        /                      \&lt;br /&gt;
               [15|19|  |  ]                                           [40|80|  |  ]&lt;br /&gt;
              /   |      \                                            /   |      \&lt;br /&gt;
 [ 2| 7| 9|10] [16|18|  |  ] [20|21|23|  ]               [27|33|37|  ] [41|55|75|  ] [93|96|  |  ]&lt;br /&gt;
Ključ 80 menjamo svojim sledbenikom, 93, pa ga brišemo iz lista. U listu ostaje nedovoljno mnogo ključeva, pa vršimo pozajmicu od levog brata. Tom prilikom se ključ 93 vraća nazad u list u kojem je bio a 75 dolazi na mesto gde je ranije bio ključ 80.&lt;br /&gt;
                                                 [24|  |  |  ]&lt;br /&gt;
                                        /                      \&lt;br /&gt;
               [15|19|  |  ]                                           [40|75|  |  ]&lt;br /&gt;
              /   |      \                                            /   |      \&lt;br /&gt;
 [ 2| 7| 9|10] [16|18|  |  ] [20|21|23|  ]               [27|33|37|  ] [41|55|  |  ] [93|96|  |  ]&lt;br /&gt;
Pri brisanju ključa 55 iz lista ostaje nedovoljno ključeva, pa pozajmljujemo od levog brata. Tom prilikom ključ 37 dolazi na mesto 40 u roditeljskom čvoru a 40 se spušta u list.&lt;br /&gt;
                                                 [24|  |  |  ]&lt;br /&gt;
                                        /                      \&lt;br /&gt;
               [15|19|  |  ]                                           [37|75|  |  ]&lt;br /&gt;
              /   |      \                                            /   |      \&lt;br /&gt;
 [ 2| 7| 9|10] [16|18|  |  ] [20|21|23|  ]               [27|33|  |  ] [40|41|  |  ] [93|96|  |  ]&lt;br /&gt;
Pri brisanju ključa 18 iz lista ostaje nedovoljno ključeva, pa pozajmljujemo od desnog brata. Tom prilikom ključ 20 ide u roditeljski čvor a ključ 19 se spušta u list.&lt;br /&gt;
                                                 [24|  |  |  ]&lt;br /&gt;
                                        /                      \&lt;br /&gt;
               [15|20|  |  ]                                           [37|75|  |  ]&lt;br /&gt;
              /   |      \                                            /   |      \&lt;br /&gt;
 [ 2| 7| 9|10] [16|19|  |  ] [21|23|  |  ]               [27|33|  |  ] [40|41|  |  ] [93|96|  |  ]&lt;br /&gt;
Brišemo ključ 9 iz lista.&lt;br /&gt;
                                                 [24|  |  |  ]&lt;br /&gt;
                                        /                      \&lt;br /&gt;
               [15|20|  |  ]                                           [37|75|  |  ]&lt;br /&gt;
              /   |      \                                            /   |      \&lt;br /&gt;
 [ 2| 7|10|  ] [16|19|  |  ] [21|23|  |  ]               [27|33|  |  ] [40|41|  |  ] [93|96|  |  ]&lt;br /&gt;
Ključ 15 menjamo svojim sledbenikom, 16, pa brišemo ključ iz lista. U tom listu ostaje nedovoljno mnogo ključeva, pa se pozajmljuje od levog brata tako što se ključ 16 vrati na svoje prethodno mesto a ključ 10 ode u roditeljski čvor.&lt;br /&gt;
                                                 [24|  |  |  ]&lt;br /&gt;
                                        /                      \&lt;br /&gt;
               [10|20|  |  ]                                           [37|75|  |  ]&lt;br /&gt;
              /   |      \                                            /   |      \&lt;br /&gt;
 [ 2| 7|  |  ] [16|19|  |  ] [21|23|  |  ]               [27|33|  |  ] [40|41|  |  ] [93|96|  |  ]&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se baza podataka studenata.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Ukoliko se zna da je najčešći upit nad zadatom bazom dohvatanje svih studenata koji su fakultet upisali u zadatom periodu (između dve godine), predložiti strukturu podataka koja bi podržala efikasno izvršavanje ovakvog upita i detaljno opisati razloge.&lt;br /&gt;
# Implementirati funkciju FIND_STUDENTS_IN_RANGE koja nad odabranom strukturom vrši pretragu i vraća rezultat upita navedenog pod tačkom a). Parametri funkcije su pokazivač na odabranu strukturu, početna godina i krajnja godina traženog perioda, respektivno. Rezultat vratiti u formi niza.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Struktura koja se ovde može upotrebiti je B+ stablo, jer nam dozvoljava lak sekvencijalni pristup (za izlistavanje svih studenata u rasponu od dve godine) kao i brzo pronalaženje prvog ključa (za prvog studenta iz raspona). Ključevi ovakvog stabla mogu biti kombinacija godine i broja indeksa studenta, tako da je godina primarni a broj indeksa sekundarni ključ.&lt;br /&gt;
&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND STUDENTS IN RANGE(structure, year1, year2)&lt;br /&gt;
p = structure&lt;br /&gt;
while (not IS_LEAF(p)) do&lt;br /&gt;
    for i = 1 to num(p) do&lt;br /&gt;
        if keys(p)[i] &amp;gt; year1 then&lt;br /&gt;
            p = pointers(p)[i-1]&lt;br /&gt;
            break&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    if i = num(p)+1 then&lt;br /&gt;
        p = pointers(p)[num(p)]&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
length = 0&lt;br /&gt;
q = p&lt;br /&gt;
key_index = 1&lt;br /&gt;
while (q ≠ nil) and (years(q)[key_index] ≤ year2) do&lt;br /&gt;
    length = length + 1&lt;br /&gt;
    if node_index = num(q) then&lt;br /&gt;
        key_index = 1&lt;br /&gt;
        q = next(q)&lt;br /&gt;
    else&lt;br /&gt;
        key_index = key_index + 1&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
arr = ALLOCATE(length)&lt;br /&gt;
for i = 1 to length do&lt;br /&gt;
    j = 1&lt;br /&gt;
    while j &amp;lt; num(p) and i &amp;lt; length do&lt;br /&gt;
        arr[i] = students(p)[j]&lt;br /&gt;
        i = i + 1&lt;br /&gt;
        j = j + 1&lt;br /&gt;
    end_while&lt;br /&gt;
    p = next(p)&lt;br /&gt;
end_for&lt;br /&gt;
return arr&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se za indeksnu strukturu datoteke koristi B stablo reda &#039;&#039;m&#039;&#039;. U okviru datoteke se smeštaju zapisi veličine 256 bitova zajedno sa 32-bitnim poljem ključa. Neka se na datom sistemu adrese predstavljaju na 64 bita. Odrediti vrednosti &#039;&#039;m&#039;&#039; u zavisnosti od toga da li se u čvoru B stabla smešta samo ključ ili čitav podataka, pod pretpostavkom da je veličina bloka na disku 2KB. Diskutovati rešenje.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Jedan čvor B stabla mora stati u jedan blok na disku, što je 2KiB, odnosno 2048B, odnosno 16384b. Zapis čvora obuhvata:&lt;br /&gt;
* &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; ključeva (32b) zajedno sa adresama njihovih zapisa (64b), odnosno u drugoj varijanti ceo zapis (256b)&lt;br /&gt;
* &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; adresa (64b) podstabala&lt;br /&gt;
Tako je veličina jednog čvora stabla u prvoj varijanti jednaka &amp;lt;math&amp;gt;(m-1) \cdot (32 + 64) + m \cdot 64 = m \cdot 96 + m \cdot 64 - 96 = m \cdot 160 - 96&amp;lt;/math&amp;gt;. Ako pretpostavimo da je ovo jednako veličini bloka, dobijamo &amp;lt;math&amp;gt;m \cdot 160 = 16480 \implies m = \frac{16480}{160} = 103&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
U drugoj varijanti, ako pretpostavimo da se ključ može zaključiti iz strukture pa se ne čuva odvojeno, veličina čvora je jednaka &amp;lt;math&amp;gt;(m-1) \cdot 256 + m \cdot 64 = m \cdot 256 - 256 + m \cdot 64 = m \cdot 320 - 256&amp;lt;/math&amp;gt;. Sa istom pretpostavkom dobijamo &amp;lt;math&amp;gt;m \cdot 320 = 16640 \implies m = \frac{16640}{320} = 52&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Heširanje.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Kako funkcioniše metod deljenja i koje su njegove osnovne osobine? Koje vrednosti delioca treba izbegavati?&lt;br /&gt;
# Neka je dat skup ključeva 19, 10, 4, 37, 49, 52. Ukoliko je poznatao da se prilikom heširanja koristi metod deljenja i veličina tabele &#039;&#039;n&#039;&#039; = 9, komentarisati izbor veličine tabele u odnosu na verovatnoću mogućih kolizija zadatog skupa ključeva. Predložiti alternativnu, blisku veličinu tabele kako bi se verovatnoća kolizija smanjila.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Metod deljenja funkcioniše tako što heš funkcija ima oblik &amp;lt;math&amp;gt;h(K) = K mod n&amp;lt;/math&amp;gt;, gde je &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; broj ulaza tabele. Loši brojevi &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; su parni brojevi, brojevi deljivi s 10 i, ako su svi ključevi kongurentni po modulu &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;, brojevi koji nisu uzajamno prosti sa &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Za dati skup ključeva dobijamo sledeću tabelu:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Heš tabela nakon umetanja datog skupa ključeva&lt;br /&gt;
|-&lt;br /&gt;
! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 !! 8&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
* 19&lt;br /&gt;
* 10&lt;br /&gt;
* 37&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
* 4&lt;br /&gt;
* 49&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| 52&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
Ovde se kolizija desila u 50% slučajeva. Predlažemo malo izmenjen broj ulaza &amp;lt;math&amp;gt;n = 8&amp;lt;/math&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Heš tabela nakon umetanja datog skupa ključeva s predloženom heš funkcijom&lt;br /&gt;
|-&lt;br /&gt;
! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| 49&lt;br /&gt;
| 10&lt;br /&gt;
| 19&lt;br /&gt;
|&lt;br /&gt;
* 4&lt;br /&gt;
* 52&lt;br /&gt;
| 37&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
Ovde se kolizija dešava u 16.66% slučajeva.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A2_2018&amp;diff=7810</id>
		<title>АСП2/К2 2018</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A2_2018&amp;diff=7810"/>
		<updated>2024-09-13T00:09:13Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K2_1819.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U 2-3-4 stablo sa slike ubaciti ključeve 17 i 25 i prikazati ekvivalentno crveno-crno stablo.&lt;br /&gt;
            [  |23|45]&lt;br /&gt;
           /   |     \&lt;br /&gt;
 [ 1|15|20] [28|36|  ] [  |72|  ]&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:ASP2 K2 2018 zadatak 1 stablo.svg|thumb|Ekvivalentno crveno-crno stablo u rešenju 1. zadatka.]]&lt;br /&gt;
Ključ 17 dolazi između ključeva 15 i 20. Pošto je taj čvor pun, crni ključ 15 ide u roditeljski čvor, ključ 1 dolazi u sredinu i postaje crn, ključ 20 se odvaja u desni čvor i postaje crn a ključ 17 završava kao crveni ključ levo od ključa 20.&lt;br /&gt;
            [15|23|45]&lt;br /&gt;
           /   |     \&lt;br /&gt;
 [  | 1|  ] [17|20|  ] [28|36|  ] [  |72|  ]&lt;br /&gt;
Ključ 25 dolazi levo od ključa 28.&lt;br /&gt;
                  [15|23|45]&lt;br /&gt;
              /      |  |      \&lt;br /&gt;
 [  | 1|  ] [17|20|  ] [25|28|36] [  |72|  ]&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
B+-stabla&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Prikazati maksimalno popunjeno B+-stablo reda &#039;&#039;m&#039;&#039; = 3 i visine &#039;&#039;h&#039;&#039; = 1. Odrediti za ovo stablo prosečan broj pristupa prilikom uspešne i neuspešne pretrage.&lt;br /&gt;
# Posmatra se B+-stablo reda 4 koje sadrži 7 ključeva. Odrediti za ovo stablo srednji broj pristupa prilikom uspešne i neuspešne pretrage i obrazložiti odgovor.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
        (2|4)&lt;br /&gt;
       /  |  \&lt;br /&gt;
 [1|2]-&amp;gt;[3|4]-&amp;gt;[5|6]&lt;br /&gt;
2 je prosečan broj pristupa i pri uspešnoj i pri neuspešnoj pretrazi.&lt;br /&gt;
          (3|5| )&lt;br /&gt;
        /   |   \&lt;br /&gt;
 [1|2|3]-&amp;gt;[4|5| ]-&amp;gt;[6|7| ]&lt;br /&gt;
Pretpostavljajući da se ovde radi o broju ključeva u listovima (pošto se ključevi iz unutrašnjih čvorova dupliciraju u listovima), prosečan broj pristupa je ponovo 2. Sve uspešne pretrage, kao i neuspešne, moraju završiti u listovima jer se samo u listovima nalaze pokazivači ka traženim strukturama, a visina ovako napravljenog stabla je 1.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se &#039;&#039;trie&#039;&#039; stablo čiji su ključevi znakovni nizovi koji sadrže cifre u brojnom sistemu sa osnovom 10. Napisati u pseudokodu funkciju koja za dato stablo na čiji koren pokazuje pokazivač &#039;&#039;root&#039;&#039; računa razliku najvećeg i najmanjeg tako predstavljenog broja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CALC(root)&lt;br /&gt;
if root = nil then&lt;br /&gt;
    return 0&lt;br /&gt;
end_if&lt;br /&gt;
min, max = CALC_R(root)&lt;br /&gt;
return max - min&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CALC R(root)&lt;br /&gt;
min = +∞&lt;br /&gt;
max = -∞&lt;br /&gt;
for i = 0 to 9 do&lt;br /&gt;
    field = fields(root)[i]&lt;br /&gt;
    if field ≠ nil then&lt;br /&gt;
        if is_leaf(field) then&lt;br /&gt;
            f_max = f_min = value(field)&lt;br /&gt;
        else&lt;br /&gt;
            f_max, f_min = CALC_R(field)&lt;br /&gt;
        end_if&lt;br /&gt;
        if f_max &amp;gt; max then&lt;br /&gt;
            max = f_max&lt;br /&gt;
        end_if&lt;br /&gt;
        if f_min &amp;lt; min then&lt;br /&gt;
            min = f_min&lt;br /&gt;
        end_if&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
return max, min&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se B stablo reda m u kojem su svi listovi minimalno popunjeni, a njihovi roditelji su popunjeni iznad minimuma. Iz takvog stabla se briše ključ key iz lista sa adresom node. Napisati iterativnu funkciju u pseudokodu za datu situaciju brisanja. Smatrati da u čvoru postoji pokazivač na roditelja i podatak o broju ključeva smeštenih u njemu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
B-DELETE-NO-BORROW(root, m, node, key)&lt;br /&gt;
child_index = 0&lt;br /&gt;
parent = parent(node)&lt;br /&gt;
for i = 0 to num(parent) do&lt;br /&gt;
    if pointers(parent)[i] = node then&lt;br /&gt;
        child_index = i&lt;br /&gt;
        break&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
if child_index = num(parent) then&lt;br /&gt;
    left_node = pointers(parent)[child_index-1]&lt;br /&gt;
    num(left_node) = num(left_node) + 1&lt;br /&gt;
    keys(left_node)[num(left_node)] = keys(parent)[child_index]&lt;br /&gt;
    for i = 1 to num(node) do&lt;br /&gt;
        if keys(node)[i] ≠ key then&lt;br /&gt;
            num(left_node) = num(left_node) + 1&lt;br /&gt;
            keys(left_node)[num(left_node)] = keys(node)[i]&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    FREENODE(node)&lt;br /&gt;
else&lt;br /&gt;
    right_node = pointers(parent)[child_index+1]&lt;br /&gt;
    offset = 0&lt;br /&gt;
    for i = 1 to num(node) do&lt;br /&gt;
        if keys(node)[i] = key then&lt;br /&gt;
            offset = 1&lt;br /&gt;
        else&lt;br /&gt;
            keys(node)[i-offset] = keys(node)[i]&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    keys(node)[num(node)] = keys(parent)[child_index+1]&lt;br /&gt;
    for i = 1 to num(right_node) do&lt;br /&gt;
        num(node) = num(node) + 1&lt;br /&gt;
        keys(node)[num(node)] = keys(right_node)[i]&lt;br /&gt;
    end_for&lt;br /&gt;
    for i = child_index to num(parent)-1 do&lt;br /&gt;
        keys(parent)[i+1] = keys(parent)[i+2]&lt;br /&gt;
        pointers(parent)[i] = pointers(parent)[i+1]&lt;br /&gt;
    end_for&lt;br /&gt;
    FREENODE(right_node)&lt;br /&gt;
end_if&lt;br /&gt;
num(parent) = num(parent) - 1&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U B* stablo reda 4 se umeću ključevi od 1 do 14. Nakon toga se redom brišu ključevi 4, 11 i 9. Nacrtati izgled stabla nakon svake izmene.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Red stabla: &amp;lt;math&amp;gt;m = 4&amp;lt;/math&amp;gt;&lt;br /&gt;
* Minimalni broj ključeva u ne-korenskom čvoru: &amp;lt;math&amp;gt;\left\lceil\frac{2m - 1}{3}\right\rceil - 1 = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
* Maksimalni broj ključeva u korenu: &amp;lt;math&amp;gt;2 \left\lfloor\frac{2m - 2}{3}\right\rfloor = 4&amp;lt;/math&amp;gt;&lt;br /&gt;
* Raspodela ključeva pri prelomu: 2-2-2&lt;br /&gt;
Umećemo ključ 1 u prazno stablo.&lt;br /&gt;
 [ 1|  |  |  ]&lt;br /&gt;
Umećemo ključ 2.&lt;br /&gt;
 [ 1| 2|  |  ]&lt;br /&gt;
Umećemo ključ 3.&lt;br /&gt;
 [ 1| 2| 3|  ]&lt;br /&gt;
Umećemo ključ 4.&lt;br /&gt;
 [ 1| 2| 3| 4]&lt;br /&gt;
Pri umetanju ključa 5 dolazi do prelamanja čvora, tako da ključevi 1 i 2 idu u levi a 4 i 5 u desni čvor.&lt;br /&gt;
          [ 3|  |  |  ]&lt;br /&gt;
          |  |&lt;br /&gt;
 [ 1| 2|  ] [ 4| 5|  ]&lt;br /&gt;
Umećemo ključ 6.&lt;br /&gt;
          [ 3|  |  |  ]&lt;br /&gt;
          |  |&lt;br /&gt;
 [ 1| 2|  ] [ 4| 5| 6]&lt;br /&gt;
Pri umetanju ključa 7 desni čvor se prepunjuje, pa se dešava prelivanje u levi čvor. Ključ 3 iz roditeljskog čvora silazi u levi a ključ 4 iz desnog ide u roditeljski.&lt;br /&gt;
          [ 4|  |  |  ]&lt;br /&gt;
          |  |&lt;br /&gt;
 [ 1| 2| 3] [ 5| 6| 7]&lt;br /&gt;
Pri umetanju ključa 8 desni čvor se ponovo prepunjuje, pa se dešava prelamanje. Ključevi 1 i 2 ostaju u levom čvoru, ključ 3 ide u roditeljski čvor, 4 i 5 dolaze u novi, srednji čvor, 6 ide u roditeljski čvor a 7 i 8 ostaju u desnom čvoru.&lt;br /&gt;
            [ 3| 6|  |  ]&lt;br /&gt;
           /   |     \&lt;br /&gt;
 [ 1| 2|  ] [ 4| 5|  ] [ 7| 8|  ]&lt;br /&gt;
Umećemo ključ 9.&lt;br /&gt;
            [ 3| 6|  |  ]&lt;br /&gt;
           /   |     \&lt;br /&gt;
 [ 1| 2|  ] [ 4| 5|  ] [ 7| 8| 9]&lt;br /&gt;
Pri umetanju ključa 10 dešava se prelivanje iz desnog u srednji čvor.&lt;br /&gt;
            [ 3| 7|  |  ]&lt;br /&gt;
           /   |     \&lt;br /&gt;
 [ 1| 2|  ] [ 4| 5| 6] [ 8| 9|10]&lt;br /&gt;
Pri umetanju ključa 11 dešava se prelamanje.&lt;br /&gt;
              [ 3| 6| 9|  ]&lt;br /&gt;
            /    |    \        \&lt;br /&gt;
 [ 1| 2|  ] [ 4| 5|  ] [ 7| 8|  ] [10|11|  ]&lt;br /&gt;
Umećemo ključ 12.&lt;br /&gt;
              [ 3| 6| 9|  ]&lt;br /&gt;
            /    |    \        \&lt;br /&gt;
 [ 1| 2|  ] [ 4| 5|  ] [ 7| 8|  ] [10|11|12]&lt;br /&gt;
Pri umetanju ključa 13 dešava se prelivanje.&lt;br /&gt;
              [ 3| 6|10|  ]&lt;br /&gt;
            /    |    \        \&lt;br /&gt;
 [ 1| 2|  ] [ 4| 5|  ] [ 7| 8| 9] [11|12|13]&lt;br /&gt;
Pri umetanju ključa 14 dešava se prelamanje.&lt;br /&gt;
                     [ 3| 6| 9|12]&lt;br /&gt;
            /         /    |    \        \&lt;br /&gt;
 [ 1| 2|  ] [ 4| 5|  ] [ 7| 8|  ] [10|11|  ] [13|14|  ]&lt;br /&gt;
Pri brisanju ključa 4, zbog nemogućnosti pozajmice, spajanje tri čvora u dva.&lt;br /&gt;
                  [ 5| 9| 12 |]&lt;br /&gt;
            /         /      |        \&lt;br /&gt;
 [ 1| 2| 3 ] [ 6| 7| 8 ]  [ 10|11| ] [13|14| ]&lt;br /&gt;
Pri brisanju ključa 11 moguća je pozajmica, ali od levog brata.&lt;br /&gt;
                  [ 5| 8| 12 |]&lt;br /&gt;
            /         /      |        \&lt;br /&gt;
 [ 1| 2| 3 ] [ 6| 7|]  [ 9 |10| ] [13|14| ]&lt;br /&gt;
Pri brisanju ključa 9 moguća je pozajmica ali od brata sa udaljenošću dva.&lt;br /&gt;
                 [ 3| 7| 12 |]&lt;br /&gt;
            /         /      |        \&lt;br /&gt;
 [ 1| 2| ] [ 5| 6| ]  [ 8 |10| ] [13|14| ]&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je digitalno stablo formirano od nekog skupa ključeva tipa znakovnih nizova. Implementirati funkciju COUNT_KEYS koja pronalazi broj ključeva u stablu koji odgovaraju zadatom formatu znakovnog niza. Pokazivač na koren stabla i zadati format su prosleđeni kao parametri funkcije. Format znakovnog niza pored cifara i slova može sadržati i simbole koji imaju specijano značenje. Specijalni simboli su tačka (.) koja menja bilo koji znak niza i zvezda (*) koja predstavlja ponavljanje nekog znaka niza 0 ili više puta. Smatrati da se zvezda odnosi na prvi znak koji joj prethodi.&lt;br /&gt;
&lt;br /&gt;
Primer:&lt;br /&gt;
&lt;br /&gt;
skup ključeva u stablu: abccc4a, ab3a, aacda&lt;br /&gt;
&lt;br /&gt;
format: abc*.a&lt;br /&gt;
&lt;br /&gt;
rezultat: 2 &lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
COUNT KEYS(root, format)&lt;br /&gt;
len = STRING_LENGTH(format)&lt;br /&gt;
if len = 0 then&lt;br /&gt;
    if key(node) = EOK then&lt;br /&gt;
        return 1&lt;br /&gt;
    else&lt;br /&gt;
        return 0&lt;br /&gt;
    end_if&lt;br /&gt;
end_if&lt;br /&gt;
count = 0&lt;br /&gt;
for i = 1 to num(root) do&lt;br /&gt;
    node = pointers(root)[i]&lt;br /&gt;
    if (len &amp;gt; 1) and (format[2] = &#039;*&#039;) then&lt;br /&gt;
        if (key(node) = format[1]) or (format[1] = &#039;.&#039;) then&lt;br /&gt;
            count = count + COUNT_KEYS(node, format)&lt;br /&gt;
        end_if&lt;br /&gt;
    else if (key(node) = format[1]) or (format[1] = &#039;.&#039;) then&lt;br /&gt;
        count = count + COUNT_KEYS(node, format + 1)&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
if (len &amp;gt; 1) and (format[2] = &#039;*&#039;) then&lt;br /&gt;
    count = count + COUNT_KEYS(root, format + 2)&lt;br /&gt;
end_if&lt;br /&gt;
return count&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se u &#039;&#039;top-down&#039;&#039; stablo &#039;&#039;m&#039;&#039;-arnog pretraživanja redom ubacuju ključevi &#039;&#039;k&#039;&#039;, 2&#039;&#039;k&#039;&#039;, 3&#039;&#039;k&#039;&#039;, …, &#039;&#039;nk&#039;&#039;, &#039;&#039;nk&#039;&#039; – 1, &#039;&#039;nk&#039;&#039; – 2, &#039;&#039;nk&#039;&#039; – 3, …, &#039;&#039;n&#039;&#039;(&#039;&#039;k&#039;&#039; – 1) +1. Nacrtati izgled stabla i odrediti visinu. Pretpostaviti da su &#039;&#039;n&#039;&#039; i &#039;&#039;k&#039;&#039; mnogo veći od &#039;&#039;m&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Nakon ubacivanja ključa &#039;&#039;nk&#039;&#039; dobiće se degenerisano stablo udesno, tj. jedino najdesniji pokazivači u svakom unutrašnjem čvoru će pokazivati na sledeći list, i većina ključeva će biti popunjena, tako da će visina stabla biti &amp;lt;math&amp;gt;\left\lceil\frac{n}{m - 1}\right\rceil&amp;lt;/math&amp;gt; a u listu će ostati &amp;lt;math&amp;gt;(m - 1) - (n \bmod (m - 1))&amp;lt;/math&amp;gt; slobodnih mesta. Nakon ubacivanja svih ključeva stablo će u listovima krenuti da raste ulevo iz listova, tako da će visina porasti na ukupno: &amp;lt;math&amp;gt;h = \left\lceil\frac{n}{m - 1}\right\rceil + \left\lceil\frac{n - 1 - (m - 1) + (n \bmod (m - 1))}{m - 1}\right\rceil&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Heširanje.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Šta je minimalna savršena heš funkcija?&lt;br /&gt;
# Za ključeve 54, 91, 57, 23 i 28 naći što jednostavniju minimalnu savršenu heš funkciju i ispisati je. Obrazložiti odgovor i nacrtati heš tabelu sa umetnutim ključevima.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Minimalna savršena heš funkcija je heš funkcija koja preslikava &#039;&#039;n&#039;&#039; ključeva u &#039;&#039;n&#039;&#039; ulaza tabele bez kolizije.&lt;br /&gt;
# Jedna moguća savršena heš funkcija je &amp;lt;math&amp;gt;h(K) = \left\lfloor\frac{K}{2}\right\rfloor \mod 5&amp;lt;/math&amp;gt;. Kad sortiramo ključeve, dobijamo redosled 23, 28, 54, 57. Možemo primetiti da su oni svi različiti po modulu 10, ali pošto tabela ima 5 ulaza možemo prvo podeliti ključeve sa dva pa uzeti vrednost po modulu 5. Tabela nakon primene ove heš funkcije je data ispod.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela nakon primene heš funkcije&lt;br /&gt;
! 0 !! 1 !! 2 !! 3 !! 4&lt;br /&gt;
|-&lt;br /&gt;
| 91 || 23 || 54 || 57 || 28&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A2_2017&amp;diff=7809</id>
		<title>АСП2/К2 2017</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A2_2017&amp;diff=7809"/>
		<updated>2024-09-13T00:09:12Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K2_1718.pdf Postavka zadataka na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U trie stablo umetnuti ključeve 35, 128, 1236, 1234 i 125, a zatim obrisati ključ 1234. Prikazati izgled stabla nakon poslednjeg umetanja i nakon brisanja. Izračunati prosečan broj pristupa pri uspešnoj pretrazi.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ispod su data trie stabla nakon umetanja i nakon brisanja. Broj pristupa pri pretraživanju na ključ 35 je 3, pri pretraživanju na 128 i 125 je 4 a pri pretraživanju na 1236 je 5, tako da je prosečan broj pristupa pri uspešnom pretraživanju &amp;lt;math&amp;gt;\frac{3 + 4 + 4 + 5}{4} = 4&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
  ASP2 K2 2017 zadatak 1 stablo umetanje.svg | Trie stablo dobijeno nakon umetanja.&lt;br /&gt;
  ASP2 K2 2017 zadatak 1 stablo brisanje.svg | Trie stablo dobijeno nakon brisanja.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se uz ključeve B stabla reda &#039;&#039;m&#039;&#039; čuva i broj pristupa podatku pridruženom tom čvoru. Ključevi čijim podacima se češće pristupa treba da se nađu što bliže korenu stabla. Objasniti kako bi trebalo modifikovati strukturu i operacije pretraživanja i brisanja da bi se to realizovalo.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu funkciju za umetanje ključa u B+ stablo reda &#039;&#039;m&#039;&#039; na čiji koren ukazuje pokazivač &#039;&#039;root&#039;&#039;. Pretpostaviti da otac lista u koji se vrši umetanje nije maksimalno popunjen. Smatrati da je struktura čvora fiksna i da čvor sadrži alociran prostor za maksimalan broj ključeva i pokazivača. Dodatno, svaki čvor sadrži pokazivač na oca i podatak o broju ključeva smeštenih u njemu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvo pronalazimo list u koji umećemo, čuvajući indeks našeg podstabla u roditeljskom čvoru (&amp;lt;code&amp;gt;parent_index&amp;lt;/code&amp;gt;) i bacajući grešku ukoliko naiđemo na postojeći ključ s istom vrednošću. Zatim formiramo stablo ukoliko roditeljski čvor ne postoji ili formiramo novi poredak ključeva u čvoru u pomoćnom nizu (&amp;lt;code&amp;gt;arr&amp;lt;/code&amp;gt;) sa dovoljno alociranog mesta. Ako se radi o umetanju u pun čvor, u starom čvoru ostavljamo pola ključeva, alociramo novi čvor u koji ubacujemo drugo pola ključeva a najveći ključ ubacujemo u roditeljski čvor i ažuriramo pokazivače i ulančanu listu.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
B PLUS INSERT(root, m, key)&lt;br /&gt;
new_key_index = ceil(m/2) + 1&lt;br /&gt;
p = root&lt;br /&gt;
prev = nil&lt;br /&gt;
while p ≠ nil do&lt;br /&gt;
    for i = 1 to num(p) do&lt;br /&gt;
        if keys(p)[i] = key then&lt;br /&gt;
            ERROR(Key already inserted)&lt;br /&gt;
        else if keys(p)[i] &amp;gt; key then&lt;br /&gt;
            prev = p&lt;br /&gt;
            p = pointers(p)[i-1]&lt;br /&gt;
            parent_index = i-1&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    if i = num(p)+1 then&lt;br /&gt;
        prev = p&lt;br /&gt;
        p = pointers(p)[i-1]&lt;br /&gt;
        parent_index = i-1&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
if prev = nil then&lt;br /&gt;
    root = GETNODE&lt;br /&gt;
    num(root) = 1&lt;br /&gt;
    keys(root)[1] = key&lt;br /&gt;
else&lt;br /&gt;
    inserted = false&lt;br /&gt;
    for i = 1 to m do&lt;br /&gt;
        if ((i = m) or (keys(prev)[i] = nil) or (keys(prev)[i] &amp;gt; key)) and (not inserted) then&lt;br /&gt;
            inserted = true&lt;br /&gt;
            arr[i] = key&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    if num(prev) = m-1 then&lt;br /&gt;
        for i = 1 to new_key_index-1 do&lt;br /&gt;
            keys(prev)[i] = arr[i]&lt;br /&gt;
        end_for&lt;br /&gt;
        new_node = GETNODE&lt;br /&gt;
        num(new_node) = m + 1 - new_key_index&lt;br /&gt;
        num(prev) = new_key_index-1&lt;br /&gt;
        for i = new_key_index to m do&lt;br /&gt;
            keys(new_node)[i-new_key_index+1] = arr[i]&lt;br /&gt;
        end_for&lt;br /&gt;
        for i = num(parent(prev)) downto parent_index do&lt;br /&gt;
            pointers(parent(prev))[i+1] = pointers(parent(prev))[i]&lt;br /&gt;
            keys(parent(parent))[i] = keys(parent(parent))[i-1]&lt;br /&gt;
        end_for&lt;br /&gt;
        keys(parent(prev))[parent_index+1] = keys(prev)[num(prev)]&lt;br /&gt;
        pointers(parent(prev))[parent_index+1] = new_node&lt;br /&gt;
        next(new_node) = next(prev)&lt;br /&gt;
        next(prev) = new_node&lt;br /&gt;
    else&lt;br /&gt;
        for i = 1 to num(prev)+1 do&lt;br /&gt;
            keys(prev)[i] = arr[i]&lt;br /&gt;
        end_for&lt;br /&gt;
        num(prev) = num(prev)+1&lt;br /&gt;
    end_if&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na primeru B* stabla reda 5 sa slike, prikazati i objasniti situaciju brisanja ključa kada dolazi do spajanja čvorova po sistemu „3-u-2“.&lt;br /&gt;
                       [13|54|78|  ]&lt;br /&gt;
                   /      /     \       \&lt;br /&gt;
 [6 |9 |  |  ] [27|37|  |  ] [57|60|65|  ] [80|85|90|  ]&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Iz datog primera nije moguće odmah izvršiti brisanje tako da se spoje čvorovi, tako da prvo brišemo ključ 9. Dešava se pozajmica od drugog desnog brata, tako da 13 silazi u čvor iz kojeg je izbačeno, 27 ide u koren, 54 silazi u čvor iz kojeg je izašlo 27 a 57 ide u koren.&lt;br /&gt;
                       [27|57|78|  ]&lt;br /&gt;
                   /      /     \       \&lt;br /&gt;
 [6 |13|  |  ] [37|54|  |  ] [60|65|  |  ] [80|85|90|  ]&lt;br /&gt;
Zatim izbacujemo ključ 13. Dešava se spajanje tako što tretiramo 6, 27, 37, 54, 57, 60, 65 kao sortiran niz, njegov srednji ključ šaljemo u koren, njegovu levu polovinu u levo dete a desnu u desno dete tog srednjeg ključa.&lt;br /&gt;
                       [54|78|  |  ]&lt;br /&gt;
                   /     /    \&lt;br /&gt;
 [6 |27|37|  ] [57|60|65|  ] [80|85|90|  ]&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu funkciju koja crveno-crno stablo, dato pokazivačem na koren &#039;&#039;root&#039;&#039;, pretvara u 2-3-4 stablo i vraća pokazivač na njegov koren. Čvor crveno-crnog stabla sadrži informaciju o boji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Odvajamo na slučajeve 2-čvora, 3-čvora i 4-čvora i rekurzivno transformišemo čvorove crveno-crnog stabla.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
TRANSFORM(root)&lt;br /&gt;
if root = nil then&lt;br /&gt;
    return nil&lt;br /&gt;
end_if&lt;br /&gt;
new_node = GETNODE&lt;br /&gt;
if (left(root) ≠ nil) and (red(left(root))) and (right(root) ≠ nil) and (red(right(root))) then&lt;br /&gt;
    keys(new_node)[1] = key(left(root))&lt;br /&gt;
    keys(new_node)[2] = key(root)&lt;br /&gt;
    keys(new_node)[3] = key(right(root))&lt;br /&gt;
    pointers(new_node)[0] = TRANSFORM(left(left(root)))&lt;br /&gt;
    pointers(new_node)[1] = TRANSFORM(right(left(root)))&lt;br /&gt;
    pointers(new_node)[2] = TRANSFORM(left(right(root)))&lt;br /&gt;
    pointers(new_node)[3] = TRANSFORM(right(right(root)))&lt;br /&gt;
else if (left(root) ≠ nil) and (red(left(root))) then&lt;br /&gt;
    keys(new_node)[1] = key(left(root))&lt;br /&gt;
    keys(new_node)[2] = key(root)&lt;br /&gt;
    pointers(new_node)[0] = TRANSFORM(left(left(root)))&lt;br /&gt;
    pointers(new_node)[1] = TRANSFORM(right(left(root)))&lt;br /&gt;
    pointers(new_node)[2] = TRANSFORM(right(root))&lt;br /&gt;
else if (right(root) ≠ nil) and (red(right(root))) then&lt;br /&gt;
    keys(new_node)[2] = key(root)&lt;br /&gt;
    keys(new_node)[3] = key(right(root))&lt;br /&gt;
    pointers(new_node)[1] = TRANSFORM(left(root))&lt;br /&gt;
    pointers(new_node)[2] = TRANSFORM(left(right(root)))&lt;br /&gt;
    pointers(new_node)[3] = TRANSFORM(right(right(root)))&lt;br /&gt;
else&lt;br /&gt;
    keys(new_node)[2] = key(root)&lt;br /&gt;
    pointers(new_node)[1] = TRANSFORM(left(root))&lt;br /&gt;
    pointers(new_node)[2] = TRANSFORM(right(root))&lt;br /&gt;
end_if&lt;br /&gt;
return new_node&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U digitalnom stablu implementiranom po principu levi sin – desni brat smeštaju se ključevi sa alfa-numeričkim vrednostima. Implemetirati funkciju za uklanjanje svih ključeva koji počinju prefiksom koji je prosleđen kao parametar funkcije. Vrednosti znakova koji predstavljaju „braću“ u stablu uređene su rastuće prema leksikografskom poretku.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Odvajamo rešenje na tri rekurzivne funkcije, traženu, funkciju za silazak niz stablo do čvora sa traženim prefiksom i funkciju za brisanje svih čvorova u podstablu.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DELETE KEYS(prefix)&lt;br /&gt;
TRAVERSE(prefix, root, nil)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
Funkcija za silazak niz stablo kao treći i četvrti argument prima pokazivače na bratski i/ili roditeljski čvor u kojima je potrebno ažurirati pokazivače na čvor koji se izbacuje.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
TRAVERSE(prefix, root, parent, sibling)&lt;br /&gt;
if root = nil then&lt;br /&gt;
    return&lt;br /&gt;
end_if&lt;br /&gt;
len = STRING_LENGTH(prefix)&lt;br /&gt;
if (len = 1) and (prefix[0] = value(root)) then&lt;br /&gt;
    if parent ≠ nil then&lt;br /&gt;
        left(parent) = right(root)&lt;br /&gt;
    end_if&lt;br /&gt;
    if sibling ≠ nil then&lt;br /&gt;
        right(sibling) = right(root)&lt;br /&gt;
    end_if&lt;br /&gt;
    DELETE(left(root))&lt;br /&gt;
    FREENODE(root)&lt;br /&gt;
else if (len &amp;gt; 1) and (prefix[0] = value(root)) then&lt;br /&gt;
    TRAVERSE(prefix+1, left(root), root, nil)&lt;br /&gt;
else&lt;br /&gt;
    TRAVERSE(prefix, right(root), nil, root)&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DELETE(root)&lt;br /&gt;
if root ≠ nil then&lt;br /&gt;
    DELETE(left(root))&lt;br /&gt;
    DELETE(right(root))&lt;br /&gt;
    FREENODE(root)&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka &#039;&#039;top-down&#039;&#039; stablo &#039;&#039;m&#039;&#039;-arnog pretraživanja ima &#039;&#039;n&#039;&#039; ključeva:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Izvesti i objasniti izraze za maksimalnu i minimalnu visinu ovog stabla.&lt;br /&gt;
# Koliko najmanje i koliko najviše čvorova može imati ovo stablo. Objasniti.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Maksimalna visina ovakvog stabla se dobija kada napravimo degenerisano stablo umetanjem sortiranog niza ključeva u njega. Tom prilikom će svaki čvor biti popunjen sa &#039;&#039;m-1&#039;&#039; ključeva (osim možda čvora na poslednjem nivou) i na svakom nivou će biti po jedan čvor, čime se dobija visina &amp;lt;math&amp;gt;h = \left\lceil\frac{n}{m-1}\right\rceil&amp;lt;/math&amp;gt;. Minimalna visina se dobija u skoro-kompletnom stablu. Na svakom nivou takvog stabla nalazi se &amp;lt;math&amp;gt;m^h&amp;lt;/math&amp;gt; čvorova, tako da za stablo visine &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; imamo da je ukupan broj čvorova &amp;lt;math&amp;gt;m^0 + m^1 + m^2 + ... + m^h = \frac{m^{h+1} - 1}{m-1} = \left\lceil\frac{n}{m-1}\right\rceil&amp;lt;/math&amp;gt;, iz čega dobijamo &amp;lt;math&amp;gt;h = \left\lceil\log_m\left(n + 1\right)\right\rceil - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Broj ključeva potrebnih da bi se napravilo &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; čvorova je &amp;lt;math&amp;gt;2m-2&amp;lt;/math&amp;gt;, tako što napunimo jedan čvor a zatim u njegovu decu stavimo po još jedan ključ (ne računajući jedan ključ koji iskoristimo da formiramo koren), tako da je najveći broj čvorova za fiksirano &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; jednako &amp;lt;math&amp;gt;m \cdot \frac{n-1}{2m-2}&amp;lt;/math&amp;gt;. S druge strane, najmanji broj čvorova dobijamo kada popunimo svaki čvor do maksimuma, što je jednako maksimalnoj visini ovakvog stabla.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Neka je dat neki celobrojni ključ &#039;&#039;key&#039;&#039;. Interpretirati ga kao broj u dekadnom sistemu, a zatim napisati heš funkciju H(&#039;&#039;key&#039;&#039;) koja po metodu konverzije osnove hešira ključ u tabelu T od 100 ulaza.&lt;br /&gt;
# Ako &#039;&#039;n&#039;&#039; ključeva iz niza &#039;&#039;K&#039;&#039; treba da se mapira u heš tabelu gornjom funkcijom, napisati funkciju koja izračunava broj klasa ekvivalencije.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Za osnovu u koju konvertujemo biramo 13, jer je uzajamno prosto sa 10.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
H(key)&lt;br /&gt;
q = 13&lt;br /&gt;
p = key&lt;br /&gt;
num = 0&lt;br /&gt;
exp = 1&lt;br /&gt;
while p &amp;gt; 0 do&lt;br /&gt;
    num = num + (p % 10) * exp&lt;br /&gt;
    p = p / 10&lt;br /&gt;
    exp = exp * 13&lt;br /&gt;
end_while&lt;br /&gt;
return num % 100&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
EQUIV CLASS(K, n)&lt;br /&gt;
for i = 0 to 99 do&lt;br /&gt;
    arr[i] = false&lt;br /&gt;
end_for&lt;br /&gt;
num_classes = 0&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    k = H(K[i])&lt;br /&gt;
    if (not arr[k]) then&lt;br /&gt;
        num_classes = num_classes + 1&lt;br /&gt;
    end_if&lt;br /&gt;
    arr[k] = true&lt;br /&gt;
end_for&lt;br /&gt;
return num_classes&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A2_2016&amp;diff=7808</id>
		<title>АСП2/К2 2016</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A2_2016&amp;diff=7808"/>
		<updated>2024-09-13T00:09:11Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K2_1617.pdf Postavka zadataka na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U digitalno stablo umetnuti ključeve 25, 23, 367, 3698, 3692, 4, a zatim obrisati ključeve 367 i 23. Koristiti reprezentaciju „najlevlji sin – desni brat“. Prikazati stablo nakon poslednjeg umetanja i brisanja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ispod su data stabla nakon poslednjeg umetanja i brisanja.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
  ASP2 K2 2016 zadatak 1 stablo umetanje.svg | Stablo nakon poslednjeg umetanja.&lt;br /&gt;
  ASP2 K2 2016 zadatak 1 stablo brisanje.svg | Stablo nakon poslednjeg brisanja.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Izomorfizam crveno-crnih stabala i 2-3-4 stabala.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Na koji način se vrši umetanje u pun čvor 2-3-4 stabla da bi se očuvao izomorfizam sa crveno crnim stablima? Da li postoje razlike u odnosu na klasično B stablo?&lt;br /&gt;
# U 2-3-4 stablo sa slike umetnuti ključeve 30 i 35. Nacrtati izgled stabla posle svake od izmena i označiti crvene i crne čvorove.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
                  [25|44|58]&lt;br /&gt;
              /      |  |        \&lt;br /&gt;
 [  |15|  ] [27|37|  ] [  |47|50] [  |60|  ]&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pri umetanju u pun čvor 2-3-4 stabla dešava se prelom. Razlika je u tome da crni ključ uvek ide u koren a trenutni čvor se razdvaja na dva čvora, u levom čvoru kao crni ključ dolazi levi crveni ključ prethodnog čvora, u desnom kao crni ključ dolazi desni crveni ključ prethodnog čvora a novoumetnuti ključ postaje crven u levom ili desnom čvoru u zavisnosti od toga da li je manji ili već od crnog ključa iz prethodnog čvora.&lt;br /&gt;
&lt;br /&gt;
Ključ 30 umećemo u list i tom prilikom se ključ 37 pomera kao crveni.&lt;br /&gt;
                  [25|44|58]&lt;br /&gt;
              /      |  |        \&lt;br /&gt;
 [  |15|  ] [27|30|37] [  |47|50] [  |60|  ]&lt;br /&gt;
Ključ 35 umećemo u taj isti list i tom prilikom se dešava prelom, 27 postaje crni ključ levog čvora, 37 postaje crni ključ desnog čvora, ključ 30 ide u koren a ključ 35 postaje levi crveni ključ desnog čvora. Prelom se dešava i u korenu, tako da 25 postaje crni ključ levog čvora, 58 postaje crni ključ desnog čvora, 44 ide u novi koren a 30 postaje desni crveni ključ levog čvora.&lt;br /&gt;
                         [  |44|  ]&lt;br /&gt;
                        /          \&lt;br /&gt;
            [  |25|30]                 [  |58|  ]&lt;br /&gt;
           /    |     \                   |  |&lt;br /&gt;
 [  |15|  ] [  |27|  ] [35|37|  ] [  |47|50] [  |60|  ]&lt;br /&gt;
Bojenje ovde neće biti odrađeno, ali crni ključevi su 15, 27, 25, 44, 58, 47 i 60, a svi ostali su crveni.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je B stablo reda &#039;&#039;m&#039;&#039;. Napisati u pseudokodu funkciju koja vrši pozajmicu ključeva prilikom brisanja. Ukoliko je pozajmica nemoguća, funkcija treba da signalizira grešku. Funkcija dobija pokazivač na čvor &#039;&#039;node&#039;&#039; za koji se pokušava pozajmica. Smatrati da svaki čvor sadrži pokazivač na oca i podatak o broju ključeva smeštenih u njemu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvo proveravamo da li pozajmljujemo u čvoru koji se nalazi u praznom stablu ili u čvoru koji je koren i u tom slučaju signaliziramo grešku. Ukoliko se u čvoru nalazi dovoljan broj ključeva, pozajmica je nepotrebna pa samo izlazimo iz funkcije. Zatim, nalazimo koji je indeks trenutnog čvora u nizu pokazivača na decu njegovog roditelja i na osnovu toga pronalazimo njegovu braću, prvo desnog pa levog. Ako braća ne postoje ili nemaju dovoljno čvorova signaliziramo grešku, u suprotnom premeštamo ključeve i prevezujemo pokazivače.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
B-DEL-BORROW(node)&lt;br /&gt;
min_nodes = ceil(m/2)-1&lt;br /&gt;
if (node = nil) or (parent(node) = nil) then&lt;br /&gt;
    ERROR(Borrow impossible)&lt;br /&gt;
end_if&lt;br /&gt;
if (num(node) ≥ min_nodes) then&lt;br /&gt;
    return&lt;br /&gt;
end_if&lt;br /&gt;
parent = parent(node)&lt;br /&gt;
for i = 0 to num(parent) do&lt;br /&gt;
    if pointers(parent)[i] = node then&lt;br /&gt;
        parent_index = i&lt;br /&gt;
        break&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
if (parent_index &amp;lt; num(parent)) and (num(pointers(parent)[parent_index+1]) &amp;gt; min_nodes) then&lt;br /&gt;
    sibling = pointers(parent)[parent_index+1]&lt;br /&gt;
    keys(node)[num(node)+1] = keys(parent)[parent_index+1]&lt;br /&gt;
    keys(parent)[parent_index+1] = keys(sibling)[1]&lt;br /&gt;
    num(node) = num(node)+1&lt;br /&gt;
    num(sibling) = num(sibling)-1&lt;br /&gt;
    pointers(node)[num(node)] = pointers(sibling)[0]&lt;br /&gt;
    for i = 0 to num(sibling) do&lt;br /&gt;
        pointers(sibling)[i] = pointers(sibling)[i+1]&lt;br /&gt;
        if i &amp;lt; num(sibling) then&lt;br /&gt;
            keys(sibling)[i+1] = keys(sibling)[i+2]&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
else if (parent_index &amp;gt; 0) and (num(pointers(parent)[parent_index-1]) &amp;gt; min_nodes) then&lt;br /&gt;
    sibling = pointers(parent)[parent_index-1]&lt;br /&gt;
    for i = num(node) downto 0 do&lt;br /&gt;
        pointers(node)[i+1] = pointers(node)[i]&lt;br /&gt;
        if i &amp;lt; num(node) then&lt;br /&gt;
            keys(node)[i+2] = keys(node)[i+1]&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    keys(node)[1] = keys(parent)[parent_index]&lt;br /&gt;
    keys(parent)[parent_index] = keys(sibling)[num(sibling)]&lt;br /&gt;
    pointers(node)[0] = pointers(sibling)[num(sibling)]&lt;br /&gt;
    num(node) = num(node)+1&lt;br /&gt;
    num(sibling) = num(sibling)-1&lt;br /&gt;
else&lt;br /&gt;
    ERROR(Borrow impossible)&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[Датотека:ASP2 K2 2016 zadatak 4 graf.svg|thumb|Graf iz postavke 4. zadatka.]]&lt;br /&gt;
Neka se zbog uštede memorije za smeštanje ključeva koji imaju zajedničke sufikse umesto digitalnog stabla koristi usmereni aciklični graf, kao na slici. Objasniti na koji način bi se implementirale operacije pretraživanja i brisanja ključa.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretraživanje ključa se implementira isto kao i kod digitalnog stabla ako se za implementaciju grafa koristi lista susednosti. Brisanje ključa se vrši tako što prilikom pretraživanja pamtimo poslednji čvor sa izlaznim stepenom većim od 1 (kraj zajedničkog prefiksa) i prvi čvor sa ulaznim stepenom većim od 1 (početak zajedničkog sufiksa) i brišemo sve čvorove između ta dva. Ako ovaj drugi čvor ne postoji, brišemo sve od prvog do kraja ključa (sufiks je jedinstven) a ako ovaj prvi čvor ne postoji brišemo celo stablo (prefiks je jedinstven, što znači da postoji samo jedna reč u stablu).&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neki sistem datoteka koristi B+ stabla za indeksiranje datoteka unutar kataloga. Veličina čvora B+ stabla je 256b, a pokazivači zauzimaju 16b. Za smeštanje ključa B+ stabla koristi se 64b.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Za date parametre, odrediti maksimalni red stabla.&lt;br /&gt;
# Neka se posmatra katalog u kojem već postoje datoteke, sa ključevima 6, 12, 18, 45, 58, 66, 73, 81. Pod pretpostavkom da su svi listovi popunjeni minimalnim brojem ključeva, nacrtati inicijalni izgled B+ stabla za indeksiranje takvog kataloga. Nakon toga, u katalog se dodaju datoteke sa ključevima 41, 53, 32, a potom se brišu datoteke sa ključevima 12 i 66. Nacrtati izgled stabla posle svakog umetanja i brisanja. Red stabla je određen vrednošću koja je izračunata u tački a).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Maksimalni red stabla je &amp;lt;math&amp;gt;m = 4&amp;lt;/math&amp;gt;. Raspored memorije u čvoru dat je ispod.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Raspored memorije u čvoru B+ stabla.&lt;br /&gt;
| 16b || 16b || 16b || 16b || 16b || 16b || 16b || 16b || 16b || 16b || 16b || 16b || 16b || 16b || 16b || 16b&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;p_0&amp;lt;/math&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; | &amp;lt;math&amp;gt;k_1&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;p_1&amp;lt;/math&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; | &amp;lt;math&amp;gt;k_2&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;p_2&amp;lt;/math&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; | &amp;lt;math&amp;gt;k_3&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;p_3&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Pošto je minimalan broj ključeva u listu B+ stabla jednak &amp;lt;math&amp;gt;\left\lfloor\frac{m}{2}\right\rfloor = \left\lfloor\frac{4}{2}\right\rfloor = 2&amp;lt;/math&amp;gt;, inicijalni izgled zadatog B+ stabla je:&lt;br /&gt;
                   (12|45|66)&lt;br /&gt;
               /      |  |       \&lt;br /&gt;
 [6 |12|  ]-&amp;gt;[18|45|  ]-&amp;gt;[58|66|  ]-&amp;gt;[73|81|  ]&lt;br /&gt;
Ključ 41 se dodaje u list:&lt;br /&gt;
                   (12|45|66)&lt;br /&gt;
               /      |  |       \&lt;br /&gt;
 [6 |12|  ]-&amp;gt;[18|41|45]-&amp;gt;[58|66|  ]-&amp;gt;[73|81|  ]&lt;br /&gt;
Ključ 53 se isto dodaje u list:&lt;br /&gt;
                   (12|45|66)&lt;br /&gt;
               /      |  |       \&lt;br /&gt;
 [6 |12|  ]-&amp;gt;[18|41|45]-&amp;gt;[53|58|66]-&amp;gt;[73|81|  ]&lt;br /&gt;
Pri dodavanju ključa 32 dešava se prelom u listu, koji se razdvaja na listove sa 18 i 32 i sa 41 i 45, a ključ 32 odlazi u koren. Pošto je i koren pun, dešava se prelom i 12 ostaje u levom čvoru, 32 odlazi u novi koren a 45 i 66 idu u desni čvor.&lt;br /&gt;
                       (32|  |  )&lt;br /&gt;
                   /               \&lt;br /&gt;
       (12|  |  )                    (45|66|  )&lt;br /&gt;
       |   \                       /    |     \&lt;br /&gt;
 [6 |12|  ]-&amp;gt;[18|32|  ]-&amp;gt;[41|45|  ]-&amp;gt;[53|58|66]-&amp;gt;[73|81|  ]&lt;br /&gt;
Pri brisanju ključa 12 pozajmica je nemoguća, pa se spajaju dva lista i na sledećem nivou se dešava pozajmica od desnog brata, čime se pozajmljuje ključ 45.&lt;br /&gt;
                   (45|  |  )&lt;br /&gt;
             /            \&lt;br /&gt;
       (32|  |  )              (66|  |  )&lt;br /&gt;
       |   \                   |   \&lt;br /&gt;
 [6 |18|32]-&amp;gt;[41|45|  ]-&amp;gt;[53|58|66]-&amp;gt;[73|81|  ]&lt;br /&gt;
Ključ 66 se briše iz lista i tom prilikom se ažurira roditeljski čvor.&lt;br /&gt;
                   (45|  |  )&lt;br /&gt;
             /            \&lt;br /&gt;
       (32|  |  )              (58|  |  )&lt;br /&gt;
       |   \                   |   \&lt;br /&gt;
 [6 |18|32]-&amp;gt;[41|45|  ]-&amp;gt;[53|58|  ]-&amp;gt;[73|81|  ]&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu iterativnu implementaciju funkcije koja formira &#039;&#039;trie&#039;&#039; stablo svih podstringova stringa koji je prosledjen&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; kao argument toj funkciji. Data je pomoćna funkcija &#039;&#039;getPosition(chr)&#039;&#039;, koja za prosledjeni&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; karakter &#039;&#039;chr&#039;&#039; vraća indeks odgovarajućeg pokazivača u čvoru &#039;&#039;trie&#039;&#039; stabla.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
TRIE SUBSTRINGS(str)&lt;br /&gt;
root = GETNODE&lt;br /&gt;
for i = 1 to length(str) do&lt;br /&gt;
    node = root&lt;br /&gt;
    substr = &amp;quot;&amp;quot;&lt;br /&gt;
    for j = i to length(str) do&lt;br /&gt;
        substr = substr + str[j]&lt;br /&gt;
        pos = getPosition(str[j])&lt;br /&gt;
        if nodes(node)[pos] = nil then&lt;br /&gt;
            nodes(node)[pos] = GETNODE&lt;br /&gt;
        end_if&lt;br /&gt;
        node = nodes(node)[pos]&lt;br /&gt;
        value(node) = substr&lt;br /&gt;
    end_for&lt;br /&gt;
end_for&lt;br /&gt;
return root&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka su ključevi neuniformne dužine i neka se oni u čvoru stabla &#039;&#039;m&#039;&#039;-arnog pretraživanja pakuju bez gubitka prostora.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti efikasnu organizaciju čvora koja dozvoljava najbrže pretraživanje ovakvog čvora.&lt;br /&gt;
# Precizno nacrtati organizaciju čvora za stablo reda 6 koji trenutno sadrži ključeve IPSILON, DELTA, IKS, ALFA.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U čvor možemo dodati polje od m-2 celobrojnih vrednosti koje nam govore od koje memorijske lokacije počinje koji ključ. Na taj način, kad vidimo da se neki pretraživani ključ ne poklapa sa vrednošću u trenutnom polju, umesto da nastavimo da čitamo vrednost do sledećeg ključa možemo odmah da nađemo početak sledećeg ključa.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Organizacija čvora&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
| 4 || 9 || 12 || 12 || 12&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| A || L || F || A || D || E || L || T || A || I || K || S || I || P || S || I || L || O || N&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Heširanje:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Analitički definisati osobinu uniformnosti heš funkcije u tabeli veličine &#039;&#039;n&#039;&#039; ulaza i objasniti je jednom rečenicom.&lt;br /&gt;
# Ako je heš funkcija uniformna i ako je u tabeli sa &#039;&#039;n&#039;&#039; ulaza uneseno &#039;&#039;k&#039;&#039; ključeva, izvesti izraz koji predstavlja očekivani broj kolizija koje su se desile prilikom tih umetanja.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Uniformnost heš funkcije je osobina koja znači da je svaki od &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; izlaza podjednako verovatan: &amp;lt;math&amp;gt;P(H(K)) = \frac{1}{n}, 1 \leq H(K) \leq n&amp;lt;/math&amp;gt;&lt;br /&gt;
# Zamislimo da ključeve umećemo u tabelu jedan po jedan. Pošto je naša heš funkcija uniformna, prvih &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; umetanja nećemo imati nijednu koliziju. Narednih &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; umetanja ćemo imati jednu koliziju po umetanju, sledećih &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; dve kolizije, i tako dalje. Ukupan broj puta koliko će se povećanje broja kolizija po ključu desiti jeste &amp;lt;math&amp;gt;m = \left\lfloor\frac{k}{n}\right\rfloor&amp;lt;/math&amp;gt;, i on će na kraju biti povećan na &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. To znači da će ukupan očekivani broj kolizija biti &amp;lt;math&amp;gt;n \cdot (0 + 1 + 2 + ... + m-1) + m \cdot (k \mod n) = n \cdot \frac{(m-1)(m-2)}{2} + m \cdot (k \mod n)&amp;lt;/math&amp;gt;. Drugi deo jednačine ima veze sa time što kada umetnemo &amp;lt;math&amp;gt;m \cdot n&amp;lt;/math&amp;gt; ključeva naš broj kolizija će biti jednak &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, ali će nama i dalje ostati &amp;lt;math&amp;gt;k - m \cdot n&amp;lt;/math&amp;gt;, odnosno &amp;lt;math&amp;gt;k \mod n&amp;lt;/math&amp;gt; ključeva koji nisu umetnuti (pri računanju &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; smo zaokružili na manji broj) i na njima će broj kolizija biti &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1%D0%9F_2012&amp;diff=7807</id>
		<title>АСП2/К1П 2012</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1%D0%9F_2012&amp;diff=7807"/>
		<updated>2024-09-13T00:09:10Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Popravni prvi kolokvijum 2012. godine&#039;&#039;&#039; održan je 9. januara 2012. Postavka zadataka je dostupna sa [https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/arhiva/SI2AS2_K1p_1112.pdf stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(30p)&#039;&#039;&#039; Predložiti adekvatnu strukturu podataka i detaljno navesti uslove njene upotrebe, a zatim skicirati algoritam za efikasnu pretragu na više celobrojnih ključeva nad neopadajuće uređenom tabelom. Smatrati da u tabeli ne postoje duplirani ključevi niti da se više puta vrši pretraga nad istim ključem. &lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretraživanje ide od početka niza K sa prvim ključem iz S dok se ne pronađe (i njegova pozicija zapamti u P) ili do prve veće vrednosti. Pretraživanje na sledeći ključ iz S počinje tamo gde se sa pretraživanjem na prethodni ključ stalo, pa se zato niz K prolazi samo jednom. Niz K je rastuće uređeni niz sa n ključeva koji se pretražuje na pojavu m ključeva zadatih u nizu S. Izlaz predstavlja vektor P gde se na poziciji koja odgovara ključu u nizu S nalazi pozicija ključa u nizu K, ako se on tamo pronađe, ili vrednost 0 ako se ne pronađe. Složenost ovog algoritma je O(n) za slučaj kada je m &amp;lt;&amp;lt; n.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SEQ-SEARCH-MUL(K,S)&lt;br /&gt;
for(int i=0;i&amp;lt;m;i++) P[i] = 0;&lt;br /&gt;
i=j=1;&lt;br /&gt;
while(i&amp;lt;=n) and (j&amp;lt;=m)&lt;br /&gt;
    while(i&amp;lt;n) and (S[j] &amp;gt; K[i]) i++;&lt;br /&gt;
    if(S[j] = K[i]) P[j] = i;&lt;br /&gt;
    j++;&lt;br /&gt;
end_while&lt;br /&gt;
return P;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(20p)&#039;&#039;&#039; U AVL stablo se redom umeću sledeći celobrojni ključevi: 13, 32, 14, 28, 15, 35, 44, 47, 22, 30, 24, 19, 20, a zatim se brišu ključevi 15, 30, 28, 24. Nacrtati izgled stabla nakon svake od navedenih izmena. Izračunati prosečan broj pristupa stablu za uspešnu pretragu nakon svih umetanja i u konačnom stanju. &lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ukoliko želite da zadatak proverite korak po korak, to možete uraditi na [https://www.cs.usfca.edu/~galles/visualization/AVLtree.html linku.]&lt;br /&gt;
[[Датотека:ASP2 K1 2011p Zadatak 2 umetanje.svg|thumb|600px|center|Stablo nakon svih umetanja]]&lt;br /&gt;
[[Датотека:ASP2 K1 2011p Zadatak 2 brisanje.svg|thumb|600px|center|Stablo nakon svih brisanja]]&lt;br /&gt;
Nakon svih umetanja: &amp;lt;math&amp;gt;S_{n} = \frac{5 + 5\cdot4 + 4\cdot3 + 2\cdot2 + 1}{13} = \frac{42}{13} = 3.23&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nakon svih brisanja: &amp;lt;math&amp;gt;S_{n} = \frac{2\cdot4 + 4\cdot3 + 2\cdot2 + 1}{9} = \frac{25}{9} = 2.78&amp;lt;/math&amp;gt;&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(20p)&#039;&#039;&#039; Dati pseudokod i objasniti algoritam za određivanje sledbenika proizvoljno zadatog čvora u stablu binarnog pretraživanja.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ukoliko čvor ima desnog sina, onda je njegov sledbenik najlevlji čvor u desnom podstablu, a ako nema, onda je njegov sledbenik najbliži predak čiji je levi sin takođe predak zadatog čvora.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
BST-SUCC(k)&lt;br /&gt;
if(right(k) != nil)&lt;br /&gt;
    p = right(k);&lt;br /&gt;
    while(left(p) != nil) p = left(p);&lt;br /&gt;
    return p;&lt;br /&gt;
end_if&lt;br /&gt;
p = parent(k), s = k;&lt;br /&gt;
while(p != nil and right(p) = s)&lt;br /&gt;
    s = p;&lt;br /&gt;
    p = parent(p);&lt;br /&gt;
end_while&lt;br /&gt;
return s;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(30p)&#039;&#039;&#039; Pitanja:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Objasniti kako i zašto metod transpozije optimizuje sekvencijalno pretraživanje.&lt;br /&gt;
# Ako se stablo binarnog pretraživanja koristi kao prioritetni red, objasniti kako izgedaju operacije PQ_INSERT i PQ_MIN_DELETE. Kolika je vremenska složenost ovih operacija?&lt;br /&gt;
# Precizno definisati optimalno stablo binarnog pretraživanja. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Metod transpozicije optimizuje sekvencijalno pretraživanje tako što svaki put kada se traženi element nađe, on zameni mesto sa elementom levo od sebe i tako se priblližava početku niza. Time se obezbeđuje da su oni elementi kojima se češće pristupa bliže početku, pa pošto se sekvencijalno pristupa, i samo vreme pristupa tim elementima je skraćeno.&lt;br /&gt;
# &amp;lt;ref&amp;gt;Ovo više nije gradivo K1&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Optimalno stablo binarnog pretraživanja je ono stablo čija je cena najmanja, gde cenu definišemo kao: &amp;lt;math&amp;gt;C = \sum_{i}^{m-n} p_{i}(h_{i} + 1) + \sum_{i}^{m-n} q_{i}h_{i}&amp;lt;/math&amp;gt;, gde su Pi verovatnoće pristupa ključevima Kn...Km, a Qi verovatnoće pristupa eksternim čvorovima. Osobina na kojoj se zasniva algoritam za nalaženje optimalnog stabla binarnog pretraživanja je da su sva podstabla optimalnog stabla pretraživanja takođe optimalna. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Napomene ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;!-- Nastaviti sa kopiranjem odeljaka iznad ukoliko ima još zadataka. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП2]]&amp;lt;!-- Zameniti sa nazivom predmeta --&amp;gt;&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2020&amp;diff=7806</id>
		<title>АСП2/К1 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2020&amp;diff=7806"/>
		<updated>2024-09-13T00:09:10Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K1_2021.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prvi kolokvijum 2020. godine&#039;&#039;&#039; održan je 3. novembra 2020.&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Posmatra se tabela celobrojnih ključeva data na slici. Prikazati izgled tabele u svakom&lt;br /&gt;
koraku prilikom pretrage na skup ključeva {25, 40, 25, 40} metodom transpozicije kao i&lt;br /&gt;
metodom prebacivanja na početak i u oba slučaja izračunati prosečan broj poređenja&lt;br /&gt;
prilikom pretraživanja.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Stanje niza iz postavke zadatka&lt;br /&gt;
! 12&lt;br /&gt;
! 7&lt;br /&gt;
! 3&lt;br /&gt;
! 27&lt;br /&gt;
! 25&lt;br /&gt;
! 78&lt;br /&gt;
! 98&lt;br /&gt;
! 21&lt;br /&gt;
! 22&lt;br /&gt;
! 40&lt;br /&gt;
! 51&lt;br /&gt;
|}&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&#039;&#039;&#039;Transpozicija:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Stanje niza nakon pretrage na ključ 25&lt;br /&gt;
! 12&lt;br /&gt;
! 7&lt;br /&gt;
! 3&lt;br /&gt;
! 25&lt;br /&gt;
! 27&lt;br /&gt;
! 78&lt;br /&gt;
! 98&lt;br /&gt;
! 21&lt;br /&gt;
! 22&lt;br /&gt;
! 40&lt;br /&gt;
! 51&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Broj poređenja u ovom koraku - 5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Stanje niza nakon pretrage na ključ 40&lt;br /&gt;
! 12&lt;br /&gt;
! 7&lt;br /&gt;
! 3&lt;br /&gt;
! 25&lt;br /&gt;
! 27&lt;br /&gt;
! 78&lt;br /&gt;
! 98&lt;br /&gt;
! 21&lt;br /&gt;
! 40&lt;br /&gt;
! 22&lt;br /&gt;
! 51&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Broj poređenja u ovom koraku - 10&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Stanje niza nakon pretrage na ključ 25&lt;br /&gt;
! 12&lt;br /&gt;
! 7&lt;br /&gt;
! 25&lt;br /&gt;
! 3&lt;br /&gt;
! 27&lt;br /&gt;
! 78&lt;br /&gt;
! 98&lt;br /&gt;
! 21&lt;br /&gt;
! 40&lt;br /&gt;
! 22&lt;br /&gt;
! 51&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Broj poređenja u ovom koraku - 4&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Stanje niza nakon pretrage na ključ 40&lt;br /&gt;
! 12&lt;br /&gt;
! 7&lt;br /&gt;
! 25&lt;br /&gt;
! 3&lt;br /&gt;
! 27&lt;br /&gt;
! 78&lt;br /&gt;
! 98&lt;br /&gt;
! 40&lt;br /&gt;
! 21&lt;br /&gt;
! 22&lt;br /&gt;
! 51&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Broj poređenja u ovom koraku - 9&lt;br /&gt;
&lt;br /&gt;
Prosečan broj poređenja: &amp;lt;math&amp;gt;\frac{5+10+4+9}{4} = \frac{28}{4} = 7&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prebacivanje na početak:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Stanje niza nakon pretrage na ključ 25&lt;br /&gt;
! 25&lt;br /&gt;
! 12&lt;br /&gt;
! 7&lt;br /&gt;
! 3&lt;br /&gt;
! 27&lt;br /&gt;
! 78&lt;br /&gt;
! 98&lt;br /&gt;
! 21&lt;br /&gt;
! 22&lt;br /&gt;
! 40&lt;br /&gt;
! 51&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Broj poređenja u ovom koraku - 5&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Stanje niza nakon pretrage na ključ 40&lt;br /&gt;
! 40&lt;br /&gt;
! 25&lt;br /&gt;
! 12&lt;br /&gt;
! 7&lt;br /&gt;
! 3&lt;br /&gt;
! 27&lt;br /&gt;
! 78&lt;br /&gt;
! 98&lt;br /&gt;
! 21&lt;br /&gt;
! 22&lt;br /&gt;
! 51&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Broj poređenja u ovom koraku - 10&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Stanje niza nakon pretrage na ključ 25&lt;br /&gt;
! 25&lt;br /&gt;
! 40&lt;br /&gt;
! 12&lt;br /&gt;
! 7&lt;br /&gt;
! 3&lt;br /&gt;
! 27&lt;br /&gt;
! 78&lt;br /&gt;
! 98&lt;br /&gt;
! 21&lt;br /&gt;
! 22&lt;br /&gt;
! 51&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Broj poređenja u ovom koraku - 2&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Stanje niza nakon pretrage na ključ 40&lt;br /&gt;
! 40&lt;br /&gt;
! 25&lt;br /&gt;
! 12&lt;br /&gt;
! 7&lt;br /&gt;
! 3&lt;br /&gt;
! 27&lt;br /&gt;
! 78&lt;br /&gt;
! 98&lt;br /&gt;
! 21&lt;br /&gt;
! 22&lt;br /&gt;
! 51&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Broj poređenja u ovom koraku - 2&lt;br /&gt;
&lt;br /&gt;
Prosečan broj poređenja: &amp;lt;math&amp;gt;\frac{5+10+2+2}{4} = \frac{19}{4} = 4.75&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Ukratko objasniti i ilustrovati primerima slučajeve pronalaženja čvora prethodnika po&lt;br /&gt;
inorder poretku za zadati čvor u stablu binarnog pretraživanja. &lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ukoliko čvor ima levo podstablo, njegov prethodnik je najdešnji potomak njegovog levog sina, a ukoliko nema levo podstablo, njegov prethodnik je njegov najniži predak čiji je desni sin takođe njegov predak. U primeru ispod, prethodnik od 3 je 1, a prethodnik od 6 je 5.&lt;br /&gt;
&lt;br /&gt;
[[Датотека:ASP2 K1 2020 Zadatak 1.svg|thumb|600px|center|Primer]]&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(15p)&#039;&#039;&#039; U AVL stablo sa slike se redom umeću ključevi 44, 72, 19, 22, 21, 5 i 1, nakon čega se&lt;br /&gt;
uklanjaju ključevi 23 i 39. Prikazati stanja stabla nakon svake promene.&amp;lt;ref&amp;gt; Prepisivač ovog roka je zaboravio kako se postupno radi umetanje i brisanje, tako da su dostupna rešenja samo posle svih umetanja i posle svih brisanja (u prevodu nisam radio postupno)&amp;lt;/ref&amp;gt;&lt;br /&gt;
[[Датотека:ASP2 K1 2020 Zadatak 3 Pocetno.svg|thumb|400px|center|Početno stanje]]&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:ASP2 K1 2020 Zadatak 3 Posle umetanja.svg|thumb|400px|center|Posle svih umetanja]]&lt;br /&gt;
&lt;br /&gt;
[[Датотека:ASP2 K1 2020 Zadatak 3 Posle brisanja.svg|thumb|400px|center|Posle svih brisanja]]&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(15p)&#039;&#039;&#039; Neka je data velika, uređena jednostruko ulančana lista list koju treba pretražiti na zadati&lt;br /&gt;
ključ key. Kao pomoćna struktura, raspoloživ je indeks index veličine size.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;(5p)&#039;&#039;&#039; Objasniti i nacrtati strukturu indeksa i način povezivanja sa listom koja se pretražuje.&lt;br /&gt;
# &#039;&#039;&#039;(10p)&#039;&#039;&#039; Napisati u pseudokodu implementaciju funkcije za sekvencijalnu pretragu liste list uz korišćenje indeksa index na ključ key.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Struktura index predstavlja niz čvorova koji sadrže informaciono polje sa vrednošću pronađenih ključeva i polje-pokazivač na taj pronađen ključ. Struktura index se čuva uređenom.&lt;br /&gt;
[[Датотека:ASP2 K1 2020 Zadatak 4a.svg|thumb|400px|center|Struktura indeksa]]&lt;br /&gt;
&lt;br /&gt;
# {{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND KEY LIST(list, index, size, key)&lt;br /&gt;
int i=0;&lt;br /&gt;
for(i&amp;lt;size)&lt;br /&gt;
    if(key&amp;lt;index[i].info) Node poc = index[i];&lt;br /&gt;
    if(key&amp;gt;=index[i].info) break;&lt;br /&gt;
    while(poc!=nil)&lt;br /&gt;
        if(key==poc.info) return poc;&lt;br /&gt;
        if(key&amp;gt;poc.info) return nil;&lt;br /&gt;
        poc=poc.next&lt;br /&gt;
    end_while&lt;br /&gt;
end_for&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Neka se u dato samopodešavajuće stablo ubacuje ključ 30, nakon čega se brišu ključevi&lt;br /&gt;
29 i 61, i na kraju se ubacuje ključ 33. Prikazati izgled stabla nakon svakog izvršenog koraka&lt;br /&gt;
pri umetanju i brisanju.&lt;br /&gt;
[[Датотека:ASP2 K1 2020 Zadatak 5.png|thumb|400px|center|Početno stanje]]&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U stablu se već nalazi ključ 33, tako da on ne treba da se ubacuje.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
  ASP2 K1 2020 Zadatak 5 korak 1.svg | Nakon umetanja ključa 30.&lt;br /&gt;
  ASP2 K1 2020 zadatak 5 korak 2.svg | Nakon brisanja ključa 29.&lt;br /&gt;
  ASP2 K1 2020 Zadatak 5 korak 3.svg | Nakon brisanja ključa 61.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(15p)&#039;&#039;&#039; Napisati u pseudokodu implementaciju funkcije koja u datom binarnom stablu na čiji&lt;br /&gt;
koren ukazuje pokazivač root pronalazi i ispisuje adrese korenova svih podstabala koja&lt;br /&gt;
zadovoljavaju osobine stabla binarnog pretraživanja. Dozvoljeno je uvoditi dodatna polja u&lt;br /&gt;
čvor stabla koja mogu olakšati implementaciju funkcije.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U ovom rešenju su korišćene funkcije inicijalizacije, brisanja i dodavanja u red, kao i funkcija provere da li je red prazan, koje su podrazumevano znanje sa ASP1 i kao takve mogu da se koriste bez posebnog pseudokoda za te operacije.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PRINT ALL BST(root)&lt;br /&gt;
Q.insert(root)&lt;br /&gt;
while(!Q.empty())&lt;br /&gt;
    tr = Q.delete&lt;br /&gt;
    CHECK(tr)&lt;br /&gt;
    if(tr.bst) print(tr)&lt;br /&gt;
    if(tr.left) Q.insert(tr.left)&lt;br /&gt;
    if(tr.right) Q.insert(tr.right)&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CHECK(root)&lt;br /&gt;
Q.insert(root, -∞,+∞)&lt;br /&gt;
while(!Q.empty())&lt;br /&gt;
    {tr,min.max} = Q.delete&lt;br /&gt;
    if(tr.left)&lt;br /&gt;
        if(tr.left.info &amp;lt; min || tr.left.info &amp;gt; tr.info)&lt;br /&gt;
            root.bst = 0&lt;br /&gt;
            return&lt;br /&gt;
        end_if&lt;br /&gt;
        Q.insert(tr.left,min,tr.info)&lt;br /&gt;
    end_if&lt;br /&gt;
    if(tr.right)&lt;br /&gt;
        if(tr.right.info &amp;lt; key || tr.right.info &amp;gt; tr.info)&lt;br /&gt;
            root.bst = 0&lt;br /&gt;
            return&lt;br /&gt;
        end_if&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
root.bst=1&lt;br /&gt;
return&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(15p)&#039;&#039;&#039; Neka se posmatra jedna strogo monotono rastuća funkcija f(x). Na primer,&amp;lt;math&amp;gt;x^3 - 3x^2 +6x - 1&amp;lt;/math&amp;gt; ili &amp;lt;math&amp;gt;3^x&amp;lt;/math&amp;gt;. Korišćenjem strategije binarnog pretraživanja, napisati u pseudokodu iterativnu implementaciju funkcije koja pronalazi vrednost n za koju funkcija f(x) postaje pozitivna prvi put, ukoliko važi da je x ≥ 0. Kratko objasniti postupak.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U rešenju se koristi binarno pretraživanje u tabeli nepoznate veličine.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND FIRST POSITIVE(f)&lt;br /&gt;
int high=1;&lt;br /&gt;
while(f(high)&amp;lt;0)&lt;br /&gt;
    high *= 2;&lt;br /&gt;
end_while&lt;br /&gt;
int low = high/2;&lt;br /&gt;
while(low&amp;lt;=high)&lt;br /&gt;
    mid = (high+low)/2;&lt;br /&gt;
    if(f(mid)&amp;gt;=0 &amp;amp;&amp;amp; f(mid-1)&amp;lt;0) return mid;&lt;br /&gt;
    if(f(mid)&amp;gt;0) high = mid-1;&lt;br /&gt;
    else low=mid+1;&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Analiza performansi stabla binarnog pretraživanja.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;(5p)&#039;&#039;&#039; Formalno definisati i objasniti prosečan broj poređenja Sn prilikom uspešnog pretraživanja i prosečan broj poređenja Un prilikom neuspešnog pretraživanja u stablu binarnog pretraživanja koje je nastalo umetanjem n čvorova u proizvoljnom poretku.&lt;br /&gt;
# &#039;&#039;&#039;(5p)&#039;&#039;&#039; Izvesti i kratko objasniti vezu između Sn i Un koji su definisani pod a). Odgovor ilustrovati slikom.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Sn možemo predstaviti kao &amp;lt;math&amp;gt; Sn = (PI + n)/n&amp;lt;/math&amp;gt;, jer ima za 1 više poređenja nego čvorova, a Un možemo predstaviti kao &amp;lt;math&amp;gt; Un = PE/n_{e} = PE/(n+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;lt;math&amp;gt;PE = PI + 2n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Un(n+1) - 2n = PI&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Sn = (Un \frac{n+1}{n}) - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Napomene ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;!-- Nastaviti sa kopiranjem odeljaka iznad ukoliko ima još zadataka. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП2]]&amp;lt;!-- Zameniti sa nazivom predmeta --&amp;gt;&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2019&amp;diff=7805</id>
		<title>АСП2/К1 2019</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2019&amp;diff=7805"/>
		<updated>2024-09-13T00:09:09Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K1_1920.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je neopadajuće uređena proširena tabela i odgovarajući vektor bitova validnosti. Prikazati izgled povećane tabele i vektora validnosti nakon umetanja svakog od ključeva: 5, 28 i 29, a zatim ukloniti ključeve: 14 i 15 i prikazati finalno stanje.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje niza iz postavke zadatka&lt;br /&gt;
| 4 || 7 || 10 || 14 || 15 || 15 || 21 || 24 || 25 || 40 || 45&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0  || 1  || 0  || 0  || 0  || 1  || 0  || 1  || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje niza nakon unosa broja 5&lt;br /&gt;
| 4 || 5 || 5 || 14 || 15 || 15 || 21 || 24 || 25 || 40 || 45&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || 1  || 0  || 0  || 0  || 1  || 0  || 1  || 0&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje niza nakon unosa broja 28&lt;br /&gt;
| 4 || 5 || 5 || 14 || 15 || 15 || 21 || 24 || 25 || 28 || 40&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || 1  || 0  || 0  || 0  || 1  || 0  || 1  || 1&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; | Takođe je moguće da se, uz napomenu, pri nailasku na ključ veći od traženog gleda levo umesto desno.&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje niza nakon unosa broja 29&lt;br /&gt;
| 4 || 5 || 5 || 14 || 15 || 15 || 21 || 24 || 28 || 29 || 40&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || 1  || 0  || 0  || 0  || 1  || 1  || 1  || 1&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; | Postoje dva načina na koji možemo da rešimo situaciju kad naiđemo na 40 i ne možemo da ga pomerimo udesno:&lt;br /&gt;
* kažemo da se desila greška pošto ne možemo dalje da umećemo, ili&lt;br /&gt;
* pomerimo ključ 28 ulevo (preporučeno).&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje niza nakon brisanja broja 14&lt;br /&gt;
| 4 || 5 || 5 || 14 || 15 || 15 || 21 || 24 || 28 || 29 || 40&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || 0  || 0  || 0  || 0  || 1  || 1  || 1  || 1&lt;br /&gt;
|}&lt;br /&gt;
Pri brisanju ključa 15 dešava se greška jer taj ključ ne postoji.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka je dat veoma veliki uređeni niz &#039;&#039;arr&#039;&#039; dužine &#039;&#039;n&#039;&#039;. Poznato je da verovatnoća pretraživanja ključeva monotono opada od početka ka kraju niza.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti i kratko objasniti tehniku binarnog pretraživanja koja obećava naveću&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; efikasnost pod zadatim uslovima.&lt;br /&gt;
# Napisati u pseudokodu iterativnu implementaciju funkcije koja implementira binarno pretraživanje niza &#039;&#039;arr&#039;&#039; dužine &#039;&#039;n&#039;&#039; u skladu sa tehnikom predloženom pod a).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Način za efikasno binarno pretraživanje ovog niza jeste tako što se prvo ispituju ključevi na pozicijama &amp;lt;math&amp;gt;2^i, i \in \mathbb{N}, 2^m \leq 2^n \leq n&amp;lt;/math&amp;gt; i zatim kada se odrede &amp;lt;math&amp;gt;m, n \in \mathbb{N}&amp;lt;/math&amp;gt; tako da &amp;lt;math&amp;gt;arr[2^m] &amp;lt; k &amp;lt; arr[2^n]&amp;lt;/math&amp;gt; na intervalu od &amp;lt;math&amp;gt;2^m&amp;lt;/math&amp;gt; do &amp;lt;math&amp;gt;2^n&amp;lt;/math&amp;gt; se sprovodi binarna pretraga.&lt;br /&gt;
&lt;br /&gt;
U postavci funkcije u zadatku nije bio dat parametar &#039;&#039;k&#039;&#039;, odnosno ključ koji se pretražuje, ali je ovde dodat.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
BINARY SEARCH PROB(arr, n, k)&lt;br /&gt;
low = 1&lt;br /&gt;
high = 2&lt;br /&gt;
while (high ≤ n) and (arr[high] &amp;lt; k) do&lt;br /&gt;
    low = high&lt;br /&gt;
    high = 2 * high&lt;br /&gt;
end_while&lt;br /&gt;
if (high &amp;gt; n) then&lt;br /&gt;
    high = n&lt;br /&gt;
end_if&lt;br /&gt;
while (low ≤ high) do&lt;br /&gt;
    mid = (low + high) / 2&lt;br /&gt;
    if (arr[mid] = k) then&lt;br /&gt;
        return mid&lt;br /&gt;
    else if (arr[mid] &amp;lt; k) then&lt;br /&gt;
        low = mid + 1&lt;br /&gt;
    else&lt;br /&gt;
        high = mid - 1&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
return nil&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na slici je dato stablo binarnog pretraživanja. Potrebno je transformisati ovo stablo u AVL stablo. Prikazati transformaciju stabla po koracima.&lt;br /&gt;
    25&lt;br /&gt;
   /  \&lt;br /&gt;
  9    38&lt;br /&gt;
      /  \&lt;br /&gt;
     36   49&lt;br /&gt;
    /    /&lt;br /&gt;
   31   42&lt;br /&gt;
  /    /  \&lt;br /&gt;
 27   40   45&lt;br /&gt;
             \&lt;br /&gt;
              47&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; data-expandtext=&amp;quot;Prikaži postupak&amp;quot;&amp;gt;&lt;br /&gt;
Prvo pronađemo kritične čvorove u stablu:&lt;br /&gt;
    &#039;&#039;&#039;25&#039;&#039;&#039;&lt;br /&gt;
   /  \&lt;br /&gt;
  9    38&lt;br /&gt;
      /  \&lt;br /&gt;
     &#039;&#039;&#039;36&#039;&#039;&#039;   &#039;&#039;&#039;49&#039;&#039;&#039;&lt;br /&gt;
    /    /&lt;br /&gt;
   31   42&lt;br /&gt;
  /    /  \&lt;br /&gt;
 27   40   45&lt;br /&gt;
             \&lt;br /&gt;
              47&lt;br /&gt;
Zatim radimo rotaciju udesno oko čvora 36 (njegovo levo dete naginje na levu stranu):&lt;br /&gt;
   25&lt;br /&gt;
  /  \&lt;br /&gt;
 9    38&lt;br /&gt;
    /    \&lt;br /&gt;
   31     49&lt;br /&gt;
  /  \   /&lt;br /&gt;
 27  36 42&lt;br /&gt;
       /  \&lt;br /&gt;
      40   45&lt;br /&gt;
             \&lt;br /&gt;
              47&lt;br /&gt;
čime postižemo da čvor 36 više nije kritičan. Zatim radimo rotaciju ulevo oko čvora 42 (levo dete čvora 49 naginje na desnu stranu):&lt;br /&gt;
   25&lt;br /&gt;
  /  \&lt;br /&gt;
 9    38&lt;br /&gt;
    /    \&lt;br /&gt;
   31     49&lt;br /&gt;
  /  \   /&lt;br /&gt;
 27  36 45&lt;br /&gt;
       /  \&lt;br /&gt;
      42   47&lt;br /&gt;
     /&lt;br /&gt;
    40&lt;br /&gt;
pa rotaciju udesno oko čvora 49:&lt;br /&gt;
     25&lt;br /&gt;
   /    \&lt;br /&gt;
  9      38&lt;br /&gt;
       /    \&lt;br /&gt;
      31     45&lt;br /&gt;
     /  \   /  \&lt;br /&gt;
    27  36 42   49&lt;br /&gt;
          /    /&lt;br /&gt;
         40  47&lt;br /&gt;
čime postižemo da čvor 49 više nije kritičan. Na kraju radimo rotaciju ulevo oko čvora 25 (njegovo desno dete naginje na desnu stranu) i dobijamo...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Konačno stablo:&#039;&#039;&#039;&lt;br /&gt;
         38&lt;br /&gt;
     /        \&lt;br /&gt;
   25          45&lt;br /&gt;
  /  \        /  \&lt;br /&gt;
 9    31     42   49&lt;br /&gt;
     /  \   /    /&lt;br /&gt;
    27  36 40  47&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na slici je prikazano stablo binarnog pretraživanja nakon brisanja ključa 19. Ako je poznato da se prilikom brisanja koristi prethodnik, prikazati sve moguće izglede stabla neposredno pre brisanja navedenog ključa.&lt;br /&gt;
     10&lt;br /&gt;
    /  \&lt;br /&gt;
   5   18&lt;br /&gt;
  /   /  \&lt;br /&gt;
 3   14  20&lt;br /&gt;
      \&lt;br /&gt;
      15&lt;br /&gt;
       \&lt;br /&gt;
       17&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
     10&lt;br /&gt;
    /  \&lt;br /&gt;
   5   18&lt;br /&gt;
  /   /  \&lt;br /&gt;
 3   14  19&lt;br /&gt;
      \   \&lt;br /&gt;
      15  20&lt;br /&gt;
       \&lt;br /&gt;
       17&lt;br /&gt;
&lt;br /&gt;
      10&lt;br /&gt;
    /    \&lt;br /&gt;
   5      18&lt;br /&gt;
  /     /    \&lt;br /&gt;
 3     14    20&lt;br /&gt;
        \    /&lt;br /&gt;
        15  19&lt;br /&gt;
         \&lt;br /&gt;
         17&lt;br /&gt;
&lt;br /&gt;
     10&lt;br /&gt;
    /  \&lt;br /&gt;
   5   19&lt;br /&gt;
  /   /  \&lt;br /&gt;
 3   18  20&lt;br /&gt;
     /&lt;br /&gt;
    14&lt;br /&gt;
     \&lt;br /&gt;
     15&lt;br /&gt;
      \&lt;br /&gt;
      17&lt;br /&gt;
&lt;br /&gt;
     10&lt;br /&gt;
    /  \&lt;br /&gt;
   5   19&lt;br /&gt;
  /   /  \&lt;br /&gt;
 3   14  20&lt;br /&gt;
      \&lt;br /&gt;
      15&lt;br /&gt;
       \&lt;br /&gt;
       17&lt;br /&gt;
        \&lt;br /&gt;
        18&lt;br /&gt;
&lt;br /&gt;
     10&lt;br /&gt;
    /  \&lt;br /&gt;
   5   19&lt;br /&gt;
  /   /  \&lt;br /&gt;
 3   14  20&lt;br /&gt;
      \&lt;br /&gt;
      18&lt;br /&gt;
      /&lt;br /&gt;
     15&lt;br /&gt;
      \&lt;br /&gt;
       17&lt;br /&gt;
&lt;br /&gt;
     10&lt;br /&gt;
    /  \&lt;br /&gt;
   5   19&lt;br /&gt;
  /   /  \&lt;br /&gt;
 3   14  20&lt;br /&gt;
      \&lt;br /&gt;
      15&lt;br /&gt;
       \&lt;br /&gt;
       18&lt;br /&gt;
       /&lt;br /&gt;
      17&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se u dato samopodešavajuće stablo redom ubacuju ključevi 37, 32, 34, nakon čega se pretražuje na ključeve 33 i 20, a zatim se brišu ključevi 60 i 31. Prikazati izgled stabla nakon svakog izvršenog koraka pri umetanju i brisanju.&lt;br /&gt;
     50&lt;br /&gt;
    /  \&lt;br /&gt;
   30   60&lt;br /&gt;
  /  \&lt;br /&gt;
 20  40&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; data-expandtext=&amp;quot;Prikaži postupak&amp;quot; data-collapsetext=&amp;quot;Sakrij postupak&amp;quot;&amp;gt;&lt;br /&gt;
Prvo dodajemo čvor 37 u stablo:&lt;br /&gt;
       50&lt;br /&gt;
      /  \&lt;br /&gt;
    30    60&lt;br /&gt;
   /  \&lt;br /&gt;
 20    40&lt;br /&gt;
      /&lt;br /&gt;
    37&lt;br /&gt;
Pošto od dede do oca i od oca do sine vode grane u suprotnim smerovima, prvo rotiramo udesno oko čvora 40:&lt;br /&gt;
       50&lt;br /&gt;
      /  \&lt;br /&gt;
    30    60&lt;br /&gt;
   /  \&lt;br /&gt;
 20    40&lt;br /&gt;
         \&lt;br /&gt;
          37&lt;br /&gt;
a zatim ulevo oko čvora 30:&lt;br /&gt;
          50&lt;br /&gt;
         /  \&lt;br /&gt;
       37    60&lt;br /&gt;
      /  \&lt;br /&gt;
    30    40&lt;br /&gt;
   /&lt;br /&gt;
 20&lt;br /&gt;
Pošto još uvek nismo u korenu, rotiramo ulevo oko čvora 50:&lt;br /&gt;
       37&lt;br /&gt;
      /  \&lt;br /&gt;
    30    50&lt;br /&gt;
   /     /  \&lt;br /&gt;
 20    40    60&lt;br /&gt;
Zatim dodajemo čvor 32:&lt;br /&gt;
         37&lt;br /&gt;
      /      \&lt;br /&gt;
    30        50&lt;br /&gt;
   /  \      /  \&lt;br /&gt;
 20    32  40    60&lt;br /&gt;
Pošto od dede do oca i od oca do sine vode grane u suprotnim smerovima, prvo rotiramo ulevo oko čvora 30:&lt;br /&gt;
          37&lt;br /&gt;
         /  \&lt;br /&gt;
       32    50&lt;br /&gt;
      /     /  \&lt;br /&gt;
    30    40    60&lt;br /&gt;
   /&lt;br /&gt;
 20&lt;br /&gt;
a onda udesno oko čvora 37:&lt;br /&gt;
       32&lt;br /&gt;
      /  \&lt;br /&gt;
    30    37&lt;br /&gt;
   /        \&lt;br /&gt;
 20          50&lt;br /&gt;
            /  \&lt;br /&gt;
          40    60&lt;br /&gt;
Dodajemo čvor 34:&lt;br /&gt;
       32&lt;br /&gt;
      /  \&lt;br /&gt;
    30    37&lt;br /&gt;
   /     /  \&lt;br /&gt;
 20    34    50&lt;br /&gt;
            /  \&lt;br /&gt;
          40    60&lt;br /&gt;
Pošto od dede do oca i od oca do sine vode grane u suprotnim smerovima, prvo rotiramo udesno oko čvora 37:&lt;br /&gt;
       32&lt;br /&gt;
      /  \&lt;br /&gt;
    30    34&lt;br /&gt;
   /        \&lt;br /&gt;
 20          37&lt;br /&gt;
               \&lt;br /&gt;
                50&lt;br /&gt;
               /  \&lt;br /&gt;
             40    60&lt;br /&gt;
a zatim ulevo oko čvora 32:&lt;br /&gt;
          34&lt;br /&gt;
         /  \&lt;br /&gt;
       32    37&lt;br /&gt;
      /        \&lt;br /&gt;
    30          50&lt;br /&gt;
   /           /  \&lt;br /&gt;
 20          40    60&lt;br /&gt;
Pretražujemo ključ 33 putem 34 → 32 → nil, pa 32 moramo da pomerimo do korena, tako da radimo rotaciju udesno oko 34:&lt;br /&gt;
       32&lt;br /&gt;
      /  \&lt;br /&gt;
    30    34&lt;br /&gt;
   /        \&lt;br /&gt;
 20          37&lt;br /&gt;
               \&lt;br /&gt;
                50&lt;br /&gt;
               /  \&lt;br /&gt;
             40    60&lt;br /&gt;
Pretražujemo ključ 20 putem 32 → 30 → 20. Pošto grana od oca do sina i od dede do oca imaju isti smer, radimo rotaciju udesno oko 32.&lt;br /&gt;
    30&lt;br /&gt;
   /  \&lt;br /&gt;
 20    32&lt;br /&gt;
         \&lt;br /&gt;
          34&lt;br /&gt;
            \&lt;br /&gt;
             37&lt;br /&gt;
               \&lt;br /&gt;
                50&lt;br /&gt;
               /  \&lt;br /&gt;
             40    60&lt;br /&gt;
a zatim rotaciju udesno oko 30:&lt;br /&gt;
 20&lt;br /&gt;
   \&lt;br /&gt;
    30&lt;br /&gt;
      \&lt;br /&gt;
       32&lt;br /&gt;
         \&lt;br /&gt;
          34&lt;br /&gt;
            \&lt;br /&gt;
             37&lt;br /&gt;
               \&lt;br /&gt;
                50&lt;br /&gt;
               /  \&lt;br /&gt;
             40    60&lt;br /&gt;
Zatim brišemo čvor 60. Prvo radimo rotaciju ulevo oko 37:&lt;br /&gt;
 20&lt;br /&gt;
   \&lt;br /&gt;
    30&lt;br /&gt;
      \&lt;br /&gt;
       32&lt;br /&gt;
         \&lt;br /&gt;
          34&lt;br /&gt;
            \&lt;br /&gt;
             50&lt;br /&gt;
            /  \&lt;br /&gt;
          37    60&lt;br /&gt;
            \&lt;br /&gt;
             40&lt;br /&gt;
a zatim rotaciju ulevo oko 50:&lt;br /&gt;
 20&lt;br /&gt;
   \&lt;br /&gt;
    30&lt;br /&gt;
      \&lt;br /&gt;
       32&lt;br /&gt;
         \&lt;br /&gt;
          34&lt;br /&gt;
            \&lt;br /&gt;
             60&lt;br /&gt;
            /&lt;br /&gt;
          50&lt;br /&gt;
         /&lt;br /&gt;
       37&lt;br /&gt;
         \&lt;br /&gt;
          40&lt;br /&gt;
60 i dalje nije u korenu, tako da radimo rotaciju ulevo oko 32:&lt;br /&gt;
 20&lt;br /&gt;
   \&lt;br /&gt;
    30&lt;br /&gt;
      \&lt;br /&gt;
       34&lt;br /&gt;
      /  \&lt;br /&gt;
    32    60&lt;br /&gt;
         /&lt;br /&gt;
       50&lt;br /&gt;
      /&lt;br /&gt;
    37&lt;br /&gt;
      \&lt;br /&gt;
       40&lt;br /&gt;
pa rotaciju ulevo oko 34:&lt;br /&gt;
 20&lt;br /&gt;
   \&lt;br /&gt;
    30&lt;br /&gt;
      \&lt;br /&gt;
       60&lt;br /&gt;
      /&lt;br /&gt;
    34&lt;br /&gt;
   /  \&lt;br /&gt;
 32    50&lt;br /&gt;
      /&lt;br /&gt;
    37&lt;br /&gt;
      \&lt;br /&gt;
       40&lt;br /&gt;
60 i dalje nije u korenu, pa radimo rotaciju ulevo oko 20:&lt;br /&gt;
    30&lt;br /&gt;
   /  \&lt;br /&gt;
 20    60&lt;br /&gt;
      /&lt;br /&gt;
    34&lt;br /&gt;
   /  \&lt;br /&gt;
 32    50&lt;br /&gt;
      /&lt;br /&gt;
    37&lt;br /&gt;
      \&lt;br /&gt;
       40&lt;br /&gt;
a zatim rotaciju ulevo oko 30:&lt;br /&gt;
       60&lt;br /&gt;
      /&lt;br /&gt;
    30&lt;br /&gt;
   /  \&lt;br /&gt;
 20    34&lt;br /&gt;
      /  \&lt;br /&gt;
    32    50&lt;br /&gt;
         /&lt;br /&gt;
       37&lt;br /&gt;
         \&lt;br /&gt;
          40&lt;br /&gt;
Pošto 60 ima samo jedno dete, samo ga uklanjamo:&lt;br /&gt;
    30&lt;br /&gt;
   /  \&lt;br /&gt;
 20    34&lt;br /&gt;
      /  \&lt;br /&gt;
    32    50&lt;br /&gt;
         /&lt;br /&gt;
       37&lt;br /&gt;
         \&lt;br /&gt;
          40&lt;br /&gt;
Zatim brišemo čvor 31, prolazeći putem 30 → 34 → 32 → nil. Pošto je 32 poslednji čvor kojem smo pristupili, njega guramo u koren tako da prvo radimo rotaciju udesno oko 34:&lt;br /&gt;
    30&lt;br /&gt;
   /  \&lt;br /&gt;
 20    32&lt;br /&gt;
         \&lt;br /&gt;
          34&lt;br /&gt;
            \&lt;br /&gt;
             50&lt;br /&gt;
            /&lt;br /&gt;
          37&lt;br /&gt;
            \&lt;br /&gt;
             40&lt;br /&gt;
a zatim rotaciju ulevo oko 30, čime dobijamo...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Konačno stablo:&#039;&#039;&#039;&lt;br /&gt;
       32&lt;br /&gt;
      /  \&lt;br /&gt;
    30    34&lt;br /&gt;
   /        \&lt;br /&gt;
 20          50&lt;br /&gt;
            /&lt;br /&gt;
          37&lt;br /&gt;
            \&lt;br /&gt;
             40&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se samopodešavajuće stablo dato pokazivačem na koren &#039;&#039;root&#039;&#039;. Napisati pseudokod operacije &#039;&#039;split&#039;&#039;, koja od jednog datog stabla pravi dva nova tako da se u jednom stablu nalaze svi ključevi manji ili jednaki od zadatog ključa &#039;&#039;k&#039;&#039;, a u drugom stablu se nalaze svi ključevi veći od ključa &#039;&#039;k&#039;&#039;. Sam ključ &#039;&#039;k&#039;&#039; ne mora da se nalazi u početnom stablu. Smatrati da operacija SPLAY(&#039;&#039;x&#039;&#039;) koja vrši širenje zadatog čvora &#039;&#039;x&#039;&#039; postoji već implementirana.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SPLAY SPLIT(root, k)&lt;br /&gt;
if (root = nil) then&lt;br /&gt;
    return nil, nil&lt;br /&gt;
end_if&lt;br /&gt;
x = root&lt;br /&gt;
prev = left = right = nil&lt;br /&gt;
while (x ≠ nil) do&lt;br /&gt;
    prev = x&lt;br /&gt;
    if (key(x) = k) then&lt;br /&gt;
        break&lt;br /&gt;
    else if (key(x) &amp;lt; k) then&lt;br /&gt;
        x = right(x)&lt;br /&gt;
    else&lt;br /&gt;
        x = left(x)&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
SPLAY(prev)&lt;br /&gt;
if key(prev) ≤ k then&lt;br /&gt;
    left = prev&lt;br /&gt;
    right = right(prev)&lt;br /&gt;
    right(left) = nil&lt;br /&gt;
else&lt;br /&gt;
    right = prev&lt;br /&gt;
    left = left(prev)&lt;br /&gt;
    left(right) = nil&lt;br /&gt;
end_if&lt;br /&gt;
return left, right&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu iterativnu implementaciju funkcije koja u stablu binarnog pretraživanja na koje ukazuje pokazivač &#039;&#039;root&#039;&#039; pronalazi čvor koji sadrži najveći ključ koji je jednak ili manji od zadatog ključa &#039;&#039;key&#039;&#039;. Ključ &#039;&#039;key&#039;&#039; ne mora postojati u stablu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND BST FLOOR(root, key)&lt;br /&gt;
largest = nil&lt;br /&gt;
p = root&lt;br /&gt;
while (p ≠ nil) do&lt;br /&gt;
    if (key(p) = key) then&lt;br /&gt;
        return key&lt;br /&gt;
    else if (key(p) &amp;lt; key) then&lt;br /&gt;
        largest = p&lt;br /&gt;
        p = right(p)&lt;br /&gt;
    else&lt;br /&gt;
        p = left(p)&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
if (largest ≠ nil) then&lt;br /&gt;
    return key(largest)&lt;br /&gt;
end_if&lt;br /&gt;
return nil&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se posmatra stablo binarnog pretraživanja sa slike sa poznatim verovatnoćama uspešnog pretraživanja &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt; i neuspešnog pretraživanja &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; u tabelama u prilogu.&lt;br /&gt;
    25&lt;br /&gt;
   /  \&lt;br /&gt;
 12    33&lt;br /&gt;
   \&lt;br /&gt;
    19&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;lt;math&amp;gt;K_i&amp;lt;/math&amp;gt; !! 12 !! 19 !! 25 !! 33&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt;&lt;br /&gt;
| 0.2 || 0.2 || 0.15 || 0.05&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;lt;math&amp;gt;K_i&amp;lt;/math&amp;gt;&lt;br /&gt;
! &amp;lt;math&amp;gt;K_i &amp;lt; 12&amp;lt;/math&amp;gt;&lt;br /&gt;
! &amp;lt;math&amp;gt;12 &amp;lt; K_i &amp;lt; 19&amp;lt;/math&amp;gt;&lt;br /&gt;
! &amp;lt;math&amp;gt;19 &amp;lt; K_i &amp;lt; 25&amp;lt;/math&amp;gt;&lt;br /&gt;
! &amp;lt;math&amp;gt;25 &amp;lt; K_i &amp;lt; 33&amp;lt;/math&amp;gt;&lt;br /&gt;
! &amp;lt;math&amp;gt;33 &amp;lt; K_i&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
| 0.05 || 0.1 || 0.15 || 0.05 || 0.05&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Formalno definisati, a zatim izračunati cenu &#039;&#039;C&#039;&#039; ovog stabla.&lt;br /&gt;
# Ukoliko se od ključeva u stablu formira suboptimalno stablo binarnog pretraživanja kod koga se koren bira tako da razlika težina levog i desnog podstabla bude minimalna, odrediti takvo stablo i obrazložiti odgovor.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Cena binarnog stabla pretraživanja definiše se kao: &amp;lt;math&amp;gt;C = \sum_{i = 1}^{n} p_i (h_i + 1) + \sum_{i = 0}^{n} q_i h_i&amp;lt;/math&amp;gt; gde su:&lt;br /&gt;
* &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt; verovatnoće pretraživanja za neki od postojećih ključeva (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; odgovara poziciji ključa u uređenom nizu ključeva),&lt;br /&gt;
* &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; verovatnoće pretraživanja koje će završiti u jednom od eksternih čvorova stabla binarnog pretraživanja (&amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; odgovara poziciji eksternog čvora pri &#039;&#039;inorder&#039;&#039; obilasku svih eksternih čvorova) i&lt;br /&gt;
* &amp;lt;math&amp;gt;h_i&amp;lt;/math&amp;gt; odgovara nivou čvora.&lt;br /&gt;
S gornjom definicijom u vidu, stablu možemo docrtati eksterne čvorove:&lt;br /&gt;
       p3&lt;br /&gt;
     /    \&lt;br /&gt;
   p1      p4&lt;br /&gt;
  /  \    /  \&lt;br /&gt;
 q1   p2 q4  q5&lt;br /&gt;
     /  \&lt;br /&gt;
    q2  q3&lt;br /&gt;
i zatim izračunati cenu po formuli:&lt;br /&gt;
: &amp;lt;math&amp;gt;C = 2 \cdot 0.2 + 3 \cdot 0.2 + 1 \cdot 0.15 + 2 \cdot 0.05 +&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;+ 2 \cdot 0.05 + 3 \cdot 0.1 + 3 \cdot 0.15 + 2 \cdot 0.05 + 2 \cdot 0.05 =&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;= 0.4 + 0.6 + 0.15 + 0.1 + 0.1 + 0.3 + 0.45 + 0.1 + 0.1 = 2.3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
U zavisnosti od izbora korena imaćemo različite čvorove u levom i desnom podstablu. Izračunavamo razliku težina u datom stablu kao &amp;lt;math&amp;gt;(p_1 + p_2 + q_1 + q_2 + q_3) - (p_4 + q_4 + q_5) = (0.2 + 0.2 + 0.05 + 0.1 + 0.15) - (0.05 + 0.05 + 0.05) = 0.7 - 0.15 = 0.55&amp;lt;/math&amp;gt;. Prebacivanjem korena na čvor 33 vidimo da će doći do još manjeg balansa težina, stoga koren prebacujemo na čvor 19 i dobijamo stablo ispod:&lt;br /&gt;
       p2&lt;br /&gt;
     /    \&lt;br /&gt;
   p1      p3&lt;br /&gt;
  /  \    /  \&lt;br /&gt;
 q1  q2  q3   p4&lt;br /&gt;
             /  \&lt;br /&gt;
            q4  q5&lt;br /&gt;
&lt;br /&gt;
Za ovo stablo izračunavamo razliku težina kao &amp;lt;math&amp;gt;(p_1 + q_1 + q_2) - (p_3 + p_4 + q_3 + q_4 + q_5) = (0.2 + 0.05 + 0.1) - (0.15 + 0.05 + 0.15 + 0.05 + 0.05) = 0.35 - 0.45 = -0.1&amp;lt;/math&amp;gt;. Sada vidimo da je balans veći i da je prešao na drugu stranu, tako da znamo da će prebacivanjem korena na čvor 12 balans biti manji.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП2]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2018&amp;diff=7804</id>
		<title>АСП2/К1 2018</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2018&amp;diff=7804"/>
		<updated>2024-09-13T00:09:09Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K1_1819.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Optimalno stablo binarnog pretraživanja&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Navesti formulu za izračunavanje cene optimalnog stabla binarnog pretraživanja i objasniti je.&lt;br /&gt;
# Ukoliko se posmatraju tri ključa &amp;lt;math&amp;gt;K_1 &amp;lt; K_2 &amp;lt; K_3&amp;lt;/math&amp;gt; sa poznatim verovatnoćama uspešnog pretraživanja p1 = 0.2, p2 = 0.05, p3 = 0.1 i neuspešnog pretraživanja q0 = 0.15, q1 = 0.2, q2 = 0.1 i q3 = 0.2, odrediti i nacrtati optimalno stablo binarnog pretraživanja.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Formula je napisana i objašnjena u [[АСП2/К1 2019#8. zadatak|osmom zadatku na prvom kolokvijumu 2019. godine]].&lt;br /&gt;
&lt;br /&gt;
Postoji pet rasporeda ovih čvorova (&amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt; označavaju ključeve a &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; eksterne čvorove stabla):&lt;br /&gt;
    p1&lt;br /&gt;
   /  \&lt;br /&gt;
 q0    p2&lt;br /&gt;
      /  \&lt;br /&gt;
    q1    p3&lt;br /&gt;
         /  \&lt;br /&gt;
       q2    q3&lt;br /&gt;
: &amp;lt;math&amp;gt;C = 1 \cdot 0.2 + 2 \cdot 0.05 + 3 \cdot 0.1 +&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;+ 1 \cdot 0.15 + 2 \cdot 0.2 + 3 \cdot 0.1 + 3 \cdot 0.2 =&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;= 0.2 + 0.1 + 0.3 + 0.15 + 0.4 + 0.3 + 0.6 = 2.05&amp;lt;/math&amp;gt;&lt;br /&gt;
        p2&lt;br /&gt;
     /      \&lt;br /&gt;
    p1       p3&lt;br /&gt;
   /  \     /  \&lt;br /&gt;
 q0    q1 q2    q3&lt;br /&gt;
: &amp;lt;math&amp;gt;C = 2 \cdot 0.2 + 1 \cdot 0.05 + 2 \cdot 0.1 +&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;+ 2 \cdot 0.15 + 2 \cdot 0.2 + 2 \cdot 0.1 + 2 \cdot 0.2 =&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;= 0.4 + 0.05 + 0.2 + 0.3 + 0.4 + 0.2 + 0.4 = 1.95&amp;lt;/math&amp;gt;&lt;br /&gt;
          p3&lt;br /&gt;
         /  \&lt;br /&gt;
       p2    q3&lt;br /&gt;
      /  \&lt;br /&gt;
    p1    q2&lt;br /&gt;
   /  \&lt;br /&gt;
 q0    q1&lt;br /&gt;
: &amp;lt;math&amp;gt;C = 3 \cdot 0.2 + 2 \cdot 0.05 + 1 \cdot 0.1 +&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;+ 3 \cdot 0.15 + 3 \cdot 0.2 + 2 \cdot 0.1 + 1 \cdot 0.2 =&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;= 0.6 + 0.1 + 0.1 + 0.45 + 0.6 + 0.2 + 0.2 = 2.25&amp;lt;/math&amp;gt;&lt;br /&gt;
    p1&lt;br /&gt;
   /  \&lt;br /&gt;
 q0    p3&lt;br /&gt;
      /  \&lt;br /&gt;
    p2    q3&lt;br /&gt;
   /  \&lt;br /&gt;
 q1    q2&lt;br /&gt;
: &amp;lt;math&amp;gt;C = 1 \cdot 0.2 + 3 \cdot 0.05 + 2 \cdot 0.1 +&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;+ 1 \cdot 0.15 + 3 \cdot 0.2 + 3 \cdot 0.1 + 2 \cdot 0.2 =&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;= 0.2 + 0.15 + 0.2 + 0.15 + 0.6 + 0.3 + 0.4 = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
       p3&lt;br /&gt;
      /  \&lt;br /&gt;
    p1    q3&lt;br /&gt;
   /  \&lt;br /&gt;
 q0    p2&lt;br /&gt;
      /  \&lt;br /&gt;
    q1    q2&lt;br /&gt;
: &amp;lt;math&amp;gt;C = 2 \cdot 0.2 + 3 \cdot 0.05 + 1 \cdot 0.1 +&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;+ 2 \cdot 0.15 + 3 \cdot 0.2 + 3 \cdot 0.1 + 1 \cdot 0.2 =&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;= 0.4 + 0.15 + 0.1 + 0.3 + 0.6 + 0.3 + 0.2 = 2.05&amp;lt;/math&amp;gt;&lt;br /&gt;
Ovim dobijamo da je optimalno stablo binarnog pretraživanja za ova tri ključa stablo u kojem je &amp;lt;math&amp;gt;K_2&amp;lt;/math&amp;gt; u korenu.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu efikasnu iterativnu implementaciju funkcije koja u stablu binarnog pretraživanja na čiji koren ukazuje pokazivač &#039;&#039;root&#039;&#039; pronalazi sledbenika čvora koji sadrži ključ &#039;&#039;key&#039;&#039;. U okviru čvora stabla ne postoji pokazivač na oca.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ideja je da umesto &#039;&#039;inorder&#039;&#039; obilaska iskoristimo činjenicu da se sledbenik čvora sa ključem &#039;&#039;key&#039;&#039; može pronaći jednim spuštanjem niz stablo u pretrazi za ključem &#039;&#039;key&#039;&#039;. Postoje dva slučaja:&lt;br /&gt;
# kada čvor sa ključem &#039;&#039;key&#039;&#039; ima desno podstablo, znamo da se u njemu sigurno nalazi njegov sledbenik kao najlevlje dete desnog podstabla, i&lt;br /&gt;
# kada taj čvor nema desno podstablo, uzimamo poslednji čvor kod koga smo utvrdili da mu je ključ veći od ključa koji tražimo (poslednji čvor kod koga smo &amp;quot;otišli levo&amp;quot;).&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND BST SUCC(root, key)&lt;br /&gt;
p = root&lt;br /&gt;
succ = nil&lt;br /&gt;
while (key(p) ≠ key) do&lt;br /&gt;
    if (key(p) &amp;lt; key) then&lt;br /&gt;
        p = right(p)&lt;br /&gt;
    else if (key(p) &amp;gt; key) then&lt;br /&gt;
        succ = p&lt;br /&gt;
        p = left(p)&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
if (right(p) ≠ nil) then&lt;br /&gt;
    p = right(p)&lt;br /&gt;
    while (p ≠ nil) do&lt;br /&gt;
        succ = p&lt;br /&gt;
        p = left(p)&lt;br /&gt;
    end_while&lt;br /&gt;
end_if&lt;br /&gt;
return succ&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[Датотека:ASP2 K1 2018 zadatak 3 stablo.svg|thumb|Crveno-crno stablo iz postavke zadatka.]]&lt;br /&gt;
Neka se posmatra crveno-crno stablo sa slike. Prikazati izgled stabla po koracima nakon umetanja ključeva 81 i 79 i uklanjanja ključa 23.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U stablu binarne pretrage greškom su dva čvora zamenila svoje pozicije. Implementirati funkciju CORRECT_BST koja ispravlja grešku i vraća ova dva čvora na svoje prave pozicije. Svaki čvor osim celobrojnog ključa i pokazivača na levo i desno podstablo sadrži i pokazivač na oca.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pod zamenom čvorova se ne misli samo na zamenu ključeva u tim čvorovima već na zamenu zajedno sa podstablima, tako da jedna zamena ne može imati kaskadne posledice već će samo dva čvora ostati nekonzistentna.&lt;br /&gt;
&lt;br /&gt;
Ideja je na stek guramo decu čvorova za koje odredimo da upadaju u granice pretrage po stablu binarnog pretraživanja, a ako ne upadaju smestimo ih u jednu od dve promenljive i nakon toga zamenimo, pazeći da zamenimo i pokazivače na roditelje i roditeljske pokazivače.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CORRECT BST(root)&lt;br /&gt;
STACK_INIT(S_nodes)&lt;br /&gt;
STACK_INIT(S_low)&lt;br /&gt;
STACK_INIT(S_high)&lt;br /&gt;
PUSH(S_nodes, root)&lt;br /&gt;
PUSH(S_low, -∞)&lt;br /&gt;
PUSH(S_high, +∞)&lt;br /&gt;
while not STACK_EMPTY(S_nodes) do&lt;br /&gt;
    node = POP(S_nodes)&lt;br /&gt;
    low = POP(S_low)&lt;br /&gt;
    high = POP(S_high)&lt;br /&gt;
    if low &amp;lt; key(node) &amp;lt; high then&lt;br /&gt;
        if left(node) ≠ nil then&lt;br /&gt;
            PUSH(S_nodes, left(node))&lt;br /&gt;
            PUSH(S_low, low)&lt;br /&gt;
            PUSH(S_high, key(node))&lt;br /&gt;
        end_if&lt;br /&gt;
        if right(node) ≠ node then&lt;br /&gt;
            PUSH(S_nodes, right(node))&lt;br /&gt;
            PUSH(S_low, key(node))&lt;br /&gt;
            PUSH(S_high, high)&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        if first = nil then&lt;br /&gt;
            first = node&lt;br /&gt;
        else&lt;br /&gt;
            second = node&lt;br /&gt;
            break&lt;br /&gt;
        end_if&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
tmp = parent(first)&lt;br /&gt;
parent(first) = parent(second)&lt;br /&gt;
parent(second) = tmp&lt;br /&gt;
if left(parent(first)) = second then&lt;br /&gt;
    left(parent(first)) = first&lt;br /&gt;
else&lt;br /&gt;
    right(parent(first)) = first&lt;br /&gt;
end_if&lt;br /&gt;
if left(parent(second)) = first then&lt;br /&gt;
    left(parent(second)) = second&lt;br /&gt;
else&lt;br /&gt;
    right(parent(second)) = second&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se u prazno AVL stablo redom ubacuju ključevi 27, 12, 7, 34, 31, 5, 6, a zatim se brišu ključevi 31, 34, 12. Prilikom brisanja koristiti &#039;&#039;&#039;prethodnika&#039;&#039;&#039;. Prikazati izgled stabla nakon svakog izvršenog koraka pri umetanju i brisanju.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Konačno stablo je:&lt;br /&gt;
     7&lt;br /&gt;
    / \&lt;br /&gt;
   6   27&lt;br /&gt;
  /&lt;br /&gt;
 5&lt;br /&gt;
Postupak možete simulirati u nekom od [https://www.cs.usfca.edu/~galles/visualization/AVLtree.html simulatora] za AVL stabla.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koristeći metodu binarne pretrage kao ideju, napisati u pseudokodu funkciju koja efikasno proverava da li je tačka T teme &#039;&#039;n&#039;&#039;-tougla M. Mnogougao M se zadaje pomoću niza tačaka – temena. Tačke su određene koordinatama &#039;&#039;x&#039;&#039; i &#039;&#039;y&#039;&#039;. Niz temena mnogougla je uređen rastuće po vrednosti koordinate &#039;&#039;x&#039;&#039;, pri čemu za istu vrednost koordinate &#039;&#039;x&#039;&#039; važi rastuća uređenost po vrednosti koordinate &#039;&#039;y&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovde se radi obična binarna pretraga s tim što se uslovi za odlazak ulevo ili udesno menjaju: ukoliko je &#039;&#039;x&#039;&#039; koordinata trenutne tačke veća od tražene, ili ukoliko su iste ali je &#039;&#039;y&#039;&#039; koordinata veća od tražene, ide se ulevo, a ukoliko je &#039;&#039;x&#039;&#039; koordinata trenutne tačke manja od tražene, ili ukoliko su iste ali je &#039;&#039;y&#039;&#039; koordinata manja od tražene, ide se udesno.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CHECK VERTEX(M, n, T)&lt;br /&gt;
low = 1&lt;br /&gt;
high = n&lt;br /&gt;
while low ≤ high do&lt;br /&gt;
    mid = (high + low) / 2&lt;br /&gt;
    if (x(M[mid]) = x(T)) and (y(M[mid]) = y(T)) then&lt;br /&gt;
        return true&lt;br /&gt;
    else if (x(M[mid]) &amp;lt; x(T)) or ((x(M[mid]) = x(T)) and (y(M[mid]) &amp;lt; y(T))) then&lt;br /&gt;
        low = mid + 1&lt;br /&gt;
    else&lt;br /&gt;
        high = mid - 1&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
return false&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
Postupak se mogao pojednostaviti ukoliko se pretpostavi da ne može postojati više od dve tačke sa istom &#039;&#039;x&#039;&#039; koordinatom, jer bi u tom slučaju te tačke bile kolinearne i ne bi mogle da budu temena &#039;&#039;n&#039;&#039;-tougla.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je neuređeni niz &#039;&#039;A&#039;&#039; dužine &#039;&#039;n&#039;&#039; celobrojnih ključeva u opsegu vrednosti 1..100 koji se pretražuje i neuređeni niz ključeva &#039;&#039;K&#039;&#039; mnogo veće dužine &#039;&#039;m&#039;&#039; na koje se vrši pretraga. U nizu &#039;&#039;K&#039;&#039; ima veliki broj ponovljenih ključeva. Zbog neravnomerne verovatnoće pretrage ključeva, koristi se sledeća tehnika optimizacije. Nakon svakog uspešnog pretraživanja, vrši se prebacivanje za &#039;&#039;p&#039;&#039; pozicija unapred, gde je &#039;&#039;p&#039;&#039; broj uspešnih nalaženja tog ključa. Napisati u pseudokodu funkciju koja redom pretražuje niz &#039;&#039;A&#039;&#039; na ključeve iz niza &#039;&#039;K&#039;&#039; i vraća prosečan broj poređenja po nađenom ključu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SEARCH(A, K, n, m)&lt;br /&gt;
for i = 1 to 100 do&lt;br /&gt;
    P[i] = 0&lt;br /&gt;
end_for&lt;br /&gt;
sum = 0&lt;br /&gt;
num = 0&lt;br /&gt;
for i = 1 to m do&lt;br /&gt;
    key = K[i]&lt;br /&gt;
    found = 0&lt;br /&gt;
    for j = 1 to n do&lt;br /&gt;
        if A[j] = key then&lt;br /&gt;
            found = j&lt;br /&gt;
            break&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    if found ≠ 0 then&lt;br /&gt;
        sum = sum + j&lt;br /&gt;
        num = num + 1&lt;br /&gt;
        P[key] = P[key] + 1&lt;br /&gt;
        for k = found downto found - P[key] + 1 do&lt;br /&gt;
            A[k] = A[k-1]&lt;br /&gt;
        end_for&lt;br /&gt;
        A[found - P[key]] = key&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
if num = 0 then&lt;br /&gt;
    return 0&lt;br /&gt;
else&lt;br /&gt;
    return sum/num&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Obrazložiti da li je sledeća sekvenca ključeva validna u stablu binarnog pretraživanja:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Ako se prilikom uspešnog pretraživanja u jednom stablu redom proveravaju ključevi 23, 87, 158, 348, 160, 200, 150, 158.&lt;br /&gt;
# Ako se prilikom neuspešnog pretraživanja u drugom stablu redom proveravaju ključevi 546, 453, 427, 68, 415, 231, 247, 417, 300.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovde gledamo naš silazak niz potencijalni BST i na osnovu prethodno pogledanih čvorova određujemo granice &#039;&#039;high&#039;&#039; i &#039;&#039;low&#039;&#039; u kojima se moraju nalaziti naredni ključevi kako bi stablo bilo validan BST. Dobijamo da oba slučaja nisu moguća u binarnom stablu pretraživanja.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
## 23 → 87, low = 23, high = +∞&lt;br /&gt;
## 87 → 158, low = 87, high = +∞&lt;br /&gt;
## 158 → 348, low = 158, high = +∞&lt;br /&gt;
## 348 → 160, low = 158, high = 348&lt;br /&gt;
## 160 → 200, low = 160, high = 348&lt;br /&gt;
## 200 → 150, 150 &amp;lt; low =&amp;gt; ⚡&lt;br /&gt;
#&lt;br /&gt;
## 546 → 453, low = -∞, high = 546&lt;br /&gt;
## 453 → 427, low = -∞, high = 453&lt;br /&gt;
## 427 → 68, low = -∞, high = 427&lt;br /&gt;
## 68 → 415, low = 68, high = 427&lt;br /&gt;
## 415 → 231, low = 68, high = 415&lt;br /&gt;
## 231 → 247, low = 231, high = 415&lt;br /&gt;
## 247 → 417, 417 &amp;gt; high =&amp;gt; ⚡&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2017&amp;diff=7803</id>
		<title>АСП2/К1 2017</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2017&amp;diff=7803"/>
		<updated>2024-09-13T00:09:08Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K1_1718.pdf Zadaci sa stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Uporediti metode binarne i višestruke sekvencijalne pretrage nad uređenim nizom celih brojeva 3, 7, 10, 11, 18, 22, 25, 27, 39, 41, 45, 48, 56, 64, 65, 78, 86. Odrediti broj poređenja pri pretrazi ključeva 25 i 44 za obe tehnike.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tabela iz postavke zadatka.&lt;br /&gt;
! 0 !! 1 !! 2 !! 3 !! 4 !! 5 !! 6 !! 7 !! 8 !! 9 !! 10 !! 11 !! 12 !! 13 !! 14 !! 15 !! 16&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 7 || 10 || 11 || 18 || 22 || 25 || 27 || 39 || 41 || 45 || 48 || 56 || 64 || 65 || 78 || 86&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Višestrukom sekvencijalnom pretragom prvo idemo od ključa 3 do ključa 25, čime radimo 7 poređenja na nejednakost i jedno poređenje na jednakost, a zatim idemo od ključa 25 do ključa 45 čime radimo 5 poređenja na nejednakost i jedno poređenje na jednakost, što ukupno daje 14 poređenja na vrednost ključa.&lt;br /&gt;
&lt;br /&gt;
Binarnom pretragom prvo gađamo ključ 39 (2), pa 11 (2), pa 22 (2) i na kraju 25 (1), a zatim u drugoj pretrazi 39 (2), pa 56 (2), pa 45 (2), pa 41 (2) i tu se pretraga završava neuspešno, čime vršimo 15 poređenja na vrednost ključa.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Funkciji FIND_BST prosleđen je pokazivač root na koren jednog kompletnog binarnog stabla. Struktura čvora ovog stabla osim ključa, pokazivača na levo i desno podstablo, sadrži i pokazivač na oca. Implementirati iterativnu funkciju FIND_BST čija povratna vrednost treba da bude pokazivač na koren onog podstabla koje predstavlja stablo binarne pretrage. Ukoliko postoji više ovakvih podstabala, treba vratiti pokazivač na koren onog podstabla sa maksimalnim brojem čvorova. Proveru da li je neko podstablo stablo binarne pretrage izdvojiti u posebnu funkciju. Obavezno kratko prokomentarisati rešenje.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovde nam je najpogodnije da &#039;&#039;postorder&#039;&#039; obilaskom određujemo da li su čvorovi binarna stabla pretraživanja, jer tako kad stignemo do viših čvorova već znamo da li su im deca ispravna binarna stabla pretraživanja. S tim u vidu, implementacija tražene funkcije za proveru izgleda ovako:&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
IS BST(node, left_max, right_min)&lt;br /&gt;
if left_max &amp;lt; key(node) &amp;lt; right_min then&lt;br /&gt;
    return true&lt;br /&gt;
end_if&lt;br /&gt;
return false&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
Kao pozivne argumente ove funkcije primamo najveći ključ iz levog podstabla i najmanji ključ iz desnog podstabla, što znači da bi trebalo da te podatke čuvamo u nekom redu kako bismo iz roditelja mogli da tim informacijama pristupimo. Obilazak kreće od reda listova i kreće se tako što svaki list gura svog roditelja u red, a duplikati roditelja se izbacuju iz reda prilikom njihovog obilaska.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND BST(root)&lt;br /&gt;
if root = nil then&lt;br /&gt;
    return nil&lt;br /&gt;
end_if&lt;br /&gt;
last_bst = nil&lt;br /&gt;
QUEUE_INIT(Q_valid_bst)&lt;br /&gt;
QUEUE_INIT(Q_nodes)&lt;br /&gt;
QUEUE_INIT(Q_inv_nodes)&lt;br /&gt;
QUEUE_INIT(Q_max)&lt;br /&gt;
QUEUE_INIT(Q_min)&lt;br /&gt;
INSERT(Q_nodes, root)&lt;br /&gt;
while (not QUEUE_EMPTY(Q_nodes)) do&lt;br /&gt;
    node = DELETE(Q_nodes)&lt;br /&gt;
    if left(node) ≠ nil then&lt;br /&gt;
        INSERT(Q_nodes, left(node))&lt;br /&gt;
        INSERT(Q_nodes, right(node))&lt;br /&gt;
    else&lt;br /&gt;
        INSERT(Q_inv_nodes, node)&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
while (not QUEUE_EMPTY(Q_inv_nodes)) do&lt;br /&gt;
    node = DELETE(Q_inv_nodes)&lt;br /&gt;
    if left(node) = nil then&lt;br /&gt;
        valid_bst = true&lt;br /&gt;
        curr_max = key(node)&lt;br /&gt;
        curr_min = key(node)&lt;br /&gt;
    else&lt;br /&gt;
        DELETE(Q_inv_nodes)&lt;br /&gt;
        left_valid = DELETE(Q_valid_bst)&lt;br /&gt;
        right_valid = DELETE(Q_valid_bst)&lt;br /&gt;
        left_min = DELETE(Q_min)&lt;br /&gt;
        right_min = DELETE(Q_min)&lt;br /&gt;
        left_max = DELETE(Q_max)&lt;br /&gt;
        right_max = DELETE(Q_max)&lt;br /&gt;
        if left_valid and right_valid and IS_BST(node, left_max, right_min) then&lt;br /&gt;
            valid_bst = true&lt;br /&gt;
        else&lt;br /&gt;
            valid_bst = false&lt;br /&gt;
        end_if&lt;br /&gt;
        curr_max = max(key(node), left_max, right_max)&lt;br /&gt;
        curr_min = min(key(node), left_min, right_min)&lt;br /&gt;
    end_if&lt;br /&gt;
    if valid_bst then&lt;br /&gt;
        last_bst = node&lt;br /&gt;
    end_if&lt;br /&gt;
    INSERT(Q_valid_bst, valid_bst)&lt;br /&gt;
    INSERT(Q_inv_nodes, parent(node))&lt;br /&gt;
    INSERT(Q_min, curr_min)&lt;br /&gt;
    INSERT(Q_max, curr_max)&lt;br /&gt;
end_while&lt;br /&gt;
return last_bst&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[Датотека:ASP2 K1 2018 zadatak 3 stablo.svg|thumb|Crveno-crno stablo iz postavke zadatka.]]&lt;br /&gt;
Neka se posmatra crveno-crno stablo sa slike. Prikazati izgled stabla po koracima nakon umetanja ključeva 7 i 10.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Koristeći modifikovanu binarnu pretragu, napisati u pseudukodu iterativnu funkciju koja vraća poziciju prethodnika i sledbenika zadate vrednosti &#039;&#039;k&#039;&#039; u zadatom uređenom nizu &#039;&#039;arr&#039;&#039;. Vrednost k ne mora postojati u nizu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovde se pretpostavlja da se ključevi u nizu ne mogu ponavljati.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
ARR PRED SUCC(arr, k)&lt;br /&gt;
while (low ≤ high) do&lt;br /&gt;
  mid = (high + low) / 2&lt;br /&gt;
  if arr[mid] = k then&lt;br /&gt;
      return mid-1, mid+1&lt;br /&gt;
  else if arr[mid] &amp;lt; k then&lt;br /&gt;
      low = mid + 1&lt;br /&gt;
  else&lt;br /&gt;
      high = mid - 1&lt;br /&gt;
  end_if&lt;br /&gt;
end_while&lt;br /&gt;
if arr[mid] &amp;lt; k then&lt;br /&gt;
  return mid, mid+1&lt;br /&gt;
else&lt;br /&gt;
  return mid-1, mid&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se u prazno AVL stablo redom ubacuju ključevi 12, 43, 23, 55, 72, 2, 60, 57, 89, a zatim se brišu ključevi 12, 23 i 57. Prilikom brisanja koristiti &#039;&#039;&#039;prethodnika&#039;&#039;&#039;. Prikazati izgled stabla nakon svakog izvršenog koraka pri umetanju i brisanju&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Konačno stablo je:&lt;br /&gt;
      60&lt;br /&gt;
     /  \&lt;br /&gt;
   43    72&lt;br /&gt;
  /  \     \&lt;br /&gt;
 2   55     89&lt;br /&gt;
Postupak možete simulirati u nekom od [https://www.cs.usfca.edu/~galles/visualization/AVLtree.html simulatora] za AVL stabla.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu funkciju koja efikasno proverava da li je dato binarno stablo pretrage &#039;&#039;bst&#039;&#039; balansirano po AVL kriterijumu. Pored pokazivača na oca i levog i desnog sina, čvor stabla sadrži i podatke o visini levog i desnog podstabla.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pošto ne moramo da izračunavamo visine podstabla, ovaj zadatak se svodi na posećivanje svih čvorova kako bismo uporedili sve visine levih i desnih podstabala u jednom čvoru. Ukoliko se u nekom razlikuju za više od 1, stablo nije balansirano po AVL kriterijumu.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CHECK AVL BALANCED(bst)&lt;br /&gt;
INIT_STACK(S)&lt;br /&gt;
PUSH(S, bst)&lt;br /&gt;
while (not STACK_EMPTY(S)) do&lt;br /&gt;
    node = POP(S)&lt;br /&gt;
    if abs(height_l(node) - height_r(node)) &amp;gt; 1 then&lt;br /&gt;
        return false&lt;br /&gt;
    end_if&lt;br /&gt;
    if height_l(node) &amp;gt; 2 then&lt;br /&gt;
        PUSH(S, left(node))&lt;br /&gt;
    end_if&lt;br /&gt;
    if height_r(node) &amp;gt; 2 then&lt;br /&gt;
        PUSH(S, right(node))&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
return true&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Suboptimalno stablo binarnog pretraživanja&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Objasniti algoritam za određivanje suboptimalnog stabla binarnog pretraživanja koji je zasnovan na težinama podstabala.&lt;br /&gt;
# Ako su za &#039;&#039;n&#039;&#039; ključeva date verovatnoće uspešnog pretraživanja u nizu &#039;&#039;P&#039;&#039;, a neuspešnog u nizu &#039;&#039;Q&#039;&#039;, napisati efikasnu implementaciju funkcije koja nalazi samo koren tog stabla.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Određivanje suboptimalnog stabla binarnog pretraživanja zasnovanog na težinama podstabala, gde je težina podstabla koje uključuje čvorove na pozicijama od &amp;lt;math&amp;gt;i+1&amp;lt;/math&amp;gt; do &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; u tabeli definisana kao &amp;lt;math&amp;gt;w_{ij} = q_i + p_{i+1} + q_{i+1} + ... + p_j + q_j&amp;lt;/math&amp;gt;, se vrši tako što se prvo odredi ključ koji, kad postavljen za koren, daje najmanju razliku težina levog i desnog podstabla, a zatim se taj proces primeni rekurzivno na levo i desno podstablo (podniz) kako bi se i njihovi koreni odredili.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND ROOT(P, Q, n)&lt;br /&gt;
min_key = 1&lt;br /&gt;
left = Q[1]&lt;br /&gt;
right = 1 - left - P[1]&lt;br /&gt;
min_diff = abs(right - left)&lt;br /&gt;
for i = 2 to n do&lt;br /&gt;
    left = left + Q[i] + P[i-1]&lt;br /&gt;
    right = 1 - left - P[i]&lt;br /&gt;
    diff = abs(right - left)&lt;br /&gt;
    if diff &amp;lt; min_diff then&lt;br /&gt;
        min_diff = diff&lt;br /&gt;
        min_key = i&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
return min_key&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se u samopodešavajuće stablo umeću redom ključevi 50, 70, 30, 60, 40, zatim se pretražuje na 70, pa se umeće 45 i, na kraju, pretražuje na 30. Prikazati izgled stabla nakon svake operacije.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Konačno stablo je:&lt;br /&gt;
 30&lt;br /&gt;
   \&lt;br /&gt;
    40&lt;br /&gt;
      \&lt;br /&gt;
       45&lt;br /&gt;
         \&lt;br /&gt;
          60&lt;br /&gt;
         /  \&lt;br /&gt;
        50   70&lt;br /&gt;
Postupak možete simulirati u nekom od [https://www.cs.usfca.edu/~galles/visualization/SplayTree.html simulatora] za samopodešavajuća stabla.&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2016&amp;diff=7802</id>
		<title>АСП2/К1 2016</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2016&amp;diff=7802"/>
		<updated>2024-09-13T00:09:07Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K1_1617.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako je &#039;&#039;inorder&#039;&#039; obilaskom nekog stabla binarnog pretraživanja dobijen niz ključeva 1 5 8 9 11 14 prikazati tri moguća izgleda ovog stabla sa: (a) najmanjom visinom, (b) najvećom visinom i (c) visinom između najmanje i najveće. Obeležiti stablo sa najboljim i najlošijim performansama operacija.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Stablo A ima najbolje performanse operacija:&lt;br /&gt;
     9&lt;br /&gt;
    / \&lt;br /&gt;
   5   11&lt;br /&gt;
  / \    \&lt;br /&gt;
 1   8    14&lt;br /&gt;
Stablo B ima najlošije performanse operacija:&lt;br /&gt;
 1&lt;br /&gt;
  \&lt;br /&gt;
   5&lt;br /&gt;
    \&lt;br /&gt;
     8&lt;br /&gt;
      \&lt;br /&gt;
       9&lt;br /&gt;
        \&lt;br /&gt;
         11&lt;br /&gt;
           \&lt;br /&gt;
            14&lt;br /&gt;
Stablo C nema ni najbolje ni najlošije performanse operacija:&lt;br /&gt;
         11&lt;br /&gt;
        /  \&lt;br /&gt;
       9    14&lt;br /&gt;
      /&lt;br /&gt;
     8&lt;br /&gt;
    /&lt;br /&gt;
   5&lt;br /&gt;
  /&lt;br /&gt;
 1&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je niz celih brojeva. Koristeći stablo binarnog pretraživanja, napisati funkciju koja menja svaki element njegovim sledbenikom. U slučaju da element nema sledbenika, zadržati originalnu vrednost. Rezultat funkcije je niz preuredjen na opisani način.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovde prvo prebacujemo zadati niz u binarno stablo pretraživanja koristeći funkciju za umetanje čvora a zatim za svaki element niza pronalazimo sledbenika slično kao u [[АСП2/К1 2018#2. zadatak|drugom zadatku sa prvog kolokvijuma 2018]].&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
ARR TRANSFORM(arr, n)&lt;br /&gt;
bst = nil&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    BST-INSERT(bst, arr[i])&lt;br /&gt;
end_for&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    key = arr[i]&lt;br /&gt;
    p = bst&lt;br /&gt;
    prev = nil&lt;br /&gt;
    while (p ≠ nil) and (key(p) ≠ key) do&lt;br /&gt;
        if key(p) &amp;gt; key then&lt;br /&gt;
            prev = p&lt;br /&gt;
            p = left(p)&lt;br /&gt;
        else&lt;br /&gt;
            p = right(p)&lt;br /&gt;
        end_if&lt;br /&gt;
    end_while&lt;br /&gt;
    p = right(p)&lt;br /&gt;
    while p ≠ nil do&lt;br /&gt;
        prev = p&lt;br /&gt;
        p = left(p)&lt;br /&gt;
    end_while&lt;br /&gt;
    if prev ≠ nil then&lt;br /&gt;
        arr[i] = key(prev)&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
BST-INSERT(bst, key)&lt;br /&gt;
node = GETNODE&lt;br /&gt;
key(node) = key&lt;br /&gt;
if bst = nil then&lt;br /&gt;
    bst = node&lt;br /&gt;
else&lt;br /&gt;
    p = bst&lt;br /&gt;
    while true do&lt;br /&gt;
        if key(p) &amp;gt; key then&lt;br /&gt;
            if left(p) = nil then&lt;br /&gt;
                left(p) = node&lt;br /&gt;
                break&lt;br /&gt;
            else&lt;br /&gt;
                p = left(p)&lt;br /&gt;
            end_if&lt;br /&gt;
        else&lt;br /&gt;
            if right(p) = nil then&lt;br /&gt;
                right(p) = node&lt;br /&gt;
                break&lt;br /&gt;
            else&lt;br /&gt;
                p = right(p)&lt;br /&gt;
            end_if&lt;br /&gt;
        end_if&lt;br /&gt;
    end_while&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka je dat rastuće uređeni niz celih brojeva (npr., 1 2 3 5 7 9) ili neka njegova rotacija (npr., 5 7 9 1 2 3). Vrednosti se ne ponavljaju u nizu. Napisati u pseudokodu iterativnu funkciju koja na efikasan način pronalazi minimalnu vrednost u nizu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovaj problem se svodi na binarnu pretragu sa izmenjenim uslovima: sada detektujemo da li se nalazimo levo ili desno od tražene vrednosti poredeći se sa prvim elementom (ukoliko je trenutni element veći od prvog, levo smo od tražene vrednosti) a detekciju tražene vrednosti tako što proverimo da li je element levo od trenutnog veći od njega (to znači da smo došli na početak nerotiranog niza).&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND MIN(arr, n)&lt;br /&gt;
low = 1&lt;br /&gt;
high = n&lt;br /&gt;
if arr[1] ≤ arr[n] then&lt;br /&gt;
    return arr[1]&lt;br /&gt;
end_if&lt;br /&gt;
while low ≤ high do&lt;br /&gt;
    mid = (high + low) / 2&lt;br /&gt;
    if arr[mid] &amp;lt; arr[mid-1] then&lt;br /&gt;
        return arr[mid]&lt;br /&gt;
    else if arr[mid] &amp;lt; arr[1] then&lt;br /&gt;
        high = mid - 1&lt;br /&gt;
    else&lt;br /&gt;
        low = mid + 1&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Binarno pretraživanje u povećanoj tabeli&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Objasniti na koji način se vrši umetanje i brisanje u povećanoj tabeli.&lt;br /&gt;
# Data je povećana tabela uređena neopadajuće i odgovarajući vektor sa bitovima validnosti. Na slici je prikazano trenutno stanje. Prikazati izgled povećane tabele i vektora validnosti nakon umetanja svakog od kljuceva: 6, 29 i 35, a zatim ukloniti ključeve : 18 i 23 i prikazati finalno stanje.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Početno stanje povećane tabele&lt;br /&gt;
| 5 || 5 || 9 || 18 || 22 || 22 || 23 || 25 || 28 || 38 || 40&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || 1  || 0  || 0  || 0  || 1  || 0  || 1  || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Umetanje se vrši tako što prvo uradimo (binarnu) pretragu za neki ključ i ako utvrdimo da postoji (da postoji ključ sa traženom vrednošću u tabeli i da mu je bit validnosti postavljen na 1) bacamo grešku, u suprotnom proveravamo bit validnosti na polju do kojeg smo došli: ako je 1, moramo pomeriti sve validne ključeve koji slede nakon tog polja za jedno mesto unapred kako bismo mogli da ubacimo ključ na to polje. Pri ubacivanju se bit validnosti tog ključa postavi na 1, svi sledeći nevalidni ključevi se postave na tu vrednost a svi prethodni na vrednost prethodnog validnog ključa.&lt;br /&gt;
&lt;br /&gt;
Pri brisanju se nakon pretrage za dati ključ, bit validnosti ključa samo postavi na 0 ukoliko postoji ili baci greška ukoliko ne postoji.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje povećane tabele nakon unosa ključa 6&lt;br /&gt;
| 5 || 6 || 6 || 18 || 22 || 22 || 23 || 25 || 28 || 38 || 40&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || 1  || 0  || 0  || 0  || 1  || 0  || 1  || 0&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje povećane tabele nakon unosa ključa 29&lt;br /&gt;
| 5 || 6 || 6 || 18 || 22 || 22 || 23 || 25 || 25 || 29 || 38&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || 1  || 0  || 0  || 0  || 1  || 0  || 1  || 1&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; | Takođe je moguće da se, uz napomenu, pri nailasku na ključ veći od traženog gleda levo umesto desno.&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje povećane tabele nakon unosa ključa 35&lt;br /&gt;
| 5 || 6 || 6 || 18 || 22 || 22 || 23 || 25 || 29 || 35 || 38&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || 1  || 0  || 0  || 0  || 1  || 1  || 1  || 1&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;11&amp;quot; | Postoje dva načina na koji možemo da rešimo situaciju kad naiđemo na 38 i ne možemo da ga pomerimo udesno:&lt;br /&gt;
* kažemo da se desila greška pošto ne možemo dalje da umećemo, ili&lt;br /&gt;
* pomerimo ključ 29 ulevo (preporučeno).&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Stanje povećane tabele nakon uklanjanja ključa 18&lt;br /&gt;
| 5 || 6 || 6 || 18 || 22 || 22 || 23 || 25 || 29 || 35 || 38&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || 0  || 0  || 0  || 0  || 1  || 1  || 1  || 1&lt;br /&gt;
|}&lt;br /&gt;
Brisanjem ključa 23 dešava se greška jer taj ključ ne postoji.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je stablo binarnog pretraživanja. Da li stablo zadato na slici zadovoljava kriterijum AVL stabla? Ukoliko ne, izvršiti balansiranje stabla po AVL kriterijumu, a zatim iz dobijenog stabla obrisati ključeve 55 i 20, pa u stablo umetnuti ključ 30. Prilikom brisanja, koristiti sledbenika. Prikazati izgled stabla nakon svake izvršene izmene.&lt;br /&gt;
         20&lt;br /&gt;
        /  \&lt;br /&gt;
      17    32&lt;br /&gt;
     /     /  \&lt;br /&gt;
   10    25    33&lt;br /&gt;
  /     /  \     \&lt;br /&gt;
 5     22  27     57&lt;br /&gt;
                 /  \&lt;br /&gt;
                55  71&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; data-expandtext=&amp;quot;Prikaži postupak&amp;quot; data-collapsetext=&amp;quot;Sakrij postupak&amp;quot;&amp;gt;&lt;br /&gt;
Vidimo da su kritični čvorovi ovde 17 i 33. Prvo radimo desnu rotaciju oko čvora 17:&lt;br /&gt;
       20&lt;br /&gt;
     /    \&lt;br /&gt;
   10      32&lt;br /&gt;
  /  \    /  \&lt;br /&gt;
 5   17 25    33&lt;br /&gt;
       /  \     \&lt;br /&gt;
      22  27     57&lt;br /&gt;
                /  \&lt;br /&gt;
               55  71&lt;br /&gt;
čime taj čvor više nije kritičan, ali zbog skraćivanja dužine levog podstabla čvor 20 postaje kritičan. Zatim radimo levu rotaciju oko čvora 33:&lt;br /&gt;
       20&lt;br /&gt;
     /    \&lt;br /&gt;
   10       32&lt;br /&gt;
  /  \    /    \&lt;br /&gt;
 5   17 25      57&lt;br /&gt;
       /  \    /  \&lt;br /&gt;
      22  27  33   71&lt;br /&gt;
                \&lt;br /&gt;
                 55&lt;br /&gt;
čime čvor 33 više nije kritičan. Na kraju, radimo levu rotaciju oko čvora 20:&lt;br /&gt;
              32&lt;br /&gt;
           /      \&lt;br /&gt;
       20           57&lt;br /&gt;
    /      \       /  \&lt;br /&gt;
   10      25    33    71&lt;br /&gt;
  /  \    /  \     \&lt;br /&gt;
 5   17  22  27     55&lt;br /&gt;
Briše se čvor 55. Čvor je list tako da je brisanje trivijalno. Stablo ostaje balansirano nakon brisanja ovog čvora.&lt;br /&gt;
              32&lt;br /&gt;
           /      \&lt;br /&gt;
       20           57&lt;br /&gt;
    /      \       /  \&lt;br /&gt;
   10      25    33    71&lt;br /&gt;
  /  \    /  \      &lt;br /&gt;
 5   17  22  27&lt;br /&gt;
Brišemo čvor 20. Na njegovo mesto stavljamo njegovog sledbenika 22.&lt;br /&gt;
              32&lt;br /&gt;
           /      \&lt;br /&gt;
       22           57&lt;br /&gt;
    /      \       /  \&lt;br /&gt;
   10      25    33    71&lt;br /&gt;
  /  \       \      &lt;br /&gt;
 5   17      27&lt;br /&gt;
Umećemo čvor 30 kao desnog sina 27.&lt;br /&gt;
              32&lt;br /&gt;
           /      \&lt;br /&gt;
       22           57&lt;br /&gt;
    /      \       /  \&lt;br /&gt;
   10      25    33    71&lt;br /&gt;
  /  \       \      &lt;br /&gt;
 5   17       27&lt;br /&gt;
                \&lt;br /&gt;
                 30&lt;br /&gt;
Njegovim umetanjem čvor 25 postaje kritičan pa zato radimo rotaciju ulevo oko njega i time dobijamo...&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Konačno stablo:&#039;&#039;&#039;&lt;br /&gt;
              32&lt;br /&gt;
           /      \&lt;br /&gt;
       22           57&lt;br /&gt;
    /      \       /  \&lt;br /&gt;
   10      27    33    71&lt;br /&gt;
  /  \    /  \      &lt;br /&gt;
 5   17 25    30&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[Датотека:ASP2 K1 2016 zadatak 6 stablo.svg|thumb|Crveno-crno stablo iz postavke zadatka.]]&lt;br /&gt;
U crveno-crnom stablu sa slike se najpre izvrši brisanje ključa 35, a zatim umetanje ključeva 9, 43, 10. Prikazati izgled stabla nakon svake od navedenih promena.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# U pseudokodu napisati funkciju koja za AVL stablo zadate visine &#039;&#039;h&#039;&#039; izračunava najmanji broj čvorova koje stablo može da sadrži.&lt;br /&gt;
# Na kojoj visini može da se nalazi list najbliži korenu?&lt;br /&gt;
# Kako se nazivaju ovakva stabla i po čemu su dobila ime?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Pseudokod je dat ispod.&lt;br /&gt;
# &#039;&#039;ceil(h / 2)&#039;&#039;. Ovo je zato što su podstabla Fibonačijevih stabala isto Fibonačijeva stabla, tako da se najmanja visina lista izračunava kao najmanja visina lista Fibonačijevog stabla čija je visina za 2 manja od trenutnog uvećana za 1.&lt;br /&gt;
# Ovakva stabla, koja su najgori slučajevi AVL stabala, dobila su ime po Fibonačijevim brojevima &amp;lt;!--(koji su, pak, dobili naziv po poznatom srpskom glumcu Miljanu Fibonačiju Markoviću)--&amp;gt; čija se rekurzivna definicija veoma malo razlikuje od rekurzivne definicije broja čvorova ovakvih stabala u zavisnosti od njihove visine.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
AVL MIN NODES(h)&lt;br /&gt;
if h = 0 then&lt;br /&gt;
    return 1&lt;br /&gt;
else if h = 1 then&lt;br /&gt;
    return 2&lt;br /&gt;
else&lt;br /&gt;
    return AVL_MIN_NODES(h - 1) + AVL_MIN_NODES(h - 2) + 1&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za stablo binarnog pretraživanja koje sadrži ključeve K1 &amp;lt; K2 &amp;lt; ... &amp;lt; Kn i čiji je koren ključ Kr izvesti vezu cene stabla i cena podstabla. Obavezno objasniti postupak.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Cena podstabla se definiše kao:&lt;br /&gt;
: &amp;lt;math&amp;gt;C_{ij} = \sum_{k = i+1}^j p_k (h_k + 1) + \sum_{k = i}^j q_k h_k&amp;lt;/math&amp;gt;&lt;br /&gt;
gde su &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt; verovatnoće uspešnog, &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; neuspešnog pretraživanja a &amp;lt;math&amp;gt;h_i&amp;lt;/math&amp;gt; visine čvorova &amp;lt;math&amp;gt;K_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Uzimamo da su prvi čvor levog podstabla i poslednji čvor desnog podstabla trenutnog čvora po &#039;&#039;inorder&#039;&#039; poretku &amp;lt;math&amp;gt;K_i&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;K_j&amp;lt;/math&amp;gt; a trenutni čvor &amp;lt;math&amp;gt;K_k&amp;lt;/math&amp;gt;. Pošto je visina u formuli za cene levog i desnog podstabla sada povećana za 1, dobijamo da je ukupna cena trenutnog čvora jednaka:&lt;br /&gt;
: &amp;lt;math&amp;gt;C_{ij} = \left(\sum_{m = i+1}^{k-1} p_m (h_m + 2) + \sum_{m = i}^{k-1} q_m (h_m + 1)\right) + p_k + \left(\sum_{m = k+1}^{j} p_m (h_m + 2) + \sum_{m = k}^{j} q_m (h_m + 1)\right) =&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;= \left(\sum_{m = i+1}^{k-1} p_m (h_m + 1) + \sum_{m = i+1}^{k-1} p_m + \sum_{m = i}^{k-1} q_m h_m + \sum_{m = i}^{k-1} q_m\right) + p_k + \left(\sum_{m = k+1}^{j} p_m (h_m + 1) + \sum_{m = k+1}^{j} p_m + \sum_{m = k}^{j} q_m h_m + \sum_{m = k}^{j} q_m\right) =&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;= \left(\sum_{m = i+1}^{k-1} p_m (h_m + 1) + \sum_{m = i}^{k-1} q_m h_m\right) + \left(\sum_{m = k+1}^{j} p_m (h_m + 1) + \sum_{m = k}^{j} q_m h_m\right) + w_{ij} =&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;= C_{i,k-1} + C_{k,j} + w_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2015&amp;diff=7801</id>
		<title>АСП2/К1 2015</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2015&amp;diff=7801"/>
		<updated>2024-09-13T00:09:07Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S112ASP2_K1_1516.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Skup ključeva smešten je u stablo binarnog pretraživanja. Nakon brisanja ključa 12, dobijen je izgled stabla prikazan na slici. Pod pretpostavkom da je ključ 9 umetnut u stablo nakon ključa 12, da nije bilo prethodnih brisanja ključeva i da se prilikom brisanja koristi sledbenik, prikazati izgled stabla neposredno pre brisanja ključa 12.&lt;br /&gt;
     6&lt;br /&gt;
    / \&lt;br /&gt;
   5   15&lt;br /&gt;
  /   /  \&lt;br /&gt;
 3   7    18&lt;br /&gt;
  \   \   /&lt;br /&gt;
   4   9 16&lt;br /&gt;
      /   \&lt;br /&gt;
     8     17&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
       6&lt;br /&gt;
    /     \&lt;br /&gt;
   5       15&lt;br /&gt;
  /       /  \&lt;br /&gt;
 3      12    18&lt;br /&gt;
  \    /      /&lt;br /&gt;
   4  7      16&lt;br /&gt;
       \      \&lt;br /&gt;
        9      17&lt;br /&gt;
       /&lt;br /&gt;
      8&lt;br /&gt;
&lt;br /&gt;
       6&lt;br /&gt;
    /     \&lt;br /&gt;
   5       15&lt;br /&gt;
  /      /    \&lt;br /&gt;
 3      7     18&lt;br /&gt;
  \      \    /&lt;br /&gt;
   4     12  16&lt;br /&gt;
         /    \&lt;br /&gt;
        9      17&lt;br /&gt;
       /&lt;br /&gt;
      8&lt;br /&gt;
&lt;br /&gt;
     6&lt;br /&gt;
    / \&lt;br /&gt;
   5   12&lt;br /&gt;
  /   /  \&lt;br /&gt;
 3   7    15&lt;br /&gt;
  \   \     \&lt;br /&gt;
   4   9    18&lt;br /&gt;
      /     /&lt;br /&gt;
     8    16&lt;br /&gt;
            \&lt;br /&gt;
             17&lt;br /&gt;
&lt;br /&gt;
      6&lt;br /&gt;
    /   \&lt;br /&gt;
   5    12&lt;br /&gt;
  /    /  \&lt;br /&gt;
 3    7    18&lt;br /&gt;
  \    \   / &lt;br /&gt;
   4   9  15 &lt;br /&gt;
       /   \&lt;br /&gt;
      8    16&lt;br /&gt;
             \&lt;br /&gt;
             17&lt;br /&gt;
&lt;br /&gt;
     6&lt;br /&gt;
    / \&lt;br /&gt;
   5   12&lt;br /&gt;
  /   /  \&lt;br /&gt;
 3   7    18&lt;br /&gt;
  \   \   /&lt;br /&gt;
   4   9 16&lt;br /&gt;
      / /  \&lt;br /&gt;
     8 15  17&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je krug K, sa centrom u tački C, poluprečnika r. Data je duž D čije je teme T1 unutar K, a teme T2 izvan K. Koristeći metodu binarne pretrage kao ideju, napisati u pseudokodu funkciju koja približno određuje tačku preseka K i D. Preciznost aproksimacije kontrolisati posebnim parametrom funkcije.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Koristi se modifikovana binarna pretraga koja se izvršava dok se tačka ne nađe na kružnici ili dok je greška manja od &amp;lt;code&amp;gt;err&amp;lt;/code&amp;gt;. Parametar &amp;lt;code&amp;gt;err&amp;lt;/code&amp;gt; je prosleđen funkciji.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
INTERSECT(K, D, err)&lt;br /&gt;
low = T1&lt;br /&gt;
high = T2&lt;br /&gt;
prev = low&lt;br /&gt;
while true do&lt;br /&gt;
    x(mid) = (x(low) + x(high)) / 2&lt;br /&gt;
    y(mid) = (y(low) + y(high)) / 2&lt;br /&gt;
    dist = distance(C, mid)&lt;br /&gt;
    if (dist = r) or (distance(mid, prev) &amp;lt; err) then&lt;br /&gt;
        return mid&lt;br /&gt;
    else if dist &amp;gt; r then&lt;br /&gt;
        high = mid&lt;br /&gt;
    else&lt;br /&gt;
        low = mid&lt;br /&gt;
    end_if&lt;br /&gt;
    prev = mid&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DISTANCE(A, B)&lt;br /&gt;
return sqrt(pow(x(A) - x(B), 2) + pow(y(A) - y(B), 2))&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Stabla binarnog pretraživanja&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Na koji način se u stablo binarnog pretraživanja može dozvoliti umetanje ključeva sa istom vrednošću?&lt;br /&gt;
# Napisati u pseudokodu iterativnu implementaciju funkcije koja umeće vrednost &#039;&#039;x&#039;&#039; u stablo binarnog pretraživanja na koje pokazuje pokazivač &#039;&#039;root&#039;&#039;. U stablo je dozvoljeno umetati ključeve sa istom vrednošću.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Postoje dva načina na koje se može dozvoliti umetanje ključeva sa istom vrednošću u binarno stablo pretraživanja:&lt;br /&gt;
# U svakom čvoru stabla se čuva niz čvorova koje imaju istu vrednost ključa - ovim se postiže da se struktura stabla ne povećava.&lt;br /&gt;
# Čvorovi sa istom vrednošću se tretiraju kao veći, odnosno čuvaju u desnom podstablu - ovim se postiže veća pogodnost kod korišćenja za realizaciju struktura poput prioritetnog reda.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
BST INSERT MOD(root, x)&lt;br /&gt;
node = GETNODE&lt;br /&gt;
value(node) = x&lt;br /&gt;
if root = nil then&lt;br /&gt;
    root = node&lt;br /&gt;
    return&lt;br /&gt;
end_if&lt;br /&gt;
p = root&lt;br /&gt;
while true do&lt;br /&gt;
    if key(p) ≤ x then&lt;br /&gt;
        if right(p) = nil then&lt;br /&gt;
            right(p) = node&lt;br /&gt;
            break&lt;br /&gt;
        else&lt;br /&gt;
            p = right(p)&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        if left(p) = nil then&lt;br /&gt;
            left(p) = node&lt;br /&gt;
            break&lt;br /&gt;
        else&lt;br /&gt;
            p = left(p)&lt;br /&gt;
        end_if&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Crveno-crna stabla&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Definisati pojam crne visine (eng. &#039;&#039;black height&#039;&#039;) nekog čvora crveno-crnog stabla.&lt;br /&gt;
# Napisati u pseudokodu funkciju koja u zadatom crveno-crnom stablu određuje crnu visinu zadatog čvora X.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Crna visina nekog čvora je broj crnih čvorova na putu od tog čvora do listova, i po definiciji crveno-crnog stabla je jednaka za sve puteve do listova.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
BH CALC(x)&lt;br /&gt;
p = x&lt;br /&gt;
bh = 0&lt;br /&gt;
while p ≠ nil do&lt;br /&gt;
    if (black(p)) then &lt;br /&gt;
        bh = bh + 1&lt;br /&gt;
    end_if&lt;br /&gt;
    p = left(p)&lt;br /&gt;
end_while&lt;br /&gt;
return bh&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se u prazno AVL stablo redom umeću ključevi 35, 75, 51, 61, 65, 80, 44, 48, 39, 77, a zatim brišu ključevi 65, 44, 80. Prilikom brisanja, koristiti sledbenika. Prikazati izgled stabla nakon svakog izvršenog umetanja i brisanja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Postupak umetanja možete simulirati u nekom od [https://www.cs.usfca.edu/~galles/visualization/AVLtree.html simulatora] za AVL stabla. Nakon umetanja dobije se sledeće stablo:&lt;br /&gt;
          65&lt;br /&gt;
      /        \&lt;br /&gt;
     44         77&lt;br /&gt;
   /    \      /  \&lt;br /&gt;
 35      51   75  80&lt;br /&gt;
   \    /  \&lt;br /&gt;
    39 48  61&lt;br /&gt;
Po brisanju čvora 65, njegov sledbenik čvor 75 dolazi na njegovo mesto:&lt;br /&gt;
         75&lt;br /&gt;
      /      \&lt;br /&gt;
     44       77&lt;br /&gt;
   /    \       \&lt;br /&gt;
 35      51     80&lt;br /&gt;
   \    /  \&lt;br /&gt;
    39 48  61&lt;br /&gt;
Zatim se briše čvor 44 i njegov sledbenik čvor 48 dolazi na njegovo mesto:&lt;br /&gt;
         75&lt;br /&gt;
      /      \&lt;br /&gt;
     48       77&lt;br /&gt;
   /    \       \&lt;br /&gt;
 35      51     80&lt;br /&gt;
   \       \&lt;br /&gt;
    39     61&lt;br /&gt;
Na kraju, briše se čvor 80 čime čvor 75 postaje kritičan čvor pa radimo rotaciju ulevo oko njega:&lt;br /&gt;
     48&lt;br /&gt;
   /    \&lt;br /&gt;
 35      75&lt;br /&gt;
   \    /  \&lt;br /&gt;
    39 51  77&lt;br /&gt;
        \&lt;br /&gt;
         61&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[Датотека:ASP2 K1 2015 zadatak 6 stablo.svg|thumb|Crveno-crno stablo iz postavke zadatka.]]&lt;br /&gt;
U crveno-crno stablo sa slike se najpre vrši umetanje ključa 50, a zatim vrši brisanje ključa 13. Prikazati izgled stabla nakon svake od navedenih promena.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dati pseudokod i objasniti algoritam određivanja prethodnika čvora sa zadatom adresom &#039;&#039;x&#039;&#039; u stablu binarnog pretraživanja. &#039;&#039;&#039;Napomena:&#039;&#039;&#039; Prilikom kretanja uz stablo ne koristiti proveru na pripadnost podstablu, već na vrednosti ključeva.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Prvo proveravamo da li čvor ima levo podstablo. Ukoliko ima, vraćamo najdesniji čvor u levom podstablu kao prethodnika čvora. Ukoliko nema, penjemo se uz stablo poredeći ključ čvora &#039;&#039;x&#039;&#039; sa ključevima njegovih roditelja i ako nađemo čvor sa manjim ključem vratimo ga.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PRED NODE(x)&lt;br /&gt;
if left(x) = nil then&lt;br /&gt;
    p = parent(x)&lt;br /&gt;
    while p ≠ nil do&lt;br /&gt;
        if key(p) &amp;lt; key(x) then&lt;br /&gt;
            return p&lt;br /&gt;
        end_if&lt;br /&gt;
        p = parent(p)&lt;br /&gt;
    end_while&lt;br /&gt;
    return nil&lt;br /&gt;
else&lt;br /&gt;
    p = left(x)&lt;br /&gt;
    while right(p) ≠ nil do&lt;br /&gt;
        p = right(p)&lt;br /&gt;
    end_while&lt;br /&gt;
    return p&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
a) Objasniti jednu strategiju za dobijanje suboptimalnog stabla binarnog pretraživanja koja uključuje i uspešna i neuspešna pretraživanja. b) Postupak ilustrovati po koracima ako su dati ključevi &amp;lt;math&amp;gt;K_i, i = 1..6&amp;lt;/math&amp;gt;, sa verovatnoćama uspešnog pretraživanja &amp;lt;math&amp;gt;p_i, i = 1..6&amp;lt;/math&amp;gt;, (0.1, 0.05, 0.05, 0.1, 0.05, 0.1, respektivno) i verovatnoćama neuspešnog pretraživanja &amp;lt;math&amp;gt;q_i, i = 0..6&amp;lt;/math&amp;gt; (0.2, 0.05, 0.05, 0.0, 0.0, 0.05, 0.2, respektivno).&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Možemo formirati suboptimalno binarno stablo pretraživanja odabiranjem korena sa najmanjom razlikom težina između podstabala i rekurzivno ponavljati proces za oba podstabla.&lt;br /&gt;
#&lt;br /&gt;
## Kandidati za koren su nam K3 i K4. K3 nam daje razliku -0.05 između težina podstabla, a K4 0.1, pa zato biramo K3 i proces nastavljamo za [1, 2] i [4, 5, 6].&lt;br /&gt;
## Sa K1 u korenu razlika između levog i desnog podstabla od levog suboptimalnog podstabla je -0.05 a sa K2 je 0.3, tako da postavljamo K1 kao koren levog podstabla.&lt;br /&gt;
## Sa K6 u korenu razlika između levog i desnog podstabla od desnog suboptimalnog podstabla je 0, sa K5 -0.25 a sa K4 -0.4, tako da postavljamo K6 kao koren desnog podstabla.&lt;br /&gt;
## Na kraju, sa K5 kao korenom levog podstabla od desnog podstabla dobijamo da je razlika težina 0.05, a sa K4 -0.1, tako da K5 postavljamo za koren levog podstabla od desnog podstabla.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
     3&lt;br /&gt;
  /     \&lt;br /&gt;
 1       6&lt;br /&gt;
  \     /&lt;br /&gt;
   2   5&lt;br /&gt;
      /&lt;br /&gt;
     4&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП2]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2014&amp;diff=7800</id>
		<title>АСП2/К1 2014</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2014&amp;diff=7800"/>
		<updated>2024-09-13T00:09:06Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/SI2AS2_K1_1415.pdf Zadaci na stranici predmeta.]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prvi kolokvijum 2014. godine&#039;&#039;&#039; održan je 28. oktobra 2014. &lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(5p)&#039;&#039;&#039; Neka je dat uređeni niz M i sekvenca ključeva 15, 8, 33, 21, 25 na koje se vrši pretraga. Predložiti neophodne strukture podataka i prikazati njihov sadržaj nakon simultane pretrage zadatog niza na više ključeva.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Uređeni niz M&lt;br /&gt;
! 1&lt;br /&gt;
! 2&lt;br /&gt;
! 3&lt;br /&gt;
! 4&lt;br /&gt;
! 5&lt;br /&gt;
! 6&lt;br /&gt;
! 7&lt;br /&gt;
! 8&lt;br /&gt;
! 9&lt;br /&gt;
! 10&lt;br /&gt;
! 11&lt;br /&gt;
! 12&lt;br /&gt;
! 13&lt;br /&gt;
! 14&lt;br /&gt;
! 15&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 3&lt;br /&gt;
| 7&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 15&lt;br /&gt;
| 17&lt;br /&gt;
| 20&lt;br /&gt;
| 25&lt;br /&gt;
| 28&lt;br /&gt;
| 29&lt;br /&gt;
| 31&lt;br /&gt;
| 33&lt;br /&gt;
| 36&lt;br /&gt;
| 40&lt;br /&gt;
|}&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Neophodan je dodatni vektor za elemente koji su već nađeni i njihove indekse. Nakon simultane pretrage zadatog niza na više ključeva, vektor će ovako izgledati (primetimo da se brojevi 8 i 21 ne nalaze u nizu):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! 15&lt;br /&gt;
! 25&lt;br /&gt;
! 33&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 9&lt;br /&gt;
| 13&lt;br /&gt;
|}&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Za stablo binarnog pretraživanja sa slike odrediti prosečan broj pristupa prilikom uspešne pretrage i prilikom neuspešne pretrage, ako je poznato da je vrednost ključeva koji se mogu umetnuti u stablo u opsegu od 1 do 30. Smatrati da su svi ključevi jednako verovatni.&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 2.png|thumb|600px|center|Stablo iz postavke zadatka]]&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Iz nepoznatog razloga rešenje ovog zadatka je bilo dato u pdfu sa zadacima.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Prosečan broj pristupa prilikom uspešne pretrage:&lt;br /&gt;
! 36/11=3.28&lt;br /&gt;
|-&lt;br /&gt;
| Prosečan broj pristupa prilikom neuspešne pretrage:&lt;br /&gt;
| 62/19=3.26&lt;br /&gt;
|}&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; Prikazati po koracima izgled binarnog stabla pretraživanja sa slike, ukoliko izvrši&lt;br /&gt;
sledeća sekvenca operacija: umetanje ključeva 19 i 2, a zatim brisanje ključeva 15, 5 i 22.&lt;br /&gt;
Prilikom brisanja, koristiti &#039;&#039;&#039;sledbenika&#039;&#039;&#039;.&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 3.png|thumb|600px|center|Stablo iz postavke zadatka]]&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 3 korak 1.svg|thumb|600px|center|Stablo nakon umetanja ključeva 19 i 2]]&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 3 korak 2.svg|thumb|600px|center|Stablo nakon brisanja ključeva 15, 5 i 22]]&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(10p)&#039;&#039;&#039; U AVL stablo se redom umeću ključevi: 5, 3, 4, 6, 12, 9, 7, 16, 18. Prikazati, postupno, izgled stabla nakon svakog umetanja ključa.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 4 korak 1.png|thumb|600px|center|Stablo nakon umetanja ključeva 5 i 3]]&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 4 korak 2.png|thumb|600px|center|Stablo nakon umetanja ključa 4]]&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 4 korak 3.png|thumb|600px|center|Stablo nakon umetanja ključa 6]]&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 4 korak 4.png|thumb|600px|center|Stablo nakon umetanja ključa 12]]&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 4 korak 5.png|thumb|600px|center|Stablo nakon umetanja ključa 9]]&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 4 korak 6.png|thumb|600px|center|Stablo nakon umetanja ključa 7]]&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 4 korak 7.png|thumb|600px|center|Stablo nakon umetanja ključa 16]]&lt;br /&gt;
[[Датотека:ASP2 K1 2014 Zadatak 4 korak 8.png|thumb|600px|center|Konačni izgled stabla]]&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(15p)&#039;&#039;&#039; Napisati u pseudokodu operaciju &#039;&#039;&#039;dvostruke rotacije ulevo&#039;&#039;&#039;. Nacrtati &#039;&#039;&#039;opštu&#039;&#039;&#039; sliku koja objašnjava napisani pseudokod i na kojem su čvorovi obeleženi odgovarajućim identifikatorima upotrebljenim u pseudokodu.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U ovom zadatku je iskorišćeno rešenje iz knjige, tj ono što je u knjizi nazvano dvostrukom rotacijom (dve rotacije suprotnog smera, prvo leva oko levog sina kritičnog čvora a zatim desna oko kritičnog čvora). Dve rotacije ulevo oko kritičnog čvora &#039;&#039;&#039;nemaju smisla&#039;&#039;&#039;.&amp;lt;ref&amp;gt;Na K1 2022 je bio isti ovaj zadatak i jedan student je uradio dve rotacije ulevo oko x, na šta je Mišić rekao da to nema smisla iako tako piše u zadatku.&amp;lt;/ref&amp;gt;&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
L-ROT(x)&lt;br /&gt;
y = x.right&lt;br /&gt;
temp = y.left&lt;br /&gt;
y.left = x&lt;br /&gt;
x.right = temp&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
R-ROT(x)&lt;br /&gt;
y = x.left&lt;br /&gt;
temp = y.right&lt;br /&gt;
y.right = x&lt;br /&gt;
x.left = temp&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
L-DOUBLE-ROT(x)&lt;br /&gt;
L-ROT(x.left)&lt;br /&gt;
R-ROT(x)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(15p)&#039;&#039;&#039; Napisati u pseudokodu i kratko objasniti iterativnu implementaciju algoritma za binarno pretraživanje na ključ k, ukoliko je veličina tabele nepoznata. Smatrati da postoji funkcija IN(index) koja vraća vrednost true ukoliko zadati indeks pripada tabeli, a false u suprotnom.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U ovom zadatku se koristi algoritam za &#039;&#039;&#039;Binarno pretraživanje u tabeli nepoznate veličine&#039;&#039;&#039; iz knjige.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
EX-SEARCH(L, key)&lt;br /&gt;
high=low=1;&lt;br /&gt;
if(IN(high)=false) return -1;&lt;br /&gt;
if(key = L[1]) return 1;&lt;br /&gt;
while(IN(high)=true &amp;amp;&amp;amp; key&amp;gt;L[high]) high *= 2;&lt;br /&gt;
low = high/2;&lt;br /&gt;
while(low&amp;lt;=high)&lt;br /&gt;
    mid = (low+high)/2;&lt;br /&gt;
    if(key=L[mid]) return mid;&lt;br /&gt;
    if(key&amp;lt;L[mid]) high = mid-1;&lt;br /&gt;
    else low = mid+1;&lt;br /&gt;
end_while&lt;br /&gt;
return -1;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(15p)&#039;&#039;&#039; Objasniti šta je samopodešavajuće stablo, kao i motivaciju za ovu strukturu. Ukratko načelno opisati operacije pretraživanja, umetanja i brisanja. Koji algoritam pretraživanja nizova koristi sličnu strategiju?&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Samopodešavajuća stabla su stabla koja održavaju balansiranost bez nekog eksplicitnog kriterijuma pri umetanju i brisanju. Umesto toga, reorganizacija stabla se vrši pri svakom pristupu stablu, pa i pretraživanju. Pritom se ključevi kojima se češće pristupa postavljaju bliže korenu, tako da im se omogući brži pristup pri narednim obraćanjima. Za ovo se koriste operacije koje se zasnivaju na rotacijama. Motivacija je optimizacija zasnovana na vremenskoj lokalnosti, slično kao kod transpozicije i prebacivanja na početak kod sekvencijalne pretrage. Pretraživanje se vrši tako što nađeni ili poslednji ne-null ključ nizom rotacija prebacujemo u koren. Umetanje se vrši tako što prvo uradimo pretraživanje na zadati ključ, a ako on ne postoji, umetnemo ga na odgovarajuće mesto. Brisanje se vrši tako što  se prvo vrši pretraživanje na zadati ključ, pa ako se on pronađe, prebacuje se u koren, koji se potom briše i menja prethodnikom.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(20p)&#039;&#039;&#039; Odgovoriti na sledeća pitanja u vezi optimalnog stabla binarnog pretraživanja. &#039;&#039;&#039;Napomena:&#039;&#039;&#039; Svaki korišćeni simbol treba definisati i objasniti.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Precizno definisati optimalno stablo binarnog pretraživanja za ključeve sa vrednostima Kn &amp;lt; Kn+1 &amp;lt; ... &amp;lt; Km. &lt;br /&gt;
# Ako je ključ Kr koren ovog stabla, nacrtati opštu sliku.&lt;br /&gt;
# Izraziti cenu stabla preko cena njegovih podstabala.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Optimalno stablo binarnog pretraživanja je ono stablo čija je cena najmanja, gde cenu definišemo kao: &amp;lt;math&amp;gt;C = \sum_{i}^{m-n} p_{i}(h_{i} + 1) + \sum_{i}^{m-n} q_{i}h_{i}&amp;lt;/math&amp;gt;, gde su Pi verovatnoće pristupa ključevima Kn...Km, a Qi verovatnoće pristupa eksternim čvorovima. &lt;br /&gt;
# [[Датотека:ASP2 K1 2014 Zadatak 8.png|thumb|600px|center|Opšta slika optimalnog stabla binarnog pretraživanja]]&lt;br /&gt;
# &amp;lt;math&amp;gt;C_{ij} = min\left \{ C_{i-1k-1} + C_{kj} \right \} + w_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;w_{ij} = q_{i} + p_{i+1} + q_{i+1} + ... + p_{j} + q_{j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;i&amp;lt; k\leq j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== Napomene ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП2]]&amp;lt;!-- Zameniti sa nazivom predmeta --&amp;gt;&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2011&amp;diff=7799</id>
		<title>АСП2/К1 2011</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2011&amp;diff=7799"/>
		<updated>2024-09-13T00:09:06Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Prvi kolokvijum 2011. godine&#039;&#039;&#039; održan je 24. oktobra 2011. Postavka zadataka je dostupna sa [https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/arhiva/SI2AS2_K1_1112.pdf stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(30p)&#039;&#039;&#039; Koristeći algoritam binarne pretrage uređenog vektora kao osnovu, napisati na jeziku C (ili C++) funkciju za pretragu uređenog vektora jedinstvenih celobrojnih ključeva dužine n na zadati ključ deljenjem intervala pretrage na tri podintervala približno jednake dužine. Napisati glavni program koji demonstrira upotrebu prethodne funkcije. Koristiti fiksne podatke (nije potrebno čitati podatke iz datoteke ili standardnog ulaza). Komentarisati vremensku i prostornu složenost napisane funkcije. Porediti vremensku složenost napisane funkcije i algoritma binarne pretrage. &lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Vremenska složenost je &amp;lt;math&amp;gt;O(log_3{n})&amp;lt;/math&amp;gt;, a prostorna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FUN(arr,key)&lt;br /&gt;
high = n;&lt;br /&gt;
low = 1;&lt;br /&gt;
while(low &amp;lt;= high)&lt;br /&gt;
    left = (low+high)/3;&lt;br /&gt;
    right = 2(low+high)/3;&lt;br /&gt;
    if(arr[left]=key) return left;&lt;br /&gt;
    if(arr[right]=key) return right;&lt;br /&gt;
    if(key &amp;lt; arr[left]) high = left-1;&lt;br /&gt;
    if(key &amp;gt; arr[right]) low = right+1;&lt;br /&gt;
    if(key&amp;gt;arr[left] and key&amp;lt;arr[right])&lt;br /&gt;
        low = left+1;&lt;br /&gt;
        high = right-1;&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
return 0;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(20p)&#039;&#039;&#039; U stablo binarnog pretraživanja se redom umeću sledeći ključevi: 22, 31, 24, 28, 26, 41, 45, 10, 6, 8, 9, 7, 4, 5, 2. Nakon umetanja se redom brišu ključevi: 41, 6, 22, 10. Prikazati izgled stabla pretraživanja nakon svake od navedenih izmena. Ako dobijeno stablo ne zadovoljava kriterijum balansiranosti AVL stabla, transformisati stablo primenom osnovnih transformacija za održavanje balansiranosti da bi se dobilo AVL stablo. Prikazati izgled stabla nakon primene svake transformacije. Napomena: prilikom brisanja ključeva, koristiti sledbenike. &lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:ASP K1 2011 Zadatak 2.svg|thumb|600px|center|Stablo nakon umetanja ključeva 22,31,24,28,26 i 41]]&lt;br /&gt;
[[Датотека:ASP K1 2011 Zadatak 2 korak 2.svg|thumb|600px|center|Stablo nakon umetanja ključeva 45,10,6 i 8]]&lt;br /&gt;
[[Датотека:ASP K1 2011 Zadatak 2 korak 3.svg|thumb|600px|center|Stablo nakon umetanja ključeva 9 i 7]]&lt;br /&gt;
[[Датотека:ASP K1 2011 Zadatak 2 korak 4.svg|thumb|600px|center|Stablo nakon umetanja ključeva 4 i 5]]&lt;br /&gt;
[[Датотека:ASP K1 2011 Zadatak 2 korak 5.svg|thumb|600px|center|Stablo nakon svih umetanja]]&lt;br /&gt;
[[Датотека:ASP K1 2011 Zadatak 2 korak 6.svg|thumb|600px|center|Stablo nakon brisanja ključeva 41,6 i 22]]&lt;br /&gt;
[[Датотека:ASP K1 2011 Zadatak 2 korak 7.svg|thumb|600px|center|Stablo nakon svih brisanja]]&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(20p)&#039;&#039;&#039; Definisati AVL stablo i kritični čvor. Kada se javlja potreba za dvostrukom rotacijom? Objasniti ovu operaciju i ilustrovati opštim slikama.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
AVL stablo je stablo binarnog pretraživanja koje ispunjava kriterijum da svaki čvor mora da ima balans 0, 1 ili -1, gde balans predstavlja razliku visina levog i desnog podstabla. &lt;br /&gt;
&lt;br /&gt;
Kritični čvor je koren najmanjeg podstabla koje nije visinski balansirano. &lt;br /&gt;
&lt;br /&gt;
Dvostruka rotacija se vrši kada kritični čvor i sin sa one strane na koju naginje kritični čvor naginju na suprotne strane (npr kritični čvor na desno a njegov levi sin na levo). Prvo se vrši odgovarajuća rotacija nad sinom tako da kritični čvor i sin naginju na istu stranu, a zatim se vrši rotacija u suprotnu stranu nad kritičnim čvorom, čime se dobija visinski balansirano stablo.&lt;br /&gt;
&lt;br /&gt;
[[Датотека:ASP K1 2011 Zadatak 3.svg|thumb|300px|center|Početno stanje]]&lt;br /&gt;
[[Датотека:ASP K1 2011 Zadatak 3 korak 2.svg|thumb|300px|center|Stablo nakon prve rotacije udesno oko sina]]&lt;br /&gt;
[[Датотека:ASP K1 2011 Zadatak 3 korak 3.svg|thumb|300px|center|Stablo nakon rotacije ulevo oko kritičnog čvora]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
{{делимично решено}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(30p)&#039;&#039;&#039; Pitanja:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dati pseudokod i objasniti sekvencijalno pretraživanje sa graničnikom. Kakvo poboljšanje ono donosi?&lt;br /&gt;
# Objasniti organizaciju 2-3-4 stabla. Kakva je njihova prednost i kako se implementiraju?&amp;lt;ref&amp;gt;Ovo više nije gradivo K1&amp;lt;/ref&amp;gt;&lt;br /&gt;
# Objasniti strategiju dobijanja približno optimalnog stabla koja uzima u obzir i uspešna i neuspešna pretraživanja. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
c) Približno optimalno stablo se formira od korena na dole i bira se tako da se minimizira težina levog i desnog podstabla, a zatim se u blizini korena traži mogući novi koren sa većom verovatnoćom pristupa, i ako se takav čvor pronađe, pređašnji čvor se pomera malo ulevo ili udesno. Postupak se ponavlja rekurzivno.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Napomene ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП2]]&amp;lt;!-- Zameniti sa nazivom predmeta --&amp;gt;&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2009&amp;diff=7798</id>
		<title>АСП2/К1 2009</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F2/%D0%9A1_2009&amp;diff=7798"/>
		<updated>2024-09-13T00:09:05Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
&#039;&#039;&#039;Prvi kolokvijum 2009. godine&#039;&#039;&#039; održan je 29. oktobra 2009. Postavka zadataka je dostupna sa [https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/arhiva/SI2AS2_K1_0910.pdf stranice predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(20p)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Objasniti strategiju binarnog pretraživanja. Koji su preduslovi primene binarne pretrage? Koje uslove mora da zadovolji struktura podataka nad kojom se primenjuje binarno pretraživanje da bi primena bila efikasna?  &lt;br /&gt;
# Nad tabelom u koju su umetnuti ključevi 2, 18, 33, 14, 25, 5, 7, 12, 11, 16, 20, 22, 26 se vrši pretraga na ključeve 14, 7 i 18 primenom strategije binarnog pretraživanja. Odrediti prosečan broj poređenja vrednosti ključeva.&lt;br /&gt;
# Napisati na jeziku C (ili C++) funkciju koja u zadatom nizu celih brojeva zadate dužine traži zadati celobrojni ključ. Funkcija vraća indeks pod kojim je ključ nađen u nizu ili -1 u slučaju neuspešne pretrage.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Strategija binarnog pretraživanja se zasniva na nalaženju medijane, a zatim polovljenju intervala pretraživanja. Postupak se ponavla sve dok se ne nađe traženi ključ ili se zaključi da se on ne nalazi u nizu. Preduslovi su da je niz uređen i da je moguć linearan pristup. Struktura mora biti linearna. &lt;br /&gt;
# Pri pretrazi na ključ 14 vrše se 4 poređenja, kao i pri pretrazi na ključ 18. Pri pretrazi na ključ 7 vrše se 2 poređenja, što nam u proseku daje &amp;lt;math&amp;gt;\frac{10}{3} = 3.33&amp;lt;/math&amp;gt; poređenja.&lt;br /&gt;
# {{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
BIN(arr, key, n)&lt;br /&gt;
high = n;&lt;br /&gt;
low = 1;&lt;br /&gt;
while(high&amp;gt;=low)&lt;br /&gt;
    mid = (low+high)/2;&lt;br /&gt;
    if(arr[mid]=key) return mid;&lt;br /&gt;
    if(arr[mid]&amp;lt;key) low = mid+1;&lt;br /&gt;
    else high = mid-1;&lt;br /&gt;
end_while&lt;br /&gt;
return -1;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(30p)&#039;&#039;&#039; U AVL stablo prikazano na slici se redom umeću sledeći ključevi: 20, 21, 19, 7, 10, 12, 14. Nakon umetanja se redom brišu ključevi: 22, 15, 18. Prikazati izgled stabla nakon svake od navedenih izmena. Izračunati prosečan broj pristupa stablu prilikom uspešne pretrage nakon svih umetanja i u konačnom stanju. &#039;&#039;&#039;Napomena&#039;&#039;&#039;: prilikom brisanja ključeva, koristiti sledbenike. &lt;br /&gt;
[[Датотека:ASP2 K1 2009 Zadatak 2.png|thumb|600px|center|Stablo iz postavke zadatka]]&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[Датотека:ASP2 K1 2009 Zadatak 2 umetanje.svg|thumb|600px|center|Stablo nakon svih umetanja]]&lt;br /&gt;
[[Датотека:ASP2 K1 2009 Zadatak 2 brisanje.svg|thumb|600px|center|Stablo nakon svih brisanja]]&lt;br /&gt;
Nakon svih umetanja: &amp;lt;math&amp;gt;PI = \sum R_{i} \cdot n_{i} = 3\cdot5 + 4\cdot4 + 4\cdot3 + 5 = 15+16+12+5=48&amp;lt;/math&amp;gt;, pa je &amp;lt;math&amp;gt;S_{n} = \frac{48}{14} = 3.43&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nakon svih brisanja: &amp;lt;math&amp;gt;PI = \sum R_{i} \cdot n_{i} = 33&amp;lt;/math&amp;gt;, pa je &amp;lt;math&amp;gt;S_{n} = \frac{33}{11} = 3&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(20p)&#039;&#039;&#039; Dati pseudokod i objasniti algoritam za istovremeno sekvencijalno pretraživanje uređenog niza na više ključeva. Kolika je složenost algoritma? &lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretraživanje ide od početka niza K sa prvim ključem iz S dok se ne pronađe (i njegova pozicija zapamti u P) ili do prve veće vrednosti. Pretraživanje na sledeći ključ iz S počinje tamo gde se sa pretraživanjem na prethodni ključ stalo, pa se zato niz K prolazi samo jednom. Niz K je rastuće uređeni niz sa n ključeva koji se pretražuje na pojavu m ključeva zadatih u nizu S. Izlaz predstavlja vektor P gde se na poziciji koja odgovara ključu u nizu S nalazi pozicija ključa u nizu K, ako se on tamo pronađe, ili vrednost 0 ako se ne pronađe. Složenost ovog algoritma je O(n) za slučaj kada je m &amp;lt;&amp;lt; n.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SEQ-SEARCH-MUL(K,S)&lt;br /&gt;
for(int i=0;i&amp;lt;m;i++) P[i] = 0;&lt;br /&gt;
i=j=1;&lt;br /&gt;
while(i&amp;lt;=n) and (j&amp;lt;=m)&lt;br /&gt;
    while(i&amp;lt;n) and (S[j] &amp;gt; K[i]) i++;&lt;br /&gt;
    if(S[j] = K[i]) P[j] = i;&lt;br /&gt;
    j++;&lt;br /&gt;
end_while&lt;br /&gt;
return P;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;(30p)&#039;&#039;&#039; Pitanja:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Kolike su performanse pretraživanja u stablu binarnog pretraživanja u najboljem, srednjem i najgorem slučaju i diskutovati implikacije.  &lt;br /&gt;
# Definisati Fibonacci-jeva stabla i navesti njihove glavne osobine.&lt;br /&gt;
# Zašto se uvode 2-3 stabla? Objasniti njihovu organizaciju i glavne osobine.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Složenost je u funkciji visine - O(h). U najboljem slučaju h = log(n), a u najgorem h = n.  &lt;br /&gt;
# Fibonačijevo stablo je najgori slučaj AVL stabla, tj. stablo najveće visine za određen broj čvorova. Broj čvorova u Fibonačijevom stablu visine h je &amp;lt;math&amp;gt;n_{h} = n_{h-1} + n_{h-2} + 1&amp;lt;/math&amp;gt;. Svi čvorovi imaju balans 1. Brisanje bilo kog čvora smanjuje visinu stabla. Svaki koren će biti Fibonačijev broj.&lt;br /&gt;
# 2-3 stabla se uvode da bi se osigurala balansiranost, pa su sve operacije O(log(n)). Glavno svojstvo je postojanje 3-čvorova, koji imaju levo, desno i srednje podstablo, i time se omogućava da svi listovi budu na istom nivou. 3-čvorovi imaju dva ključa, K1 i K2 i u zavisnosti od intervala pripadanja određujemo podstablo.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП2]]&amp;lt;!-- Zameniti sa nazivom predmeta --&amp;gt;&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A3_2019&amp;diff=7797</id>
		<title>АСП1/К3 2019</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A3_2019&amp;diff=7797"/>
		<updated>2024-09-13T00:09:05Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_K3_1819.pdf Zadaci]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[{{ns:6}}:ASP1 K3 2019 zadatak 1 graf.png|thumb|Graf iz zadatka 1.]]&lt;br /&gt;
Na slici je prikazan netežinski usmereni graf.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# 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.&lt;br /&gt;
# 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.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# ABICDMFLK&lt;br /&gt;
# AIBCMLKDF&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Mogao bi se primeniti Primov ili Kruškalov algoritam za dobijanje minimlanog obuhvatnog stabla. U narednom postupku biće korišćen Primov algoritam:&lt;br /&gt;
# A-E&lt;br /&gt;
# E-F&lt;br /&gt;
# E-D&lt;br /&gt;
# D-C&lt;br /&gt;
# C-H&lt;br /&gt;
# H-I&lt;br /&gt;
# C-B&lt;br /&gt;
# H-G&lt;br /&gt;
# G-I&lt;br /&gt;
Grafovi se nalaze ispod.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
  ASP1 K3 2019 zadatak 2 graf.svg | Pojednostavljen graf iz postavke zadatka.&lt;br /&gt;
  ASP1 K3 2019 zadatak 2 MST.svg  | Minimalno obuhvatno stablo.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Opisati model grafa koji se može iskoristiti za modelovanje zavisnosti po podacima između instrukcija.&lt;br /&gt;
# Objasniti koji algoritam bi se mogao iskoristiti za pronalaženje svih mogućih redosleda izvršavanja instrukcija na osnovu zadatog grafa zavisnosti po podacima.&lt;br /&gt;
# 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.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
 ADD A, B, C&lt;br /&gt;
 MUL C, E, D&lt;br /&gt;
 SUB B, E, C&lt;br /&gt;
 ADD A, D, E&lt;br /&gt;
 SUB E, F, G&lt;br /&gt;
 DIV D, F, H&lt;br /&gt;
 ADD G, F, H&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# 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.&lt;br /&gt;
# 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).&lt;br /&gt;
# Graf se sastoji od svih čvorova odvojenih i jedne grane između čvorova &amp;lt;code&amp;gt;MUL C, E, D&amp;lt;/code&amp;gt; i &amp;lt;code&amp;gt;SUB B, E, C&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* &amp;lt;code&amp;gt;ADD A, B, C&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;ADD A, D, E&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;MUL C, E, D&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;SUB B, E, C&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;SUB E, F, G&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;DIV D, F, H&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;lt;code&amp;gt;ADD G, F, H&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
TOP SORT ALL PATHS R(G)&lt;br /&gt;
if V = {} then&lt;br /&gt;
    return nil&lt;br /&gt;
end_if&lt;br /&gt;
return_paths = {}&lt;br /&gt;
for {n : (n ∈ V) and ((u, n) ∉ E)} do&lt;br /&gt;
    MARK_REMOVED(G, n)&lt;br /&gt;
    paths = TOP_SORT_ALL_PATHS_R(G)&lt;br /&gt;
    for path ∈ paths do&lt;br /&gt;
        new_path = GETNODE&lt;br /&gt;
        value(new_path) = n&lt;br /&gt;
        next(new_path) = path&lt;br /&gt;
        path = new_path&lt;br /&gt;
    end_for&lt;br /&gt;
    UNMARK_REMOVED(G, n)&lt;br /&gt;
    return_paths = return_paths + paths&lt;br /&gt;
end_for&lt;br /&gt;
return return_paths&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se usmeren netežinski graf. Napisati iterativnu funkciju u pseudokodu koja za prosleđeni graf sa datim brojem čvorova &#039;&#039;n&#039;&#039; pronalazi sve čvorove koji su putevima dužine tačno &#039;&#039;k&#039;&#039; udaljeni od zadatog početnog čvora &#039;&#039;id&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Implementacija ispod čvorove vraća u ulančanoj listi.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
K-DISTANCE(G, n, k, id)&lt;br /&gt;
dist[n]&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    dist[i] = ∞&lt;br /&gt;
end_for&lt;br /&gt;
dist[id] = 0&lt;br /&gt;
curr_dist = 0&lt;br /&gt;
tail = head = GETNODE(id)&lt;br /&gt;
next(head) = GETNODE(0)&lt;br /&gt;
head = next(head)&lt;br /&gt;
curr = 0&lt;br /&gt;
temp = nil&lt;br /&gt;
while (tail ≠ nil) and (curr_dist ≠ k) do&lt;br /&gt;
    curr = value(tail)&lt;br /&gt;
    if curr = 0 then&lt;br /&gt;
        curr_dist = curr_dist + 1&lt;br /&gt;
        if head ≠ tail then&lt;br /&gt;
            next(head) = GETNODE(0)&lt;br /&gt;
            head = next(head)&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        for node ∈ {v : (curr, v) ∈ E} do&lt;br /&gt;
            if dist[node] ≠ curr_dist + 1 then&lt;br /&gt;
                dist[node] = curr_dist + 1&lt;br /&gt;
                next(head) = GETNODE(node)&lt;br /&gt;
                head = next(head)&lt;br /&gt;
            end_if&lt;br /&gt;
        end_for&lt;br /&gt;
    end_if&lt;br /&gt;
    temp = tail&lt;br /&gt;
    tail = next(tail)&lt;br /&gt;
    FREENODE(temp)&lt;br /&gt;
end_while&lt;br /&gt;
&lt;br /&gt;
return tail&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
GETNODE(node)&lt;br /&gt;
ALLOCATE(node)&lt;br /&gt;
next(node) = nil&lt;br /&gt;
value(node) = value&lt;br /&gt;
return node&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Floyd algoritam&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Na slici je dat izgled matrica D i T dobijenih kao izlaz Floyd algoritma. Nacrtati mogući izgled ulaznog grafa i obrazložiti odgovor.&lt;br /&gt;
# Napisati u pseudokodu funkciju koja na osnovu matrice T dobijene kao izlaz &#039;&#039;Floyd&#039;&#039;-ovog algoritma rekonstruiše najkraći put od čvora A do čvora C takav da se na njemu nalazi čvor B.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrica D&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
| 7&lt;br /&gt;
|-&lt;br /&gt;
| ∞&lt;br /&gt;
| 0&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| ∞&lt;br /&gt;
| ∞&lt;br /&gt;
| 0&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrica T&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[{{ns:6}}:ASP1 K3 2019 zadatak 5 graf.svg|thumb|Graf iz zadatka 5.]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# 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.&lt;br /&gt;
# U pseudokodu ispod podrazumeva se da je put predstavljen ulančanom listom. Ukoliko je vraćeno nil to znači da nema puta.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PATH(T, A, B, C)&lt;br /&gt;
curr = GETNODE(C)&lt;br /&gt;
next = nil&lt;br /&gt;
while value(curr) ≠ B do&lt;br /&gt;
    if T[B][value(curr)] = 0 then&lt;br /&gt;
        return nil&lt;br /&gt;
    end_if&lt;br /&gt;
    next = GETNODE(T[B][value(curr)])&lt;br /&gt;
    next(next) = curr&lt;br /&gt;
    curr = next&lt;br /&gt;
end_while&lt;br /&gt;
while value(curr) ≠ A do&lt;br /&gt;
    if T[A][value(curr)] = 0 then&lt;br /&gt;
        return nil&lt;br /&gt;
    end_if&lt;br /&gt;
    next = GETNODE(T[A][value(curr)])&lt;br /&gt;
    next(next) = curr&lt;br /&gt;
    curr = next&lt;br /&gt;
end_while&lt;br /&gt;
&lt;br /&gt;
return curr&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[{{ns:6}}:ASP1 K3 2019 zadatak 6 graf.png|thumb|Graf iz zadatka 6.]]&lt;br /&gt;
Za graf sa slike odrediti topološki poredak, a zatim naći kritični put i dozvoljena kašnjenja za pojedinačne čvorove.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Topološki poredak: &#039;&#039;&#039;ABDCFEHGIJK&#039;&#039;&#039;&lt;br /&gt;
* Kritični put: &#039;&#039;&#039;ABCEHGJK&#039;&#039;&#039; (ili &#039;&#039;&#039;ABCEHGIJK&#039;&#039;&#039;)&lt;br /&gt;
* Tabela:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| Čvor&lt;br /&gt;
| EST&lt;br /&gt;
| LST&lt;br /&gt;
| L&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| &amp;lt;strike&amp;gt;3&amp;lt;/strike&amp;gt; 10&lt;br /&gt;
| 10&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| D&lt;br /&gt;
| 3&lt;br /&gt;
| 6&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| E&lt;br /&gt;
| 15&lt;br /&gt;
| 15&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| F&lt;br /&gt;
| &amp;lt;strike&amp;gt;6&amp;lt;/strike&amp;gt; 11&lt;br /&gt;
| 13&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| G&lt;br /&gt;
| 19&lt;br /&gt;
| 19&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| H&lt;br /&gt;
| 16&lt;br /&gt;
| 16&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| I&lt;br /&gt;
| 21&lt;br /&gt;
| 21&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| J&lt;br /&gt;
| 22&lt;br /&gt;
| 22&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| K&lt;br /&gt;
| 24&lt;br /&gt;
| 24&lt;br /&gt;
| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Dva karakteristična načina za izbor puta povećanog protoka su:&lt;br /&gt;
# običan BFS koji će naći najkraći put od S do T, na primer SBT, i&lt;br /&gt;
# biranje puta koji najviše povećava protok, na primer SBAT.&lt;br /&gt;
Grafovi su dati ispod.&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
  ASP1 K3 2019 zadatak 7 graf.svg            | Graf iz postavke zadatka.&lt;br /&gt;
  ASP1 K3 2019 zadatak 7 rezidualni graf.svg | Rezidualni graf.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;Dijkstra&#039;&#039;-in algoritam&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Kolika je složenost &#039;&#039;Dijkstra&#039;&#039;-inog algoritma i od kojih operacija u okviru algoritma to zavisi? Objasniti.&lt;br /&gt;
# Napisati pseudokod &#039;&#039;Dijkstra&#039;&#039;-inog algoritma koji pronalazi najkraće rastojanje između para čvorova &#039;&#039;x&#039;&#039; i &#039;&#039;y&#039;&#039; pod pretpostavkom da se graf &#039;&#039;G&#039;&#039; predstavlja listama susednosti. Specijalizovati apstraktne operacije gde je to moguće.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
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 &amp;lt;math&amp;gt;\mathcal{O(n^2)}&amp;lt;/math&amp;gt; u slučaju da se pronalaženje sledećeg čvora do kojeg je put najkraći izvršava u &amp;lt;math&amp;gt;\mathcal{O(n)}&amp;lt;/math&amp;gt; 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 &amp;lt;math&amp;gt;\mathcal{O(\log{n})}&amp;lt;/math&amp;gt;, kada je složenost &amp;lt;math&amp;gt;\mathcal{O(e + n\log{n})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DIJKSTRA ADJ LIST(G, x, y)&lt;br /&gt;
S = {x}&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    d[i] = w[x, i]&lt;br /&gt;
    if d[i] = ∞ then&lt;br /&gt;
        t[i] = 0&lt;br /&gt;
    else&lt;br /&gt;
        t[i] = x&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
for k = 1 to n-1 do&lt;br /&gt;
    start_node = -1&lt;br /&gt;
    for i ∈ (V - S) do&lt;br /&gt;
        if (start_node = -1) or (d[i] &amp;lt; d[start_node]) then&lt;br /&gt;
            start_node = i&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    S = S + {start_node}&lt;br /&gt;
    adj_node = AL[start_node]&lt;br /&gt;
    while adj_node ≠ nil do&lt;br /&gt;
        if w[start_node, value(adj_node)] + d[start_node] &amp;lt; d[value(adj_node)] then&lt;br /&gt;
            d[value(adj_node)] = w[start_node, value(adj_node)] + d[start_node]&lt;br /&gt;
            t[value(adj_node)] = start_node&lt;br /&gt;
        end_if&lt;br /&gt;
        adj_node = next(adj_node)&lt;br /&gt;
    end_while&lt;br /&gt;
end_for&lt;br /&gt;
&lt;br /&gt;
return d[y]&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A3_2018&amp;diff=7796</id>
		<title>АСП1/К3 2018</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A3_2018&amp;diff=7796"/>
		<updated>2024-09-13T00:09:04Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_K3_1718.pdf Zadaci]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Diskutovati implementaciju algoritma za topološko sortiranje grafa u &#039;&#039;&#039;inverznom poretku&#039;&#039;&#039;, ukoliko se za memorijsku reprezentaciju grafa usvoje liste susednosti. Da li je za ovu operaciju pogodnije koristiti inverzne liste susednosti? Obrazložiti odgovor uz precizno navođenje razlika u implementaciji.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pošto se radi o topološkom sortiranju u inverznom poretku, to znači da se uvek traži naredni čvor koji nema izlaznih grana.&lt;br /&gt;
&lt;br /&gt;
U ovom slučaju je najpovoljnije koristiti inverzne liste susednosti. Na početku se prođe kroz sve grane i formira vektor koji za svaki čvor pamti broj sledbenika (kad god se naiđe na određeni čvor u granama inkrementira mu se broj sledbenika jer nailaskom na njega znamo da je on prethodnik čvora iz tog zaglavlja). U toku izvršavanja &amp;lt;code&amp;gt;TOP_SORT&amp;lt;/code&amp;gt; algoritma uvek se traži u vektoru čvor koji nema sledbenike, direktno mu se pristupa u nizu zaglavlja, i onda se samo uklone svi čvorovi iz njegove ulančane liste prethodnika. Nakon ovog postupka se ažurira uvek i vektor tako što se za svaki uklonjeni čvor dekrementira broj njegovih sledbenika. Na ovaj način &amp;lt;code&amp;gt;TOP_SORT&amp;lt;/code&amp;gt; algoritam ima složenost &amp;lt;math&amp;gt;O(n+e)&amp;lt;/math&amp;gt; jer se postupak ponavlja za svih &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; čvorova u grafu, a ukupno se prolazi kroz &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; grana.&lt;br /&gt;
&lt;br /&gt;
Sa druge strane, korišćenje regularnih lista susednosti bi bilo znatno složenije jer uprkos tome što lako nalazimo čvor bez izlaznih grana i ne treba nam dodatan vektor za to, prilikom uklanjanja svih ulaznih grana za taj čvor bismo uvek morali da prođemo sve grane u grafu kako bismo našli kojim čvorovima je on sve sledbenik.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je matrica puteva dužine tačno 1 (jedan) nekog netežinskog usmerenog grafa. Odrediti matricu puteva dužine d≤3. Postupak prikazati po koracima, uz obrazloženje.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! -&lt;br /&gt;
! A !! B !! C !! D !! E&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
| 0 || 1 || 1 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! C&lt;br /&gt;
| 1 || 1 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! D&lt;br /&gt;
| 1 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! E&lt;br /&gt;
| 0 || 0 || 0 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[{{ns:6}}:ASP1 K3 2018 zadatak 2 graf.svg|thumb|Graf koji se dobija iz matrice susednosti.]]&lt;br /&gt;
Naša tabela već sadrži informacije o svim putevima dužine 1, a to su:&lt;br /&gt;
* AB&lt;br /&gt;
* AC&lt;br /&gt;
* CA&lt;br /&gt;
* CB&lt;br /&gt;
* DA&lt;br /&gt;
* ED&lt;br /&gt;
Na osnovu toga možemo nacrtati graf s desne strane. Nakon toga sa kraja svakog od prethodnih puteva nastavljamo kroz još jednu granu kako bismo dobili sve moguće puteve dužine 2.&lt;br /&gt;
* AB → ne može dalje&lt;br /&gt;
* AC → ACA, ACB&lt;br /&gt;
* CA → CAC, CAB&lt;br /&gt;
* CB → ne može dalje&lt;br /&gt;
* DA → DAB, DAC&lt;br /&gt;
* ED → EDA&lt;br /&gt;
I taj proces ponovimo još jednom kako bismo dobili puteve dužine 3.&lt;br /&gt;
* ACA → ACAB, ACAC&lt;br /&gt;
* ACB → ne može dalje&lt;br /&gt;
* CAC → CACB, CACA&lt;br /&gt;
* CAB → ne može dalje&lt;br /&gt;
* DAB → ne može dalje&lt;br /&gt;
* DAC → DACA, DACB&lt;br /&gt;
* EDA → EDAB, EDAC&lt;br /&gt;
Na osnovu dobijenih puteva ažuriramo matricu povezanosti tako što za svaki put uzmemo čvor sa početka puta i čvor sa kraja puta, postavimo polje za granu između ta dva čvora na 1 i za sve ostale čvorove postavimo na 0. Tako se dobija konačna tablica ispod.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! -&lt;br /&gt;
! A !! B !! C !! D !! E&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
| 1 || 1 || 1 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! B&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! C&lt;br /&gt;
| 1 || 1 || 1 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! D&lt;br /&gt;
| 1 || 1 || 1 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
! E&lt;br /&gt;
| 1 || 1 || 1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je usmereni težinski acikličan graf. Implementirati funkciju FIND_PATHS_NUM koja treba da pronađe ukupan broj putanja od izvornog čvora (&#039;&#039;src&#039;&#039;) do destinacionog čvora (&#039;&#039;dst&#039;&#039;) koje su kraće od vrednosti prosleđenog parametra &#039;&#039;k&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pošto se ne kaže da mora iterativno rešenje, ovde nam je najlakše rekurzivno rešenje.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND PATHS NUM(G, src, dst, k)&lt;br /&gt;
if k &amp;lt; 1 then&lt;br /&gt;
    return 0&lt;br /&gt;
end_if&lt;br /&gt;
if src = dst then&lt;br /&gt;
    return 1&lt;br /&gt;
end_if&lt;br /&gt;
paths = 0&lt;br /&gt;
for {j : (src, j) ∈ E} do&lt;br /&gt;
    paths = paths + FIND_PATHS_NUM(G, j, dst, k - w(src, j))&lt;br /&gt;
end_for&lt;br /&gt;
return paths&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se neka opština predstavljena neusmerenim težinskim grafom. Čvorovi grafa predstavljaju naselja, dok grane povezuju čvorove između kojih je moguće postaviti kabl, pri čemu težina predstavlja rastojanje između gradova. Telekomunikacioni operater treba da poveže naselja opštine, odnosno da postavi kablove između njih. Kablovi koje operater ima na raspolaganju su dužine &#039;&#039;k&#039;&#039; i mogu se skratiti po potrebi, ali se ne mogu nastavljati. Napisati funkciju u pseudokodu koja za prosleđeni graf sa datim brojem čvorova &#039;&#039;n&#039;&#039; i parametrom &#039;&#039;k&#039;&#039; vraća da li je moguće povezati sva naselja u okviru opštine telekomunikacionom mrežom.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
TELECOM(G, n, k)&lt;br /&gt;
S = {1}&lt;br /&gt;
for i = 1 to n-1 do&lt;br /&gt;
    find min {w(u, v) : (u ∈ S) and (v ∈ (V - S))}&lt;br /&gt;
    if w(u, v) &amp;gt; k then&lt;br /&gt;
        return false&lt;br /&gt;
    end_if&lt;br /&gt;
    S = S + {v}&lt;br /&gt;
end_for&lt;br /&gt;
return true&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka je dat neusmeren netežinski graf G predstavljen matricom susednosti. Napisati u pseudokodu iterativnu funkciju za određivanje povezanih komponenti u zadatom grafu i komentarisati njenu složenost. Funkcija treba da vrati informaciju o povezanim komponentama u vidu niza pokazivača, gde svaki pokazivač pokazuje na jedan od čvorova iz odgovarajuće povezane komponente.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Osnovna detekcija povezanih komponenti funkcioniše tako što jedna petlja prolazi kroz svaki čvor i ako nije posećen računa ga kao odvojenu komponentu i radi DFS nad njim kako bi se ostali čvorovi u komponenti označili kao posećeni. Sa listom susednosti spoljašnja petlja prolazi tačno &#039;&#039;n&#039;&#039; puta kroz niz a od svakog čvora prilikom DFS-a se moraju posetiti sve grane, pa to čini ukupnu složenost od &amp;lt;math&amp;gt;\mathcal{O(e + n)}&amp;lt;/math&amp;gt;. Pošto, nažalost, koristimo matricu susednosti umesto liste susednosti, pri obilaženju svakog čvora DFS-om moraćemo da prođemo kroz ceo red matrice kako bismo odredili koje su u njoj grane, i to ćemo morati da učinimo za svaki čvor (jer ćemo svaki čvor morati da posetimo), što bez obzira na spoljašnju petlju čini složenost od &amp;lt;math&amp;gt;\mathcal{O(n^2)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CONN COMP MAT(G)&lt;br /&gt;
curr_comp = 0&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    comp[i] = 0&lt;br /&gt;
end_for&lt;br /&gt;
stack = t = nil&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    if comp[i] = 0 then&lt;br /&gt;
        curr_comp = curr_comp + 1&lt;br /&gt;
        comp[i] = curr_comp&lt;br /&gt;
        stack = GETNODE&lt;br /&gt;
        value(stack) = i&lt;br /&gt;
        while stack ≠ nil do&lt;br /&gt;
            for j = 1 to n do&lt;br /&gt;
                if (e[value(stack), j] = 1) and (comp[j] = 0) then&lt;br /&gt;
                    comp[j] = curr_comp&lt;br /&gt;
                    t = next(stack)&lt;br /&gt;
                    next(stack) = GETNODE&lt;br /&gt;
                    value(next(stack)) = j&lt;br /&gt;
                    next(next(stack)) = t&lt;br /&gt;
                end_if&lt;br /&gt;
            end_for&lt;br /&gt;
            t = stack&lt;br /&gt;
            stack = next(stack)&lt;br /&gt;
            FREENODE(t)&lt;br /&gt;
        end_while&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
ALLOCATE(res[curr_comp])&lt;br /&gt;
for i = 1 to curr_comp do&lt;br /&gt;
    res[i] = nil&lt;br /&gt;
end_for&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    if res[comp[i]] = nil then&lt;br /&gt;
        res[comp[i]] = v[i]&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
return res&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se posmatra usmeren graf sa slike. Pod pretpostavkom da se za obilazak grafa koristi BFS algoritam i početni čvor A, definisati i obeležiti grane stabla obilaska, grane unapred, povratne grane i poprečne grane. Smatrati da se susedi obilaze u alfabetskom poretku njihovih oznaka.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Redosled obilaska je &#039;&#039;&#039;ABCDFGEFH&#039;&#039;&#039;. Stablo obilaska izgleda ovako:&lt;br /&gt;
     A&lt;br /&gt;
  /  |  \&lt;br /&gt;
 B   C   D&lt;br /&gt;
 |   |  / \&lt;br /&gt;
 F   G F2  E&lt;br /&gt;
 |&lt;br /&gt;
 H&lt;br /&gt;
&amp;lt;gallery class=&amp;quot;transparent-svg&amp;quot;&amp;gt;&lt;br /&gt;
  ASP1 K3 2018 zadatak 6 graf.svg    | Graf iz postavke zadatka.&lt;br /&gt;
  ASP1 K3 2018 zadatak 6 rešenje.svg | Rešenje zadatka.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[{{ns:6}}:ASP1 K3 2018 zadatak 7 graf.svg|thumb|Pojednostavljen graf iz postavke zadatka.]]&lt;br /&gt;
Za graf sa slike, odrediti najkraća rastojanja od čvora C do svih ostalih čvorova. Kada algoritam završava svoj rad u ovom slučaju?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Algoritam završava svoj rad kada više ne postoji čvor grafa &#039;&#039;i&#039;&#039; ∉ &#039;&#039;S&#039;&#039; kome &#039;&#039;d&#039;&#039;[&#039;&#039;i&#039;&#039;] ≠ ∞.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | S&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | T&lt;br /&gt;
! colspan=&amp;quot;7&amp;quot; | D&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
! B&lt;br /&gt;
! D&lt;br /&gt;
! E&lt;br /&gt;
! F&lt;br /&gt;
! G&lt;br /&gt;
! H&lt;br /&gt;
|-&lt;br /&gt;
| C || - || ∞ || ∞ || &#039;&#039;&#039;3&#039;&#039;&#039; || ∞ || ∞ || 4 || ∞&lt;br /&gt;
|-&lt;br /&gt;
| C, D || D || ∞ || ∞ || 3 || 7 || 9 || &#039;&#039;&#039;4&#039;&#039;&#039; || ∞&lt;br /&gt;
|-&lt;br /&gt;
| C, D, G || G || ∞ || ∞ || 3 || 7 || &#039;&#039;&#039;6&#039;&#039;&#039; || 4 || ∞&lt;br /&gt;
|-&lt;br /&gt;
| C, D, G, F || F || ∞ || ∞ || 3 || &#039;&#039;&#039;7&#039;&#039;&#039; || 6 || 4 || 9&lt;br /&gt;
|-&lt;br /&gt;
| C, D, G, F, E || E || ∞ || ∞ || 3 || 7 || 6 || 4 || &#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| C, D, G, F, E, H || H || ∞ || ∞ || 3 || 7 || 6 || 4 || 9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Maksimizacija protoka grafa &#039;&#039;G(V, E)&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Na formalan (netekstualni) i precizan način definisati rezidualni graf &#039;&#039;G&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;&#039;&#039; za protočni graf &#039;&#039;G&#039;&#039;. Koliko maksimalno grana može da ima rezidualni graf?&lt;br /&gt;
# Napisati funkciju koja na osnovu protočnog grafa &#039;&#039;G&#039;&#039; formira rezidualni graf &#039;&#039;G&amp;lt;sub&amp;gt;f&amp;lt;/sub&amp;gt;&#039;&#039;. Graf &#039;&#039;G&#039;&#039; je zadat listom susednosti, gde čvor liste sadrži trenutni protok grane &#039;&#039;f&#039;&#039; i njen kapacitet &#039;&#039;c&#039;&#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
: &amp;lt;math&amp;gt;G_f = (V, E_f)&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;E_f = \{(i, j) : i, j \in V, c(i, j) - f(i, j) &amp;gt; 0 \}&amp;lt;/math&amp;gt;&lt;br /&gt;
Rezidualni graf može maksimalno da ima duplo više grana od protočnog grafa, u slučaju da se nakon zamene grana ne dobiju grane težine 0. Protočni graf ima maksimalan broj grana &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; jer između svaka dva čvora može da postoji grana, pa zato rezidualni graf može da ima maksimalno &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; grana.&lt;br /&gt;
&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
GtoGf(G)&lt;br /&gt;
ALLOCATE(E&#039;, n)&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    e&#039;[i] = nil&lt;br /&gt;
end_for&lt;br /&gt;
p = nil&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    p = e[i]&lt;br /&gt;
    while p ≠ nil do&lt;br /&gt;
        BRANCH_INSERT(E&#039;, i, value(p), c(p) - f(p))&lt;br /&gt;
        BRANCH_INSERT(E&#039;, value(p), i, f(p))&lt;br /&gt;
        p = next(p)&lt;br /&gt;
    end_while&lt;br /&gt;
end_for&lt;br /&gt;
return (V, E&#039;)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
BRANCH INSERT(E&#039;, from, to, w)&lt;br /&gt;
if w = 0 then&lt;br /&gt;
    return&lt;br /&gt;
end_if&lt;br /&gt;
t = e&#039;[from]&lt;br /&gt;
e&#039;[from] = GETNODE&lt;br /&gt;
value(e&#039;[from]) = to&lt;br /&gt;
next(e&#039;[from]) = t&lt;br /&gt;
w(e&#039;[from]) = w&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A3_2017&amp;diff=7795</id>
		<title>АСП1/К3 2017</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A3_2017&amp;diff=7795"/>
		<updated>2024-09-13T00:09:03Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_K3_1617.pdf Zadaci]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na slici je dat težinski neusmereni graf. Formirati minimalno obuhvatno stablo korišćenjem Kruskalovog algoritma. Prikazati postupak izbora grana i finalno stablo.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kada uredimo grane po težini dobijamo redosled po kojem možemo da ih biramo za ubacivanje u graf.&lt;br /&gt;
# B-D (2)&lt;br /&gt;
# C-E (5)&lt;br /&gt;
# A-C (8)&lt;br /&gt;
# C-D (10)&lt;br /&gt;
# &amp;lt;strike&amp;gt;A-B (12)&amp;lt;/strike&amp;gt; - A i B su već povezani preko A-C, C-D i B-D&lt;br /&gt;
# &amp;lt;strike&amp;gt;D-E (13)&amp;lt;/strike&amp;gt; - D i E su već povezani preko C-D i C-E&lt;br /&gt;
# B-M (15)&lt;br /&gt;
# &amp;lt;strike&amp;gt;A-E (25)&amp;lt;/strike&amp;gt; - svi čvorovi su nam već u stablu&lt;br /&gt;
# &amp;lt;strike&amp;gt;M-E (30)&amp;lt;/strike&amp;gt; - svi čvorovi su nam već u stablu&lt;br /&gt;
&amp;lt;gallery class=&amp;quot;transparent-svg&amp;quot;&amp;gt;&lt;br /&gt;
  ASP1 K3 2017 zadatak 1 graf.svg | Graf iz postavke zadatka.&lt;br /&gt;
  ASP1 K3 2017 zadatak 1 MST.svg  | Minimalno obuhvatno stablo za graf iz postavke zadatka.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu iterativnu implementaciju funkcije za topološko sortiranje usmerenog netežinskog grafa. Ukoliko u nekom trenutku više čvorova može biti kandidat za istu poziciju u finalnom redosledu, bira se čvor sa najviše neposećenih suseda. Graf se predstavlja pomoću liste susednosti u čijem se zaglavlju za svaki čvor, pored pokazivača na odgovorajuću listu suseda, nalazi i broj suseda. Funkcija treba da vrati niz čvorova u topološkom poretku.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
TOPSORT(G, n)&lt;br /&gt;
p = nil&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    in[i] = 0&lt;br /&gt;
end_for&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    p = first(e[i])&lt;br /&gt;
    while p ≠ nil do&lt;br /&gt;
        in[value(p)] = in[value(p)] + 1&lt;br /&gt;
        p = next(p)&lt;br /&gt;
    end_while&lt;br /&gt;
end_for&lt;br /&gt;
tail = head = nil&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    if in[i] = 0 then&lt;br /&gt;
        if tail = nil then&lt;br /&gt;
            tail = head = GETNODE&lt;br /&gt;
            value(tail) = i&lt;br /&gt;
        else&lt;br /&gt;
            PRIORITY_QUEUE_INSERT(tail, head, E, i)&lt;br /&gt;
        end_if&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
i = 1&lt;br /&gt;
while tail ≠ nil do&lt;br /&gt;
    ret[i] = value(tail)&lt;br /&gt;
    p = first(e[i])&lt;br /&gt;
    while p ≠ nil do&lt;br /&gt;
        in[value(p)] = in[value(p)] - 1&lt;br /&gt;
        if in[value(p)] = 0 then&lt;br /&gt;
            PRIORITY_QUEUE_INSERT(tail, head, E, value(p))&lt;br /&gt;
        end_if&lt;br /&gt;
        p = next(p)&lt;br /&gt;
    end_while&lt;br /&gt;
    i = i + 1&lt;br /&gt;
    p = tail&lt;br /&gt;
    tail = next(tail)&lt;br /&gt;
    FREENODE(p)&lt;br /&gt;
end_while&lt;br /&gt;
return ret&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PRIORITY QUEUE INSERT(tail, head, E, value)&lt;br /&gt;
p = tail&lt;br /&gt;
found = false&lt;br /&gt;
t = nil&lt;br /&gt;
if num(e[value]) &amp;gt; num(e[value(p)]) then&lt;br /&gt;
    tail = GETNODE&lt;br /&gt;
    value(tail) = value&lt;br /&gt;
    next(tail) = p&lt;br /&gt;
else&lt;br /&gt;
    while next(p) ≠ nil do&lt;br /&gt;
        if num(e[value]) &amp;gt; num(e[value(next(p))]) then&lt;br /&gt;
            t = next(p)&lt;br /&gt;
            next(p) = GETNODE&lt;br /&gt;
            value(next(p)) = value&lt;br /&gt;
            next(next(p)) = t&lt;br /&gt;
            found = true&lt;br /&gt;
            break&lt;br /&gt;
        end_if&lt;br /&gt;
        p = next(p)&lt;br /&gt;
    end_while&lt;br /&gt;
    if not found then&lt;br /&gt;
        next(head) = GETNODE&lt;br /&gt;
        value(next(head)) = value&lt;br /&gt;
        head = next(head)&lt;br /&gt;
    end_if&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Perica je vodoinstalater. Završio je posao za danas i vraća se kući, gde ga žena čeka za ručkom. Na putu do svoje kuće prolazi pored kuća svojih prijatelja i zna da će ga svaki od njih zaustaviti da popriča sa njim (malo mesto, svi se znaju, a i naš Perica je dobar vodoinstalater). Perica je gladan i nije danas mnogo raspoložen za priču, pa želi da stigne kući i pritom popriča sa što manjim brojem ljudi. Put do kuće sadrži određeni broj raskrsnica koje spajaju ulice sa određenim brojem kuća.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Objasniti na koji način se izloženi problem može modelovati putem grafa.&lt;br /&gt;
# Napisati u pseudokodu funkciju koja navodi Pericu od posla do kuće tako da na putu popriča sa što je moguće manjim brojem ljudi.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovaj sistem možemo modelovati neusmerenim težinskim grafom u kojem su posao, kuća i raskrsnice čvorovi, ulice između njih su grane a težina tih grana je broj ljudskih bića sa kojima će Perica nažalost morati da se sukobi u njegovoj najneomiljenijoj disciplini: prijateljskom razgovoru.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
GET PERICA HOME(G, work, home)&lt;br /&gt;
S = {home}&lt;br /&gt;
p = nil&lt;br /&gt;
curr = 0&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    d[i] = w(home, i)&lt;br /&gt;
    if d[i] = ∞ then&lt;br /&gt;
        t[i] = 0&lt;br /&gt;
    else&lt;br /&gt;
        t[i] = home&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
for k = 1 to n-1 do&lt;br /&gt;
    find min {d[i] : i ∈ (V - S)}&lt;br /&gt;
    p = e[i]&lt;br /&gt;
    while p ≠ nil do&lt;br /&gt;
        if d[i] + w(i, value(p)) &amp;lt; d[value(p)] then&lt;br /&gt;
            d[value(p)] = d[i] + w(i, value(p))&lt;br /&gt;
            t[value(p)] = i&lt;br /&gt;
        end_if&lt;br /&gt;
        p = next(p)&lt;br /&gt;
    end_while&lt;br /&gt;
    S = S + {i}&lt;br /&gt;
end_for&lt;br /&gt;
curr = t[work]&lt;br /&gt;
while curr ≠ home then&lt;br /&gt;
    GO(curr)&lt;br /&gt;
    curr = t[curr]&lt;br /&gt;
end_while&lt;br /&gt;
GO(home)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[{{ns:6}}:ASP1 K3 2017 zadatak 4 graf.svg|thumb|Graf iz postavke zadatka.]]&lt;br /&gt;
Za graf sa slike naći kritični put i dozvoljena kašnjenja za pojedinačne čvorove. Kritični put označiti i na samom grafu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kritičan put: &#039;&#039;&#039;ACGSRT&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Čvor&lt;br /&gt;
! EST&lt;br /&gt;
! LST&lt;br /&gt;
! L&lt;br /&gt;
|-&lt;br /&gt;
! A&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! C&lt;br /&gt;
| 11&lt;br /&gt;
| 11&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! E&lt;br /&gt;
| 13&lt;br /&gt;
| 25&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
! F&lt;br /&gt;
| 26&lt;br /&gt;
| 31&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
! G&lt;br /&gt;
| 18&lt;br /&gt;
| 18&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! H&lt;br /&gt;
| 10&lt;br /&gt;
| 13&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
! K&lt;br /&gt;
| 32&lt;br /&gt;
| 36&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
! N&lt;br /&gt;
| 35&lt;br /&gt;
| 39&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
! R&lt;br /&gt;
| 40&lt;br /&gt;
| 40&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! S&lt;br /&gt;
| 38&lt;br /&gt;
| 38&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! T&lt;br /&gt;
| 43&lt;br /&gt;
| 43&lt;br /&gt;
| 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se posmatra jedan fudbalski tim sa 25 članova koji konkurišu za 11 pozicija u timu. Svaki igrač ima definisan skup pozicija na kojima može da igra, a za svaku poziciju mu se dodeljuje odgovarajuća ocena. Dati predlog na koji način se dati problem može modelovati grafom i izvršiti selekcija prve postave, tako da se izabere postava od 11 igrača koji imaju najbolje ocene. Smatrati da je svaka pozicija u timu pokrivena najmanje jednim igračem.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovaj problem se može modelovati bipartitnim grafom gde čvorovi jednog dela označavaju fudbalere, čvorovi drugog pozicije na kojima oni mogu igrati, grane između fudbalera i pozicije označavaju da taj fudbaler može igrati na toj poziciji a težina te grane njegova ocena. Uparivanje se vrši brute-force metodom, tako što se isprobaju sva moguća uparivanja fudbalera i pozicija gde su sve pozicije zauzete i izabere ono gde je zbir težina grana najveći.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se posmatra netežinski usmereni graf &#039;&#039;G&#039;&#039; sa &#039;&#039;n&#039;&#039; čvorova. Za posmatrani graf su korišćenjem DFS algoritma određena početna i završna vremena svih čvorova i smeštena u nizovima F i L dužine &#039;&#039;n&#039;&#039;. Napisati u pseudokodu funkciju koja pronalazi najveću jako povezanu komponentu po broju čvorova. Smatrati da je graf predstavljen pomoću matrice susednosti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
MAX STRONG CC(G, n)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka je dato neko stanje protočnog grafa preko matrice trenutnih protoka &#039;&#039;F&#039;&#039; kao i odgovarajuće stanje rezidualnog grafa preko matrice &#039;&#039;R&#039;&#039;.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Napisati funkciju koja određuje matricu kapaciteta i izračunava broj grana polaznog protočnog grafa.&lt;br /&gt;
# U odnosu na broj grana početnog protočnog grafa, odrediti koliko najmanje i koliko najviše grana može imati rezidulani graf.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Rezidualni graf najmanje može imati &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; grana u slučaju da su svi protoci puni ili prazni i ima tačno onoliko grana koliko je potrebno da bi graf bio povezan, ili &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; grana u slučaju da nijedan protok nije pun ili prazan i svaki čvor je povezan sa svakim.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FLOW CAP(F, R)&lt;br /&gt;
num_total = 0&lt;br /&gt;
for x = 1 to n do&lt;br /&gt;
    for y = 1 to n do&lt;br /&gt;
        if (F[x, y] &amp;gt; 0) or ((F[x, y] = 0) and (F[y, x] = 0) and (R[x, y] &amp;gt; 0)) then&lt;br /&gt;
            num_total = num_total + 1&lt;br /&gt;
        end_if&lt;br /&gt;
        if F[x, y] = 0 then&lt;br /&gt;
            if R[x, y] ≠ 0 then&lt;br /&gt;
                C[x, y] = R[x, y]&lt;br /&gt;
            end_if&lt;br /&gt;
        else&lt;br /&gt;
            C[x, y] = F[x, y] + R[x, y]&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
end_for&lt;br /&gt;
return num_total&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Potrebno je utvrditi da li je dati povezani neusmereni graf cikličan na što efikasniji način.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Objasniti postupak i dati vremensku složenost.&lt;br /&gt;
# Na osnovu predloženog postupka napisati pseudokod.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
IS CYCLIC(G)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A2_2019&amp;diff=7794</id>
		<title>АСП1/К2 2019</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A2_2019&amp;diff=7794"/>
		<updated>2024-09-13T00:09:03Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_K2_1819.pdf Zadaci]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FORM TREE(arr, n)&lt;br /&gt;
ALLOCATE(nodes[n])&lt;br /&gt;
if n = 0 then&lt;br /&gt;
    return nil&lt;br /&gt;
end_if&lt;br /&gt;
j = 1&lt;br /&gt;
nodes[1] = GETNODE(arr[1])&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    if j &amp;lt; n then&lt;br /&gt;
        j = j + 1&lt;br /&gt;
        nodes[j] = GETNODE(arr[j])&lt;br /&gt;
        left(nodes[i]) = nodes[j]&lt;br /&gt;
    end_if&lt;br /&gt;
    if j &amp;lt; n then&lt;br /&gt;
        j = j + 1&lt;br /&gt;
        nodes[j] = GETNODE(arr[j])&lt;br /&gt;
        right(nodes[i]) = nodes[j]&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
return nodes[1]&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
GETNODE(value)&lt;br /&gt;
ALLOCATE(node)&lt;br /&gt;
left(node) = nil&lt;br /&gt;
right(node) = nil&lt;br /&gt;
value(node) = value&lt;br /&gt;
return node&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kodovano: &#039;&#039;&#039;014234&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Simbol&lt;br /&gt;
! Kôd&lt;br /&gt;
|-&lt;br /&gt;
| K&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| U&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| R&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| I&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| KU&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| UK&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| KUR&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| RI&lt;br /&gt;
| 7&lt;br /&gt;
|-&lt;br /&gt;
| IK&lt;br /&gt;
| 8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za neko binarno stablo &#039;&#039;preorder&#039;&#039; obilazak daje poredak HBIKCFDAEJG, a &#039;&#039;inorder&#039;&#039; obilazak HBIADJEGFCK. Odrediti poredak koji se dobija &#039;&#039;level-order&#039;&#039; obilaskom i objasniti postupak.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
   H&lt;br /&gt;
    \&lt;br /&gt;
     B&lt;br /&gt;
      \&lt;br /&gt;
       I&lt;br /&gt;
        \&lt;br /&gt;
         K&lt;br /&gt;
        /&lt;br /&gt;
       C&lt;br /&gt;
      /&lt;br /&gt;
     F&lt;br /&gt;
    /&lt;br /&gt;
   D&lt;br /&gt;
  / \&lt;br /&gt;
 A   E&lt;br /&gt;
    / \&lt;br /&gt;
   J   G&lt;br /&gt;
&#039;&#039;Level-order&#039;&#039; obilazak: &#039;&#039;&#039;HBIKCFDAEJG.&#039;&#039;&#039; Postupak se svodi na to da idemo po svakom nivou binarnog stabla i čitamo sadržaj tog nivoa sleva na desno.&lt;br /&gt;
&lt;br /&gt;
== 4. pitanje ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je stablo formirano primenom statičkog &#039;&#039;Huffman&#039;&#039;-ovog algoritma. Implementirati funkciju FIND_CODES koja za takvo stablo na čiji koren pokazuje pokazivač &#039;&#039;root&#039;&#039; vraća simbole čiji su kodovi dužine tačno &#039;&#039;k&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND CODES(root, k)&lt;br /&gt;
if (root = nil) or (k ≤ 0) then&lt;br /&gt;
    return nil&lt;br /&gt;
end_if&lt;br /&gt;
symbols = nil&lt;br /&gt;
node = nil&lt;br /&gt;
depth = 0&lt;br /&gt;
symb_node = nil&lt;br /&gt;
p = symbols&lt;br /&gt;
QUEUE_INIT(Q1)&lt;br /&gt;
QUEUE_INIT(Q2)&lt;br /&gt;
QUEUE_INSERT(Q1, root)&lt;br /&gt;
QUEUE_INSERT(Q2, 0)&lt;br /&gt;
while not QUEUE_EMPTY(Q1) do&lt;br /&gt;
    node = QUEUE_DELETE(Q1)&lt;br /&gt;
    depth = QUEUE_DELETE(Q2)&lt;br /&gt;
    if depth = k then&lt;br /&gt;
        if symbol(node) ≠ nil then&lt;br /&gt;
            symb_node = GETNODE&lt;br /&gt;
            value(symb_node) = symbol(node)&lt;br /&gt;
            if symbols = nil then&lt;br /&gt;
                symbols = p = symb_node&lt;br /&gt;
            else&lt;br /&gt;
                next(p) = symb_node&lt;br /&gt;
                p = next(p)&lt;br /&gt;
            end_if&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        if left(node) ≠ nil then&lt;br /&gt;
            QUEUE_INSERT(Q1, left(node))&lt;br /&gt;
            QUEUE_INSERT(Q2, depth + 1)&lt;br /&gt;
        end_if&lt;br /&gt;
        if right(node) ≠ nil then&lt;br /&gt;
            QUEUE_INSERT(Q1, right(node))&lt;br /&gt;
            QUEUE_INSERT(Q2, depth + 1)&lt;br /&gt;
        end_if&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
return symbols&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Primenom algoritma dinamički &#039;&#039;Huffman&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Krajnje transmitovano: &#039;&#039;&#039;A 0B 00R 0 100K 0 1100D 0 110 110 0&#039;&#039;&#039;&lt;br /&gt;
* Krajnje kodirano: &#039;&#039;&#039;000 0001 00010 0 100011 0 1100100 0 110 110 0&#039;&#039;&#039;&lt;br /&gt;
* Krajnje stablo:&lt;br /&gt;
    11&lt;br /&gt;
   /  \&lt;br /&gt;
  A     6&lt;br /&gt;
  5   /   \&lt;br /&gt;
     2     4&lt;br /&gt;
    / \   / \&lt;br /&gt;
   1   K R   B&lt;br /&gt;
  / \  1 2   2&lt;br /&gt;
 NYT D&lt;br /&gt;
  0  1&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Precizno objasniti kako se iterativni algoritam za obilazak po &#039;&#039;inorder&#039;&#039;-u može modifikovati tako da se zadato stablo transformiše u povezano (&#039;&#039;threaded&#039;&#039;) stablo po istom obilasku.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Može se modifikovati tako što čuvamo pokazivač na prethodno obrađeni čvor (&amp;lt;code&amp;gt;prev&amp;lt;/code&amp;gt;) i pre obrađivanja trenutnog čvora (&amp;lt;code&amp;gt;P(&#039;&#039;next&#039;&#039;)&amp;lt;/code&amp;gt;, gde je &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; trenutno obrađivani čvor) radimo sledeće:&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
if prev ≠ nil then&lt;br /&gt;
    if left(next) = nil then&lt;br /&gt;
        left(next) = prev&lt;br /&gt;
        lf(next) = 0&lt;br /&gt;
    end_if&lt;br /&gt;
    if right(prev) = nil then&lt;br /&gt;
        right(prev) = next&lt;br /&gt;
        rf(prev) = 0&lt;br /&gt;
    end_if&lt;br /&gt;
end_if&lt;br /&gt;
prev = next&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
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 &#039;&#039;n&#039;&#039; čvorova. Nacrtati primer takvog stabla sa 4 čvora i izračunati internu dužinu puta.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Interna dužina puta postiže maksimum u degenerisanom binarnom stablu u kojem ima jedan čvor po nivou, na primer (za &amp;lt;code&amp;gt;n = 4&amp;lt;/code&amp;gt;):&lt;br /&gt;
       A&lt;br /&gt;
      /&lt;br /&gt;
     B&lt;br /&gt;
    /&lt;br /&gt;
   C&lt;br /&gt;
  /&lt;br /&gt;
 D&lt;br /&gt;
Interna dužina puta je zbir dužina puteva od korena stabla do svakog internog čvora, što je u ovom slučaju &amp;lt;math&amp;gt;PI = 1 + 2 + 3 = 6&amp;lt;/math&amp;gt;. 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 &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; čvorova jednaka &amp;lt;math&amp;gt;PI_n = 1 + 2 + 3 + ... + (n - 1) = \frac{(n-1) n}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti odgovarajući tip grafa i detaljno opisati njegove osobine.&lt;br /&gt;
# 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.&lt;br /&gt;
# Napisati pseudkod&amp;lt;sup&amp;gt;[sic]&amp;lt;/sup&amp;gt; funkcije koja za zadatog korisnika vraća ukupan broj pratilaca.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
: &#039;&#039;U rešenju se pretpostavlja da se u postavci zadatka implicira da su prijatelji ujedno i pratioci.&#039;&#039;&lt;br /&gt;
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.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FOLLOWERS(G, i)&lt;br /&gt;
followers = 0&lt;br /&gt;
p = IAL[i]&lt;br /&gt;
while&#039; p ≠ nil do&lt;br /&gt;
    followers = followers + 1&lt;br /&gt;
    p = next(p)&lt;br /&gt;
end_while&lt;br /&gt;
return followers&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A2_2018&amp;diff=7793</id>
		<title>АСП1/К2 2018</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A2_2018&amp;diff=7793"/>
		<updated>2024-09-13T00:09:02Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_K2_1718.pdf Zadaci]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu iterativnu funkciju koja vrši generalizovani &#039;&#039;preorder&#039;&#039; obilazak &#039;&#039;m&#039;&#039;-arnog stabla na koje pokazuje pokazivač &#039;&#039;root&#039;&#039;. Svaki čvor stabla sadrži oznaku čvora i &#039;&#039;m&#039;&#039; pokazivača na potomke. Funkcija treba da vrati niz koji za svaki čvor stabla sadrži njegovu oznaku i nivo u stablu na kome se čvor nalazi. Komentarisati rešenje. Dozvoljeno je koristiti gotove linearne strukture podataka.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PREORDER M I(root, m)&lt;br /&gt;
if root = nil then&lt;br /&gt;
    return nil&lt;br /&gt;
end_if&lt;br /&gt;
INIT_STACK(S1)&lt;br /&gt;
INIT_STACK(S2)&lt;br /&gt;
STACK_PUSH(S1, root)&lt;br /&gt;
STACK_PUSH(S2, 1)&lt;br /&gt;
node = nil&lt;br /&gt;
depth = 0&lt;br /&gt;
list = nil&lt;br /&gt;
p = nil&lt;br /&gt;
while not STACK_EMPTY(S1) do&lt;br /&gt;
    node = STACK_POP(S1)&lt;br /&gt;
    depth = STACK_POP(S2)&lt;br /&gt;
    if list = nil then&lt;br /&gt;
        list = p = GETNODE&lt;br /&gt;
    else&lt;br /&gt;
        next(p) = GETNODE&lt;br /&gt;
        p = next(p)&lt;br /&gt;
    end_if&lt;br /&gt;
    symbol(p) = symbol(node)&lt;br /&gt;
    depth(p) = depth&lt;br /&gt;
    for i = m to 1 do&lt;br /&gt;
        if children(node)[i] ≠ nil then&lt;br /&gt;
            STACK_PUSH(S1, children(node)[i])&lt;br /&gt;
            STACK_PUSH(S2, depth + 1)&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
end_while&lt;br /&gt;
return list&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Ovo rešenje se zasniva na čuvanju čvora i nivoa čvora u dva odvojena steka i korišćenju povezane liste (pošto ne znamo unapred količinu čvorova u stablu kako bismo alocirali niz). Za svaki čvor u steku dodajemo njegovu decu na jedan stek, s tim što ih dodajemo s desna na levo kako bi prvi posećeni čvor bio najlevlje (odnosno prvo) dete čvora (kao što je to i slučaj kod &#039;&#039;preorder&#039;&#039; obilaska), a njegov nivo uvećan za jedan na drugi stek.&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Izvesti i objasniti izraz za određivanje minimalne visine &#039;&#039;h&amp;lt;sub&amp;gt;min&amp;lt;/sub&amp;gt;&#039;&#039; za binarno stablo sa n čvorova. Kakve osobine ima binarno stablo sa minimalnom visinom?&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Binarno stablo sa minimalnom visinom teži da ima svaki nivo popunjen, tj. teži da bude kompletno stablo. Pošto znamo da kompletno stablo na nivou &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; ima &amp;lt;math&amp;gt;2^i&amp;lt;/math&amp;gt; čvorova (svaki čvor osim listova ima maksimalni izlazni stepen, što je 2), i da je stoga ukupan broj čvorova u stablu jednak &amp;lt;math&amp;gt;n = 2^0 + 2^1 + ... + 2^h = 2^{h + 1} - 1&amp;lt;/math&amp;gt;. To znači da je &amp;lt;math&amp;gt;\log_2(n + 1)&amp;lt;/math&amp;gt; jednako &amp;lt;math&amp;gt;h + 1&amp;lt;/math&amp;gt; i time dobijamo da je &amp;lt;math&amp;gt;h_{min} = \left\lceil{\log_2(n + 1)}\right\rceil - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Za neko binarno stablo &#039;&#039;preorder&#039;&#039; obilazak daje poredak ABDCEFGHI, a &#039;&#039;postorder&#039;&#039; obilazak DBFIHGECA.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Navesti sve čvorove koji predstavljaju listove ovog stabla.&lt;br /&gt;
# Odrediti sve pretke čvora E.&lt;br /&gt;
# Navesti sve čvorove koji se nalaze u podstablu čiji je koren čvor E.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
     A&lt;br /&gt;
    / \&lt;br /&gt;
   B   C&lt;br /&gt;
  /   /&lt;br /&gt;
 D   E&lt;br /&gt;
    / \&lt;br /&gt;
   F   G&lt;br /&gt;
      /&lt;br /&gt;
     H&lt;br /&gt;
    /&lt;br /&gt;
   I&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# D, F, I&lt;br /&gt;
# C, A&lt;br /&gt;
# F, G, H, I&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Primenom LZW algoritma prikazati postupak kodiranja znakovnog niza LESQUELLES, ako je data početna tabela sa kodovima simbola. Napisati kodiranu poruku i izgled tabele simbola nakon postupka kodiranja.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kodirana poruka: &#039;&#039;&#039;012341052&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Simbol&lt;br /&gt;
! Kôd&lt;br /&gt;
|-&lt;br /&gt;
| L&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| E&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| S&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| Q&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| U&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| LE&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| ES&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| SQ&lt;br /&gt;
| 7&lt;br /&gt;
|-&lt;br /&gt;
| QU&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| UE&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| EL&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| LL&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| LES&lt;br /&gt;
| 12&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je stablo formirano primenom algoritma statički &#039;&#039;Huffman&#039;&#039;. Implementirati funkciju FIND_LONGEST_CODES koja vraća broj simbola koji se kodiraju najvećim brojem bita prema formiranom stablu. Funkciji je prosleđen pokazivač na koren stabla &#039;&#039;root&#039;&#039;. Napisati u pseudokodu i metodu IS EXTERNAL NODE koja proverava da li je čvor na koji pokazuje prosleđeni pokazivač eksterni.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND LONGEST CODES(root)&lt;br /&gt;
tail = head = GETNODE(root)&lt;br /&gt;
next(head) = GETNODE(nil)&lt;br /&gt;
head = next(head)&lt;br /&gt;
num_max = 0&lt;br /&gt;
t = nil&lt;br /&gt;
while tail ≠ nil do&lt;br /&gt;
    if value(tail) = nil then&lt;br /&gt;
        if tail ≠ head then&lt;br /&gt;
            next(head) = GETNODE(nil)&lt;br /&gt;
            head = next(head)&lt;br /&gt;
            num_max = 0&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        if IS_EXTERNAL_NODE(value(tail)) then&lt;br /&gt;
            num_max = num_max + 1&lt;br /&gt;
        else&lt;br /&gt;
            if left(value(tail)) ≠ nil then&lt;br /&gt;
                next(head) = GETNODE(left(value(tail)))&lt;br /&gt;
                head = next(head)&lt;br /&gt;
            end_if&lt;br /&gt;
            if right(value(tail)) ≠ nil then&lt;br /&gt;
                next(head) = GETNODE(right(value(tail)))&lt;br /&gt;
                head = next(head)&lt;br /&gt;
            end_if&lt;br /&gt;
        end_if&lt;br /&gt;
    end_if&lt;br /&gt;
    t = next(tail)&lt;br /&gt;
    FREENODE(tail)&lt;br /&gt;
    tail = t&lt;br /&gt;
end_while&lt;br /&gt;
return num_max&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
IS EXTERNAL NODE(node)&lt;br /&gt;
if left(node) = nil and right(node) = nil then&lt;br /&gt;
    return true&lt;br /&gt;
else&lt;br /&gt;
    return false&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
GETNODE(value)&lt;br /&gt;
ALLOCATE(node)&lt;br /&gt;
next(node) = nil&lt;br /&gt;
value(node) = value&lt;br /&gt;
return node&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FREENODE(node)&lt;br /&gt;
DEALLOCATE(node)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se stablo sa slike. Povezati ga po &#039;&#039;inorder&#039;&#039;-u i ilustrovati slikom na kojoj su obeležene sve potrebne dodatne informacije. Precizno objasniti na koji način se može izvršiti ispisivanje stabla po inverznom &#039;&#039;inorder&#039;&#039; poretku.&lt;br /&gt;
     A&lt;br /&gt;
    / \&lt;br /&gt;
   B   C&lt;br /&gt;
  / \   \&lt;br /&gt;
 F   G   Y&lt;br /&gt;
    /   /&lt;br /&gt;
   E   M&lt;br /&gt;
    \&lt;br /&gt;
     X&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[File:ASP1 K2 2018 zadatak 6 stablo.svg|thumb|Rešenje prvog dela zadatka.]]&lt;br /&gt;
Algoritam za obilazak povezanog stabla obrnutim &#039;&#039;inorder&#039;&#039; poretkom dat je ispod.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
REVERSE INORDER T(root)&lt;br /&gt;
node = root&lt;br /&gt;
while right(node) ≠ nil do&lt;br /&gt;
    node = right(node)&lt;br /&gt;
end_while&lt;br /&gt;
while node ≠ nil do&lt;br /&gt;
    P(node)&lt;br /&gt;
    if lf(node) = 0 then&lt;br /&gt;
        node = left(node)&lt;br /&gt;
    else&lt;br /&gt;
        node = left(node)&lt;br /&gt;
        while node ≠ nil and rf(node) = 1 do&lt;br /&gt;
            node = right(node)&lt;br /&gt;
        end_while&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Primenog algoritma dinamički &#039;&#039;Huffman&#039;&#039; dekodovati poruku 0000100101011011111101101101 ukoliko se sastoji od karaktera A, B i C koji imaju početne fiksne kodove 00, 01 i 10. Proces dekodovanja prikazati po koracima.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Dekodovana poruka: &#039;&#039;&#039;ABCCAACBBB&#039;&#039;&#039;&lt;br /&gt;
* Krajnje &#039;&#039;Huffman&#039;&#039;-ovo stablo:&lt;br /&gt;
   10&lt;br /&gt;
  /  \&lt;br /&gt;
 B    6&lt;br /&gt;
 4   / \&lt;br /&gt;
    3   C&lt;br /&gt;
   / \  3&lt;br /&gt;
 NYT  A&lt;br /&gt;
  0   3&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U jednom programu treba modelirati odnose dugovanja i potraživanja između n firmi.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti odgovarajuću logičku strukturu i detaljno opisati njene osobine.&lt;br /&gt;
# Predložiti i obrazložiti odgovarajaću memorijsku reprezentaciju ove strukture ako je potrebno optimizovati operaciju izračunavanja ukupnog iznosa dugovanja prema nekoj firmi, kao i određivanje njenog najvećeg dužnika.&lt;br /&gt;
# Napisati pseudokod funkcije koja za zadatu firmu vraća ukupna iznos dugovanja koja ona potražuje.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Graf koji nam je u ovom slučaju potreban jeste težinski usmeren graf u kom čvorovi predstavljaju firme a grane predstavljaju dugovanja, gde grana težine w od čvora A do čvora B označava da firma A duguje firmi B iznos od w jedinica valute. Operacije koje nad njim moraju biti realizovane jesu dodavanje novog čvora i povezivanje dva čvora.&lt;br /&gt;
# Optimalna memorijska reprezentacija jeste preko inverzne liste susednosti, tj. niza dužine n koji sadrži pokazivače ka ulančanim listama u kojima se nalaze svi čvorovi koji su povezani sa trenutnim čvorom. Težine grana se mogu čuvati ili u samim čvorovima ulančane liste ili u odvojenoj matrici w gde w[i, j] označava težinu grane od i ka j i može biti postavljena na ∞ ukoliko ta grana ne postoji.&lt;br /&gt;
#: Operacija izračunavanja ukupnog iznosa dugovanja može se realizovati prolaskom kroz listu susednosti i sabiranjem svih težina grana koje ti čvorovi čine s zadatim čvorom, a može se i izmeniti struktura tako da se u zaglavlju lista susednosti čuva ukupno dugovanje bez da se poveća složenost neke druge operacije.&lt;br /&gt;
#: Operacija određivanja najvećeg dužnika može se isto realizovati linearnim prolaskom kroz listu koji čuva najvećeg dužnika i najveći dug. Dodatna optimizacija može se postići time što se povezane liste pretvore u prioritetne redove što operaciji povezivanja dva čvora povećava složenost sa konstantne na logaritamsku ali operaciji pronalaženja najvećeg dužnika smanjuje složenost sa linearne na konstantnu, za šta smo i optimizovali.&lt;br /&gt;
# U implementaciji ispod smatra se da optimizacije pomenute iznad nisu primenjene (jer bi to malo obesmislilo algoritam). Takođe se smatra da su težine grana čuvane u matrici težina w.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DEBT(G, i)&lt;br /&gt;
total_debt = 0&lt;br /&gt;
p = first(e[i])&lt;br /&gt;
while p ≠ nil do&lt;br /&gt;
    total_debt = total_debt + w[i, value(p)]&lt;br /&gt;
    p = next(p)&lt;br /&gt;
end_while&lt;br /&gt;
return total_debt&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A2_2017&amp;diff=7792</id>
		<title>АСП1/К2 2017</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A2_2017&amp;diff=7792"/>
		<updated>2024-09-13T00:09:01Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_K2_1617.pdf Zadaci na sajtu predmeta]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu iterativnu funkciju koja određuje širinu binarnog stabla na čiji koren pokazuje pokazivač &#039;&#039;root&#039;&#039;. Širina stabla se definiše kao najveća širina svih njegovih nivoa. Funkcija treba da ispiše sve čvorove na nivou najveće širine i vrati određenu širinu. Dozvoljena je upotreba gotovih linearnih struktura podataka&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
BIN TREE WIDTH(root)&lt;br /&gt;
curr_width = max_width = 0&lt;br /&gt;
tail = head = GETNODE(root)&lt;br /&gt;
next(head) = GETNODE(nil)&lt;br /&gt;
head = next(head)&lt;br /&gt;
max_level = curr_level = tail&lt;br /&gt;
t = nil&lt;br /&gt;
while tail ≠ nil do&lt;br /&gt;
    if value(tail) = nil then&lt;br /&gt;
        if curr_width &amp;gt; max_width then&lt;br /&gt;
            while max_level ≠ curr_level do&lt;br /&gt;
                t = max_level&lt;br /&gt;
                max_level = next(max_level)&lt;br /&gt;
                FREENODE(t)&lt;br /&gt;
            end_while&lt;br /&gt;
            max_width = curr_width&lt;br /&gt;
        end_if&lt;br /&gt;
        curr_width = 0&lt;br /&gt;
        if tail ≠ head then&lt;br /&gt;
            curr_level = next(tail)&lt;br /&gt;
            next(head) = GETNODE(nil)&lt;br /&gt;
            head = next(head)&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        curr_width = curr_width + 1&lt;br /&gt;
        if left(value(tail)) ≠ nil then&lt;br /&gt;
            next(head) = GETNODE(left(value(tail)))&lt;br /&gt;
            head = next(head)&lt;br /&gt;
        end_if&lt;br /&gt;
        if right(value(tail)) ≠ nil then&lt;br /&gt;
            next(head) = GETNODE(right(value(tail)))&lt;br /&gt;
            head = next(head)&lt;br /&gt;
        end_if&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
while value(max_level) ≠ nil do&lt;br /&gt;
    OUTPUT(symbol(value(max_level)))&lt;br /&gt;
    t = max_level&lt;br /&gt;
    max_level = next(max_level)&lt;br /&gt;
    FREENODE(t)&lt;br /&gt;
end_while&lt;br /&gt;
while max_level ≠ nil do&lt;br /&gt;
    t = max_level&lt;br /&gt;
    max_level = next(max_level)&lt;br /&gt;
    FREENODE(t)&lt;br /&gt;
end_while&lt;br /&gt;
return max_width&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
GETNODE(value)&lt;br /&gt;
ALLOCATE(node)&lt;br /&gt;
next(node) = nil&lt;br /&gt;
value(node) = value&lt;br /&gt;
return node&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FREENODE(node)&lt;br /&gt;
DEALLOCATE(node)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se jedno binarno stablo.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Objasniti šta su eksterni čvorovi stabla i za zadato binarno stablo odrediti broj eksternih čvorova. Eksterne čvorove docrtati na zadatom stablu.&lt;br /&gt;
# Izvesti i objasniti vezu između broja eksternih čvorova binarnog stabla &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; i čvorova stabla &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
         A&lt;br /&gt;
      /     \&lt;br /&gt;
     C       D&lt;br /&gt;
    / \     / \&lt;br /&gt;
   B   ☐   E  ☐&lt;br /&gt;
  / \     / \&lt;br /&gt;
 ☐  ☐   ☐  F&lt;br /&gt;
           /  \&lt;br /&gt;
          ☐   ☐&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Eksterni čvorovi su imaginarni čvorovi na koje pokazuju nezauzeti pokazivači internih čvorova stabla. U ovom stablu gde je &amp;lt;math&amp;gt;n = 6&amp;lt;/math&amp;gt; ima ih 7.&lt;br /&gt;
# Po gornjoj definiciji, broj eksternih čvorova jednak je broju nezauzetih pokazivača internih čvorova. Broj svih pokazivača &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; je duplo veći od broja čvorova, jer svaki čvor ima dva pokazivača u binarnom stablu (&amp;lt;math&amp;gt;m = 2&amp;lt;/math&amp;gt;). Broj zauzetih pokazivača &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; jednak je broju grana jer jedna grana zauzima jedan pokazivač, a za broj grana znamo da je za jedan manji od broja čvorova. Odatle dobijamo:&lt;br /&gt;
#: &amp;lt;math&amp;gt;p = e + z = 2n&amp;lt;/math&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;z = n - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;e = p - z = 2n - n + 1 = n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Primenom LZW algoritma, prikazati postupak kodiranja poruke ANTANANARIVE, za dati početni sadržaj tabele simbola. Napisati kodiranu poruku i izgled tabele simbola nakon postupka kodiranja&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Kodirana sekvenca: &#039;&#039;&#039;0 1 2 7 10 3 4 5 6&#039;&#039;&#039;&lt;br /&gt;
* Tabela kodova:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Simbol&lt;br /&gt;
! Kôd&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| N&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| T&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| R&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| I&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| V&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| E&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| AN&lt;br /&gt;
| 7&lt;br /&gt;
|-&lt;br /&gt;
| NT&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| TA&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| ANA&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| ANAR&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| RI&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| IV&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| VE&lt;br /&gt;
| 14&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem dinamičkog &#039;&#039;Huffman&#039;&#039; algoritma dekodirati sledeću poruku 00001010010001101101 ako je poznato da su simbolima A, B i C dodeljeni kodovi fiksne dužine 00, 01 i 10 respektivno. Za dobijenu sekvencu karaktera predložiti njihov drugačiji raspored takav da se pri kodiranju izmenjene sekvence dobije što veća ušteda u memoriji (kraći kod). Izbor obrazložiti.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Dekodovana poruka: &#039;&#039;&#039;ABBCCAA&#039;&#039;&#039;&lt;br /&gt;
* Dinamičko &#039;&#039;Huffman&#039;&#039; stablo:&lt;br /&gt;
   7&lt;br /&gt;
  / \&lt;br /&gt;
 A   4&lt;br /&gt;
 3  / \&lt;br /&gt;
   2   C&lt;br /&gt;
  / \  2&lt;br /&gt;
 NYT B&lt;br /&gt;
  0  2&lt;br /&gt;
* Predložena sekvenca: &#039;&#039;&#039;AAABBCC&#039;&#039;&#039; (kodirano sa &#039;&#039;&#039;00 1 1 001 01 0010 001&#039;&#039;&#039;, odnosno četiri koda manje)&lt;br /&gt;
* Obrazloženje: Očigledno je da slova A ima najviše u sekvenci i da se ono treba kodirati sa najmanje bitova. Umesto da redom ubacujemo kodove i očekujemo da se &amp;quot;bore&amp;quot; za zauzimanje mesta koje se kodira sa najmanje bitova najlogičnije je da ih postavimo u poziciju u kojoj će biti kodirani sa najlogičnijim brojem bitova. U ovom slučaju to je 1 bit za A, 2 bita za B i 3 bita za C.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ako za neko binarno stablo preorder obilazak daje poredak NMCOLAGFBDPRSHQ, a inorder obilazak COALGMBFNPHSRQD, rekonstruisati zadatog stabla.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
         N&lt;br /&gt;
     /       \&lt;br /&gt;
    M         D&lt;br /&gt;
  /   \      /&lt;br /&gt;
 C     F    P&lt;br /&gt;
  \   /      \&lt;br /&gt;
   O B        R&lt;br /&gt;
    \        / \&lt;br /&gt;
     L      S   Q&lt;br /&gt;
    / \    /&lt;br /&gt;
   A   G  H&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je binarno stablo na čiji koren pokazuje pokazivač &#039;&#039;root&#039;&#039;. Treba pronaći čvor koji je &#039;&#039;k&#039;&#039;-ti po &#039;&#039;preorder&#039;&#039; poretku, ali tako da se zapravo obiđe što manje čvorova.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Dozvoljeno je uvođenje jednog dodatnog polja u čvor stabla, pored postojećih polja &#039;&#039;left&#039;&#039; i &#039;&#039;right&#039;&#039;, radi što efikasnijeg iterativnog algoritma. Ukratko objasniti svrhu tog polja i algoritam za nalaženje &#039;&#039;k&#039;&#039;-tog čvora.&lt;br /&gt;
# Napisati u pseudokodu funkciju koja vraća pokazivač na &#039;&#039;k&#039;&#039;-ti čvor po &#039;&#039;preorder&#039;&#039; poretku na što je moguće efikasniji način.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Uvodimo polje kojem nam govori koliko se u levom podstablu tog čvora nalazi čvorova. Na taj način možemo da, kad dođemo do nekog čvora, odlučimo da li dalje idemo u njegovo levo ili desno podstablo u zavisnosti od toga da li je broj čvorova u levom podstablu veći ili manji od trenutnog broja traženih čvorova. Na početku procesiranja svakog čvora smanjujemo trenutno traženi broj čvorova i vraćamo trenutni čvor ukoliko je jednak 1.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PREORDER K NODE(root, k)&lt;br /&gt;
next = root&lt;br /&gt;
n = k&lt;br /&gt;
loop&lt;br /&gt;
    n = n - 1&lt;br /&gt;
    if n = 0 then&lt;br /&gt;
        return next&lt;br /&gt;
    end_if&lt;br /&gt;
    if n ≤ left_size(next) then&lt;br /&gt;
        next = left(next)&lt;br /&gt;
    else&lt;br /&gt;
        next = right(next)&lt;br /&gt;
        n = n - left_size(next)&lt;br /&gt;
    end_if&lt;br /&gt;
end_loop&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je odgovarajuće binarno stablo dobijeno konverzijom stabla višeg reda:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti kako u stablo ugraditi informaciju koja omogućava kretanje uz stablo od listova ka korenu.&lt;br /&gt;
# Na osnovu gornjeg predloga napisati funkciju koja za čvor sa zadatom adresom &#039;&#039;adr&#039;&#039; vraća njegov nivo u stablu. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Možemo da, nalik povezanim stablima, uvedemo &#039;&#039;rf&#039;&#039; bit koji će biti postavljen na 1 ukoliko desni pokazivač pokazuje na brata trenutnog čvora ili postavljen na 0 ukoliko pokazuje na prvog brata svog roditelja, i zatim sve neiskorišćene desne pokazivače (osim korena) povežemo na prvu braću svojih roditelja. Na taj način svi čvorovi jednog nivoa imaće pristup svim čvorovima narednog nivoa.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
NODE LEVEL(adr)&lt;br /&gt;
level = 1&lt;br /&gt;
next = adr&lt;br /&gt;
while right(next) ≠ nil do&lt;br /&gt;
    if rf(next) = 0 then&lt;br /&gt;
        level = level + 1&lt;br /&gt;
    end_if&lt;br /&gt;
    next = right(next)&lt;br /&gt;
end_while&lt;br /&gt;
return level&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na kraju svake knjige postoji lista referenci na druge knjige.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti memorijsku predstavu grafa koji predstavlja referenciranje knjiga tako da je olakšano nalaženje broja referenci na neku knjigu.&lt;br /&gt;
# Na osnovu gornjeg predloga napisati funkciju koja za zadatu knjigu nalazi broj referenci na nju.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Graf koji nam je potreban je netežinski usmeren graf u kojem čvorovi predstavljaju knjige a grane reference na knjige, gde grana od A ka B označava da knjiga A sadrži referencu na knjigu B. Optimalna memorijska predstava bi bila preko inverzne liste susednosti, gde je dodatna optimizacija čuvanje dužine te liste u njenom zaglavlju. Pseudokod ispod ne računa tu optimizaciju:&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
REF COUNT(k)&lt;br /&gt;
ref_number = 0&lt;br /&gt;
p = IAL[k]&lt;br /&gt;
while p ≠ nil do&lt;br /&gt;
    ref_number = ref_number + 1&lt;br /&gt;
    p = next(p)&lt;br /&gt;
end_while&lt;br /&gt;
return ref_number&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A2_2016&amp;diff=7791</id>
		<title>АСП1/К2 2016</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A2_2016&amp;diff=7791"/>
		<updated>2024-09-13T00:08:46Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/SI1AS1_K2_1516.pdf Zadaci]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Na slici je dato jedno nekompletno prikazano binarno stablo (desno. Ukoliko &#039;&#039;preorder&#039;&#039; obilazak takvog stabla daje poredak čvorova ACBDFE, nacrtati sve moguće izglede ovog stabla.&lt;br /&gt;
    A&lt;br /&gt;
  /   \&lt;br /&gt;
 C     ...&lt;br /&gt;
  \&lt;br /&gt;
   B&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pogledajmo najpre obilazak&lt;br /&gt;
&#039;&#039;&#039;A&#039;&#039;&#039; &#039;&#039;CB&#039;&#039; &#039;&#039;DFE&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Levi deo je kompletan i D mora biti koren desnog podstabla. Odatle dolaze kombinacije:&lt;br /&gt;
    A          A          A          A          A&lt;br /&gt;
  /   \      /   \      /   \      /   \      /   \&lt;br /&gt;
 C     D    C     D    C     D    C     D    C     D&lt;br /&gt;
  \   / \    \   /      \   /      \     \    \     \&lt;br /&gt;
   B F   E    B F        B F        B     F    B     F&lt;br /&gt;
               /            \              \        /&lt;br /&gt;
              E              E              E      E&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu funkciju koja u binarnom stablu na čiji koren pokazuje pokazivač &#039;&#039;root&#039;&#039; utvrđuje da li postoji čvor čija pozicija u stablu (u odnosu na koren) je simetrična u odnosu na poziciju čvora na koji pokazuje pokazivač &#039;&#039;node&#039;&#039;. Smatrati da svaki čvor binarnog stabla pored  informacionog sadržaja sadrži pokazivače na levo i desno podstablo i pokazivač na roditeljski čvor.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Rešenje se sastoji od toga da se vratimo unazad, pamteći put, i onda silazimo opet ali obrnutim putem. Ukoliko se isprazni ulančana lista (koja glumi stek), to znači da postoji simetrični član.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CHECK_SYMMETRIC(root, node)&lt;br /&gt;
path = nil&lt;br /&gt;
step = nil&lt;br /&gt;
parent = nil&lt;br /&gt;
p = node&lt;br /&gt;
while p ≠ root do&lt;br /&gt;
    step = GETNODE&lt;br /&gt;
    parent = parent(p)&lt;br /&gt;
    if left(parent) = p then&lt;br /&gt;
        info(step) = 0&lt;br /&gt;
    else&lt;br /&gt;
        info(step) = 1&lt;br /&gt;
    end_if&lt;br /&gt;
    p = parent&lt;br /&gt;
    next(step) = path&lt;br /&gt;
    path = step&lt;br /&gt;
end_while&lt;br /&gt;
while p ≠ nil do&lt;br /&gt;
    if path = nil then&lt;br /&gt;
        return true&lt;br /&gt;
    end_if&lt;br /&gt;
    if info(path) = 0 then&lt;br /&gt;
        p = right(p)&lt;br /&gt;
    else&lt;br /&gt;
        p = left(p)&lt;br /&gt;
    end_if&lt;br /&gt;
    step = path&lt;br /&gt;
    path = next(path)&lt;br /&gt;
    FREENODE(step)&lt;br /&gt;
end_while&lt;br /&gt;
return false&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dekodovati poruku 0 1 3 3 4 5 4 9 primenom LZW algoritma, za dati početni sadržaj tabele simbola.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
* Dekodovana poruka: ABABABBAABABABAB&lt;br /&gt;
* Tablica kodova:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Simbol&lt;br /&gt;
! Kôd&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| AB&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| BA&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| ABA&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| ABB&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| BAA&lt;br /&gt;
| 7&lt;br /&gt;
|-&lt;br /&gt;
| ABAB&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| BAB&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Ukoliko je usmereni graf sa &#039;&#039;n&#039;&#039; čvorova predstavljen listom susednosti, napisati u pseudokodu funkcije za izračunavanje ulaznog i izlaznog stepena zadatog čvora &#039;&#039;i&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Rešenje zadatka je teorijski opisano na 159. strani knjige. Polazi se od pretpostavke da G predstavlja niz ulančanih lista, pa se sa G[i] uzima lista susednosti čvora i.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
VERTEX IN DEG(G, n, i)&lt;br /&gt;
in_deg = 0&lt;br /&gt;
for k = 1 to n do &lt;br /&gt;
   curr = next(G[k])&lt;br /&gt;
   while (curr ≠ nil) do&lt;br /&gt;
      if (info(curr) = i) then&lt;br /&gt;
          in_deg = in_deg + 1&lt;br /&gt;
      end_if&lt;br /&gt;
      curr = next(curr)&lt;br /&gt;
   end_while&lt;br /&gt;
end_for&lt;br /&gt;
return in_deg&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
VERTEX OUT DEG(G, n, i)&lt;br /&gt;
out_deg = 0&lt;br /&gt;
curr = next(G[i])&lt;br /&gt;
while (curr ≠ nil) do&lt;br /&gt;
   out_deg = out_deg + 1&lt;br /&gt;
   curr = next(curr)&lt;br /&gt;
end_while&lt;br /&gt;
return out_deg&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Korišćenjem dinamičkih Huffman-ovih kodova, kodirati sekvencu simbola CBCBDAAABABA, ako se simboli A, B, C i D kodovima fiksne dužine kodiraju sa po dva bita 00, 01, 10, 11, respektivno&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
[[{{ns:6}}:ASP1 K2 2016 zadatak 5 postupak.jpg|thumb|right|Postupak rešavanja petog zadatka.]]&lt;br /&gt;
Kodirana poruka glasi: 10 001 1 01 0011 10000 1001 01 01 11 10 0.&lt;br /&gt;
&lt;br /&gt;
Ilustracija postupka se može videti na slici desno.&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je binarno stablo &#039;&#039;B&#039;&#039;, na čiji koren pokazuje pokazivač &#039;&#039;root&#039;&#039;. Stablo &#039;&#039;B&#039;&#039; dobijeno je konverzijom m-arnog stabla &#039;&#039;T&#039;&#039; u odgovarajuće binarno. Napisati u pseudokodu &#039;&#039;&#039;iterativnu&#039;&#039;&#039; funkciju koja određuje red stabla T.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Funkcija koristi red za čekanje kao dodatnu strukturu pri implementaciji. U red se ređaju najlevlji sinovi, a next ide desno, po braći, i broji koliko se čvorova nalazi povezano desno za dati čvor (to su mu upravo njegova braća). Izlaz funkcije biće maksimalni broj braće pri nekom od prolazaka, što i jeste red stabla.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
TREE ORDER BIN(root)&lt;br /&gt;
INIT_QUEUE(Q)&lt;br /&gt;
m = 0&lt;br /&gt;
next = root&lt;br /&gt;
INSERT(Q, next)&lt;br /&gt;
while (not QUEUE_EMPTY(Q)) do&lt;br /&gt;
    m_curr = 0&lt;br /&gt;
    next = DELETE(Q)&lt;br /&gt;
    while (next ≠ nil) do&lt;br /&gt;
        m_curr = m_curr + 1&lt;br /&gt;
        if (left(next) ≠ nil) then&lt;br /&gt;
            INSERT(Q, left(next))&lt;br /&gt;
        end_if&lt;br /&gt;
        next = right(next)&lt;br /&gt;
    end_while&lt;br /&gt;
    if (m_curr &amp;gt; m) then&lt;br /&gt;
        m = m_curr&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
return m&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Pitanja:&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Komentarisati strategiju obrade istih prioriteta u prioritetnom redu primenjenom u statičkom &#039;&#039;Huffman&#039;&#039;-ovom algoritmu.&lt;br /&gt;
# Kolika je minimalna, a kolika maksimalna dubina steka korišćenog u iterativnoj realizaciji &#039;&#039;preorder&#039;&#039; obilaska binarnog stabla sa n čvorova. Nacrtati takva stabla.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Bolje rezultate ćemo dobiti ako dajemo veći prioritet &amp;quot;starijim&amp;quot; članovima reda, tj. stablima manje visine. Biranjem nižih stabala dobijamo kraće kodove te je algoritam efikasniji.&lt;br /&gt;
# Dubina steka direktno zavisi od broja desnih podstabala u stablu. U prvom slučaju razmatramo stablo najveće dubine - degenerisano stablo. Kada su svi čvorovi redom sa leve strane u ovakvom stablu, na stek se stavlja samo koren i ništa drugo, te je za ovakvo stablo dovoljan stek veličine &#039;&#039;&#039;1&#039;&#039;&#039;, nezavisno od broja čvorova u stablu. Nasuprot tome, ako u stablo degenerisano na levo dodamo desne čvorove na svaki čvor, na stek će pri svakom posećivanju levog deteta biti dodato desno dete pa će na kraju posećivanja sve leve dece na steku biti sva desna deca, što je ukupno &amp;lt;math&amp;gt;\left\lfloor\frac{n}{2}\right\rfloor&amp;lt;/math&amp;gt; čvorova.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dato je binarno stablo &amp;lt;u&amp;gt;povezano&amp;lt;/u&amp;gt; po &#039;&#039;inorder&#039;&#039;-u. Napisati i objasniti pseudokod algoritma obilaska po &#039;&#039;&#039;inverznom&#039;&#039;&#039; &#039;&#039;inorder&#039;&#039; poretku.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti [[АСП1/К2 2018#6. zadatak|rešenje šestog zadatka sa drugog kolokvijuma 2018. godine]].&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A1_2020&amp;diff=7790</id>
		<title>АСП1/К1 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A1_2020&amp;diff=7790"/>
		<updated>2024-09-13T00:08:44Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_K1_1920.pdf Zadaci na sajtu predmeta.]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka je data funkcija &#039;&#039;random()&#039;&#039; koja vraća broj 0 ili 1 sa podjednakom verovatnoćom. Objasniti i ilustrovati primerom kako bi se korišćenjem zadate funkcije implementirala funkcija koja vraća vrednost 0 sa verovatnoćom 25%, a sa 1 verovatnoćom od 75%.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
U okviru naše nove funkcije pozivamo funkciju random dva puta, i samo u jednom od četiri slučaja, na primer kada oba puta funkcija vrati nulu (00), naša nova funkcija vraća nulu, a za sve ostale slučajeve (01, 10, 11) vraća jedan. Na taj način je obezbeđeno da funkcija vraća 0 sa verovatnoćom 25%, a 1 sa verovatnoćom 75%.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
NEW RANDOM()&lt;br /&gt;
if (random() = 0) and (random() = 0) then&lt;br /&gt;
    return 0&lt;br /&gt;
else&lt;br /&gt;
    return 1&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka je dat stek &#039;&#039;s1&#039;&#039; na kome se nalaze celi brojevi. Korišćenjem dodatnog steka &#039;&#039;s2&#039;&#039;, transformisati sadržaj steka &#039;&#039;s1&#039;&#039; tako da on postane neopadajuće uređen niz. Smatrati da su operacije za rad sa stekom već implementirane.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ideja jeste da na steku &#039;&#039;s1&#039;&#039; imamo sortirani i nesortirani deo. Na početku svi elementi su u nesortiranom delu i određujemo dubinu steka i trenutni maksimum na njemu. Svakom narednom iteracijom sve elemente koji su manji od maksimuma prebacujemo na stek &#039;&#039;s2&#039;&#039;, dok sve maksimume izbacujemo sa steka, a zatim naknadno ubacujemo onoliko puta koliko su se pojavili. Na kraju, vraćamo sve ne-maksimalne elemente sa steka &#039;&#039;s2&#039;&#039; nazad u nesortirani deo steka &#039;&#039;s1&#039;&#039;, pritom ponovo određujući maksimalni element u nesortiranom delu. Proces se ponavlja dok ima elemenata u maksimalnom delu.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
SORT STACK(s1)&lt;br /&gt;
max = TOP(s1)&lt;br /&gt;
cnt = 0&lt;br /&gt;
while (not STACK_IS_EMPTY(s1)) do&lt;br /&gt;
    x = POP(s1)&lt;br /&gt;
    if (x &amp;gt; max) then&lt;br /&gt;
        max = x&lt;br /&gt;
    end_if&lt;br /&gt;
    PUSH(s2, x)&lt;br /&gt;
    cnt = cnt + 1&lt;br /&gt;
end_while&lt;br /&gt;
while (not STACK_IS_EMPTY(s2)) do&lt;br /&gt;
    x = POP(s2)&lt;br /&gt;
    PUSH(s1, x)&lt;br /&gt;
end_while&lt;br /&gt;
while (cnt &amp;gt; 0) do&lt;br /&gt;
    num = cnt&lt;br /&gt;
    tmp = 0&lt;br /&gt;
    while (num &amp;gt; 0) do&lt;br /&gt;
        x = POP(s1)&lt;br /&gt;
        if (x &amp;lt; max) then&lt;br /&gt;
            PUSH(s2, x)&lt;br /&gt;
        else&lt;br /&gt;
            cnt = cnt - 1&lt;br /&gt;
            tmp = tmp + 1&lt;br /&gt;
        end_if&lt;br /&gt;
        num = num - 1&lt;br /&gt;
    end_while&lt;br /&gt;
    for i = 1 to tmp do&lt;br /&gt;
        PUSH(s1, max)&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end_for&lt;br /&gt;
    if (cnt &amp;gt; 0) then&lt;br /&gt;
        max = TOP(s2)&lt;br /&gt;
        while (not STACK_IS_EMPTY(s2)) do&lt;br /&gt;
            x = POP(s2)&lt;br /&gt;
            if (x &amp;gt; max) then&lt;br /&gt;
                max = x&lt;br /&gt;
            end_if&lt;br /&gt;
            PUSH(s1, x)&lt;br /&gt;
        end_while&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se retka matrica A veličine NxM. Matrica je data u vidu kružnih ulančanih listi sa zaglavljima R&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt; i C&amp;lt;sub&amp;gt;A&amp;lt;/sub&amp;gt;. Napisati efikasnu iterativnu funkciju u pseudokodu koja datu matricu pretvara u vektorski format sa tri posebna vektora R, C i V. Funkcija takođe treba da vrati broj nenultih elemenata u matrici. Smatrati da je za sve vektore inicijalno rezervisano dovoljno prostora.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
REFORMAT SPARSE MAT(A, N, M, Ra, Ca, R, C, V)&lt;br /&gt;
cnt = 1&lt;br /&gt;
for i = 1 to N do&lt;br /&gt;
    curr = next(Ra[i])&lt;br /&gt;
    R[i] = cnt&lt;br /&gt;
    while (curr ≠ Ra[i]) do&lt;br /&gt;
        C[cnt] = col(curr)&lt;br /&gt;
        V[cnt] = val(curr)&lt;br /&gt;
        cnt = cnt + 1&lt;br /&gt;
        curr = next(curr)&lt;br /&gt;
    end_while&lt;br /&gt;
end_for&lt;br /&gt;
R[N + 1] = cnt + 1&lt;br /&gt;
return cnt&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Transformisati izraz u infiksnom obliku&lt;br /&gt;
: A+C^(D-E!)!^F*B-C+G*H&lt;br /&gt;
u ekvivalentni izraz u postfiksnoj formi. Tabelu prioriteta operatora dopuniti odgovarajućim vrednostima, pri čemu je operacija faktorijel ! unarna operacija koja se grupiše sleva na desno i ima najveći prioritet od svih aritmetičkih operacija, a operacija ^ je operacija stepenovanja i grupiše se sdesna na levo. Transformaciju izraza prikazati po koracima.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! operator&lt;br /&gt;
! ul. pr !! stek pr. !! R&lt;br /&gt;
|-&lt;br /&gt;
! +, -&lt;br /&gt;
| 2 || 2 || -1&lt;br /&gt;
|-&lt;br /&gt;
! *, /&lt;br /&gt;
| 3 || 3 || -1&lt;br /&gt;
|-&lt;br /&gt;
! ^&lt;br /&gt;
| 5 || 4 || -1&lt;br /&gt;
|-&lt;br /&gt;
! !&lt;br /&gt;
| 6 || 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
! (&lt;br /&gt;
| 7 || 0 || -&lt;br /&gt;
|-&lt;br /&gt;
! )&lt;br /&gt;
| 1 || - || -&lt;br /&gt;
|}&lt;br /&gt;
Postfiksna forma datog infiksnog izraza koji se dobije primenom algoritma za konverziju iz infiksa u postfiks je:&lt;br /&gt;
: ACDE!-!F^^B*+C-GH*+&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je retko popunjena kvadratna matrica 2N x 2N. Nepodrazumevani elementi matrice smeštaju se u memoriji po vrstama. Indeksiranje kreće od 1, a svaki element matrice zauzima po 2 reči.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Izvesti adresnu funkciju za pristup proizvoljnom elementu matrice.&lt;br /&gt;
# Implementirati funkciju GET koja vraća vrednost traženog elementa koji odgovara indeksima &#039;&#039;i&#039;&#039; i &#039;&#039;j&#039;&#039; matrice &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &amp;lt;math&amp;gt;A_{ij} = \left\{&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
    A_{11} + ((i-1) \cdot 2+\left\lfloor{(j-1)/N)}\right\rfloor) \cdot 2 &amp;amp; i=j \lor i+j=2N+1 \\&lt;br /&gt;
    0 &amp;amp; i \neq j \land i+j \neq 2N+1&lt;br /&gt;
\end{array}\right.&amp;lt;/math&amp;gt;&lt;br /&gt;
# {{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
GET(A, i, j, N)&lt;br /&gt;
if (i = j or i + j = 2 * N + 1) then&lt;br /&gt;
    return A[i, j]&lt;br /&gt;
else &lt;br /&gt;
    return 0&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom azilu za životinje su zbrinuti psi, mačke i kanarinci. Kada neko želi da usvoji životinju, on se može izjasniti da li želi psa, mačku, kanarinca ili mu je svejedno. Nije moguće uputiti zahtev za određenom (pojedinačnom) životinjom već u skladu sa odabirom vrste, biće dodeljena ili životinja tražene vrste koja je najduže u azilu, ako takva postoji, ili životinja koja je tu duže od svih drugih. Takođe, azil prihvata nove životinje dok se ne popuni kapacitet.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Ukratko objasniti koja struktura se koristi za modelovanje azila i kako se ona održava sa dolaskom i usvajanjem životinja.&lt;br /&gt;
# Prikazati kako će struktura usvojena pod a) izgledati nakon usvajanja jednog psa, ako je prikazano trenutno stanje životinja u azilu po boksovima u kojima su smešteni. Pored vrste životinje, radi ilustracije, u zagradi se nalazi i trenutno vreme boravka životinje u azilu.&lt;br /&gt;
#: M(2) K(1) P(6) P(3) M(6) M(7) K(5) P(3)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
U nekom programu je potrebno prestaviti skup celih brojeva u opsegu od 0 do 999. Neka su u programskom jeziku koji se koristi na raspolaganju celobrojni tipovi na 4 bajta širine, a pokazivači zauzimaju 4 bajta. Objasniti na koje načine se ovakav skup može predstaviti sekvencijalnom i ulančanom reprezantacijom, a zatim odrediti prosečno zauzeće prostora u oba slučaja pod pretpostavkom da se u skupu u proseku nalazi 10 elemenata.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Napisati u pseudokodu implementaciju funkcije koja u dvostruko ulančanu listu celih brojeva na koju ukazuje pokazivač &#039;&#039;list&#039;&#039; ubacuje vrednost &#039;&#039;x&#039;&#039; ispred elementa na koji ukazuje pokazivač &#039;&#039;node&#039;&#039;. Voditi računa da lista ostane u potpuno konzistentnom stanju.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Pretpostavljamo da je &#039;&#039;node&#039;&#039; validan pokazivač na element koji se nalazi u listi &#039;&#039;list&#039;&#039;.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
INSERT BEFORE D(list, node, x)&lt;br /&gt;
new_node = Node(x)&lt;br /&gt;
new_node.prev = node.prev&lt;br /&gt;
new_node.next = node&lt;br /&gt;
if node.prev == null&lt;br /&gt;
   list = new_node&lt;br /&gt;
else&lt;br /&gt;
   node.prev.next = new_node&lt;br /&gt;
node.prev = new_node&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%90%D0%B2%D0%B3%D1%83%D1%81%D1%82_2021&amp;diff=7789</id>
		<title>АСП1/Август 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%90%D0%B2%D0%B3%D1%83%D1%81%D1%82_2021&amp;diff=7789"/>
		<updated>2024-09-13T00:08:42Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
Ovaj članak je rekreacija avgustovskog roka koji nije objavljen.&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je retka matrica koja je prikazana na slici. (Data je matrica npr. 5*6 sa 5 ili 6 random nenultih elemenata).&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Nacrtati izgled delova memorije u kojima se čuva ova retka matrica, ako se primenjuje &#039;&#039;Compressed Sparse Row&#039;&#039; način čuvanja.&lt;br /&gt;
# Napisati funkciju u pseudokodu koja na osnovu sačuvane &#039;&#039;Compressed Sparse Row&#039;&#039; reprezentacije matrice M i unetog broja &#039;&#039;i&#039;&#039; štampa sve nenulte elemente &#039;&#039;i&#039;&#039;-te vrste.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Navedite načine reprezentacije grafova i njihove prednosti i mane.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Potrebno je samo napisati i prokomentarisati tabelu 7.1 sa strane 161 iz udžbenika.&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Zadato je binarno stablo S i date su adrese dva čvora &#039;&#039;x&#039;&#039; i &#039;&#039;y&#039;&#039;. Napisati funkciju u pseudokodu koja pronalazi najnižeg zajedničkog pretka zadata dva čvora.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
LOWEST_COMMON_ANCESTOR(S,x,y)&lt;br /&gt;
return FIND(S,x,y)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
FIND(S,x,y)&lt;br /&gt;
if S == null&lt;br /&gt;
   return null&lt;br /&gt;
end_if&lt;br /&gt;
if S == x || S == y&lt;br /&gt;
   return S&lt;br /&gt;
end_if&lt;br /&gt;
left = FIND(S.left,x,y)&lt;br /&gt;
right = FIND(S.right,x,y)&lt;br /&gt;
if left ≠ null &amp;amp;&amp;amp; right ≠ null&lt;br /&gt;
   return S&lt;br /&gt;
else if left ≠ null&lt;br /&gt;
   return left&lt;br /&gt;
else if right ≠ null&lt;br /&gt;
   return right&lt;br /&gt;
else&lt;br /&gt;
   return null&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Potpuno formalno izvesti međusobnu zavisnost interne i eksterne dužine puta u binarnom stablu i kratko obrazložiti.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;math&amp;gt; PE = PI + 2n &amp;lt;/math&amp;gt;, gde je &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; broj čvorova u stablu&lt;br /&gt;
izvođenje indukcijom, kao u knjizi/na predavanju.&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Potrebno je realizovati aplikaciju za obradu slika. Korisniku je potrebno da za uneti set slika i unet set operacija omogućiti da se sve operacije izvrše nad svim unetim slikama. Navesti koje strukture je pogodno koristiti za čuvanje seta slika i seta operacija i objasniti zašto. Napisati funkciju u pseudokodu koja obrađuje uneti set slika unetim setom operacija, u skladu sa odabranim strukturama podataka.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&#039;&#039;Rešenje je krajnje trivijalno i ovde je navedeno jedno koje je bodovano maksimalnim brojem poena.&#039;&#039;&lt;br /&gt;
Za oba se može koristiti jednostruko ulančana lista (jer nije bitan redosled kojim će se operacije izvršavati jer će se svakako sve izvršiti na svim slikama), a ulančane liste su pogodno za lako dodavanje i brisanje elemenata.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PROCESS_IMAGES(images, operations)&lt;br /&gt;
S = head(images)&lt;br /&gt;
O = head(operations)&lt;br /&gt;
while s ≠ NIL do&lt;br /&gt;
    while o ≠ NIL do&lt;br /&gt;
        data(S) = (operation(O))(data(S))&lt;br /&gt;
    end_while&lt;br /&gt;
end_while&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&#039;&#039;&#039;Huffman-ov algoritam&#039;&#039;&#039;: Dat јe tekst sa 6 slova dužine 21 slovo. Odrediti izgled stabla dobijenog statičkim Huffman-om za ovaj tekst i uporediti prosečan broj bitova za čuvanje ovog teksta, kao i jednog slova u slučaju da se čuva podrazumevano i na osnovu ovog Huffman stabla. Frekvenciju slova zaključiti iz teksta.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Najobičniji statički Huffman za zadatim frekvencijama.&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je grad koji je modelovan usmerenim grafom, tako što su čvorovi lokacije u gradu (pekara, apoteka, biblioteka itd), a težine grana između čvorova vreme u minutima koje je potrebno da se peške dođe od izvorišne do odredišne lokacije. Dete želi da stigne od škole (čvor &#039;&#039;X&#039;&#039;) do kuće (čvor &#039;&#039;Y&#039;&#039;) najbrže moguće. Međutim, postoji opasan deo grada (čvor Z), koji nije bezbedan za decu i koji ona treba da izbegavaju. Napisati funkciju u pseudokodu koja na osnovu zadatog grafa &#039;&#039;G&#039;&#039; (nije data reprezentacija, rešenje treba da bude konceptualno), zadatih lokacija kuće i škole, &#039;&#039;Y&#039;&#039; i &#039;&#039;X&#039;&#039;, i opasnog dela grada &#039;&#039;Z&#039;&#039;, pronalazi najkraće vreme koje je detetu potrebno od škole do kuće.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Zadatak se rešava implementacijom Dijkstrinog algortima, tako što kada se u uzimanju čvorova redom po težinskoj udaljenosti od početnog dođe do &amp;quot;opasnog&amp;quot; čvora &#039;&#039;Z&#039;&#039;, za njega se upiše težina beskonačno i ta petlja preskoči sa &#039;&#039;&#039;continue&#039;&#039;&#039;. Na kraju se samo proveri dostižnost ciljnog čvora.&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je graf na slici (ima nekih 7-8 čvorova). Za dati graf uraditi topološko sortiranje i prikazati graf dobijen tako.&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
== 9. zadatak==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Detaljno opisati postupak za pronalaženje jako povezanih komponenti u grafu.&lt;br /&gt;
# Za graf sa slike (nekih 7-8 čvorova) po koracima primeniti algoritam za pronalaženje jako povezanih komponenti i rezultujući graf.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Videti zadatak iz [[АСП1/Јул 2020#2. zadatak 3|julskog roka 2020.]]&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Potrebno je čuvati neki skup brojeva koji će biti u opsegu između 1 i 100.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Uporediti sekvencijalnu i ulančanu reprezentaciju skupa i uporediti složenost operacija dodavanja elementa, brisanja elementa i provere pripadnosti elementa skupu za ove dve reprezentacije.&lt;br /&gt;
# Neka je dat skup (npr. 5, 14, 44, 45, 78, 98) prikazati jednu i drugu reprezenatciju nakon operacija (npr. dodavanje 7, dodavanje 46, dodavanje 97, brisanje 78).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kod sekvencijalne se alocira vektor S[1:100] i ukoliko je element &#039;&#039;X&#039;&#039; u skupu, u polje &#039;&#039;S&#039;&#039;[&#039;&#039;X&#039;&#039;] se upisuje 1, inače 0. Kod ulančane reprezentacije je najefikasnije čuvati ulančanu listu u rastućem ili opadajućem poretku. Dodavanje/brisanje u sekvencijalnoj se radi u O(1) tako što se samo proveri ili izmeni indeks u nizu. Kod ulančane reprezentacije je potrebno proći kroz listu do lokacije na koju treba umetnuti/obrisati element (po rastućem ili opadajućem poretku).&lt;br /&gt;
&lt;br /&gt;
[[Категорија:АСП1]]&lt;br /&gt;
[[Категорија:Рокови]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%88%D1%83%D0%BD_2020&amp;diff=7788</id>
		<title>АСП1/Јун 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%88%D1%83%D0%BD_2020&amp;diff=7788"/>
		<updated>2024-09-13T00:08:38Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_jun_2020.pdf Zadaci]&lt;br /&gt;
&lt;br /&gt;
== Prvi kolokvijum ==&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DEEP COPY(head)&lt;br /&gt;
p = head&lt;br /&gt;
q = r = new_node = nil&lt;br /&gt;
new_head = new_tail = nil&lt;br /&gt;
while p ≠ nil do&lt;br /&gt;
    new_node = GETNODE&lt;br /&gt;
    value(new_node) = value(p)&lt;br /&gt;
    other_p(new_node) = other_p(p)&lt;br /&gt;
    if new_head = nil then&lt;br /&gt;
        new_head = new_node&lt;br /&gt;
    else&lt;br /&gt;
        next(new_tail) = new_node&lt;br /&gt;
    end_if&lt;br /&gt;
    new_tail = new_node&lt;br /&gt;
    p = next(p)&lt;br /&gt;
end_while&lt;br /&gt;
p = head&lt;br /&gt;
q = new_head&lt;br /&gt;
while p ≠ nil do&lt;br /&gt;
    r = new_head&lt;br /&gt;
    while r ≠ nil do&lt;br /&gt;
        if other_p(r) = p then&lt;br /&gt;
            other_p(r) = q&lt;br /&gt;
        end_if&lt;br /&gt;
        r = next(r)&lt;br /&gt;
    end_while&lt;br /&gt;
    p = next(p)&lt;br /&gt;
    q = next(q)&lt;br /&gt;
end_while&lt;br /&gt;
return new_head&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Neka je datoj funkciji POST_TO_INF prosleđen neki aritmetički izraz u postfiksnom obliku (&#039;&#039;expression&#039;&#039;). 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.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
POST TO INF(expression)&lt;br /&gt;
stack = nil&lt;br /&gt;
expr1 = expr2 = nil&lt;br /&gt;
for c in expression do&lt;br /&gt;
    if IS_BINARY_OPERATOR(c) then&lt;br /&gt;
        expr1 = POP(stack)&lt;br /&gt;
        expr2 = POP(stack)&lt;br /&gt;
        PUSH(stack, &amp;quot;(&amp;quot; + expr1 + c + expr2 + &amp;quot;)&amp;quot;)&lt;br /&gt;
    else if IS_UNARY_OPERATOR(c) then&lt;br /&gt;
        expr1 = POP(stack)&lt;br /&gt;
        PUSH(stack, &amp;quot;(&amp;quot; + c + expr1 + &amp;quot;)&amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
        PUSH(stack, c)&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
return POP(stack)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PUSH(stack, value)&lt;br /&gt;
node = GETNODE&lt;br /&gt;
value(node) = value&lt;br /&gt;
next(node) = stack&lt;br /&gt;
stack = node&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
POP(stack, value)&lt;br /&gt;
if stack = nil then&lt;br /&gt;
    ERROR(Underflow)&lt;br /&gt;
else&lt;br /&gt;
    node = stack&lt;br /&gt;
    value = value(node)&lt;br /&gt;
    stack = next(stack)&lt;br /&gt;
    FREENODE(node)&lt;br /&gt;
    return value&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Vektorska implementacija prioritetnog reda&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Implementacija održavanjem uređenosti reda&lt;br /&gt;
# Implementacija markiranjem elemenata, bez umetanja preko markiranog elementa&lt;br /&gt;
# Implementacija markiranjem elemenata, sa umetanjem preko markiranog elementa&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; justify-content: space-between;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Implementacija održavanjem uređenosti reda&lt;br /&gt;
| 1 || 2 || 6 || 9 || 18 || 19 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 6 || 9 || 18 || 19 ||   ||&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 9 || 18 || 19 ||   ||   || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 9 || 15 || 18 || 19 ||   || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 9 || 15 || 17 || 18 || 19 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 9 || 11 || 15 || 17 || 18 || 19&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Implementacija markiranjem elemenata, bez umetanja preko markiranog elementa&lt;br /&gt;
| 2 || 18 || 19 || 1 || 9 || 6 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| 2 || 18 || 19 || X || 9 || 6 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| X || 18 || 19 || X || 9 || 6 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| X || 18 || 19 || X || 9 || 6 || 15&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| 18 || 19 || 9 || 6 || 15 || 17 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| 18 || 19 || 9 || 6 || 15 || 17 || 11&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Implementacija markiranjem elemenata, sa umetanjem preko markiranog elementa&lt;br /&gt;
| 2 || 18 || 19 || 1 || 9 || 6 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| 2 || 18 || 19 || X || 9 || 6 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| X || 18 || 19 || X || 9 || 6 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| 15 || 18 || 19 || X || 9 || 6 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| 15 || 18 || 19 || 17 || 9 || 6 || &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;7&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
| 15 || 18 || 19 || 17 || 9 || 6 || 11&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Neka se blok-dijagonalna matrica definiše kao kvadratna matrica &#039;&#039;A&#039;&#039; dimenzija &#039;&#039;n x n&#039;&#039; čiji su nenulti elementi smešteni samo u okviru blokova dimenzije &#039;&#039;k x k&#039;&#039; koji se nalaze na glavnoj dijagonali matrice, kao na slici i važi uslov &#039;&#039;n mod k = 0&#039;&#039;. Ukratko objasniti postupak smeštanja i izvesti adresnu funkciju pri pristupu proizvoljnom elementu matrice &#039;&#039;A[1:n, 1:n]&#039;&#039; smeštene &#039;&#039;&#039;po vrstama&#039;&#039;&#039;. Smatrati da se jedan element matrice smešta u tačno jednu memorijsku reč.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Primer matrice za &amp;lt;math&amp;gt;n = 6, k = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
! -&lt;br /&gt;
! 1 !! 2 !! 3 !! 4 !! 5 !! 6&lt;br /&gt;
|-&lt;br /&gt;
! 1&lt;br /&gt;
| X || X ||   ||   ||   ||&lt;br /&gt;
|-&lt;br /&gt;
! 2&lt;br /&gt;
| X || X ||   ||   ||   ||&lt;br /&gt;
|-&lt;br /&gt;
! 3&lt;br /&gt;
|   ||   || X || X ||   ||&lt;br /&gt;
|-&lt;br /&gt;
! 4&lt;br /&gt;
|   ||   || X || X ||   ||&lt;br /&gt;
|-&lt;br /&gt;
! 5&lt;br /&gt;
|   ||   ||   ||   || X || X&lt;br /&gt;
|-&lt;br /&gt;
! 6&lt;br /&gt;
|   ||   ||   ||   || X || X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
# Prvo gledamo u kojem se &amp;quot;bloku&amp;quot; na dijagonali nalazi element koji biramo. Taj blok možemo naći kao &amp;lt;math&amp;gt;i_b = \left\lfloor\frac{j-1}{k}\right\rfloor&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Nakon toga, možemo na osnovu indeksa bloka (koji kreće od 0) možemo naći &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; indekse za gornji levi ćošak tog bloka kao &amp;lt;math&amp;gt;i_{blok} = j_{blok} = i_b \cdot k + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
# 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.&lt;br /&gt;
## &#039;&#039;&#039;Prethodni blokovi:&#039;&#039;&#039; &amp;lt;math&amp;gt;A_{pret} = i_b \cdot k^2&amp;lt;/math&amp;gt; (u svakom bloku se nalazi po &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; elemenata)&lt;br /&gt;
## &#039;&#039;&#039;Iznad:&#039;&#039;&#039; &amp;lt;math&amp;gt;A_{izn} = (i - i_{blok}) k&amp;lt;/math&amp;gt; (u svakom redu nalazi se &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; elemenata)&lt;br /&gt;
## &#039;&#039;&#039;Levo:&#039;&#039;&#039; &amp;lt;math&amp;gt;A_{lev} = j - j_{blok}&amp;lt;/math&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;Konačna adresna funkcija:&#039;&#039;&#039; &amp;lt;math&amp;gt;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 =&amp;lt;/math&amp;gt;&lt;br /&gt;
#: &amp;lt;math&amp;gt;= 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&amp;lt;/math&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;Uslov:&#039;&#039;&#039; &amp;lt;math&amp;gt;|i - j| &amp;lt; k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Drugi kolokvijum ==&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
&#039;&#039;Postorder&#039;&#039; i &#039;&#039;preorder&#039;&#039; obilazak&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Da li je, pomoću datog &#039;&#039;preorder&#039;&#039; i &#039;&#039;postorder&#039;&#039; obilaska binarnog stabla moguće rekonstruisati jedinstveno binarno stablo? Detaljno obrazložiti odgovor.&lt;br /&gt;
# Ukoliko je &#039;&#039;preorder&#039;&#039; obilazak stabla &#039;&#039;&#039;VALDENJOM&#039;&#039;&#039;, a &#039;&#039;postorder&#039;&#039; obilazak stabla &#039;&#039;&#039;DLEAOMJNV&#039;&#039;&#039;, rekonstruisati stablo. Ukoliko postoji više mogućih stabala, dati izgled svakog od njih.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# 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 &#039;&#039;preorder&#039;&#039; i &#039;&#039;postorder&#039;&#039; obilaska tog stabla.&lt;br /&gt;
# 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.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
         V             V              V                V&lt;br /&gt;
      /     \       /     \        /     \          /     \&lt;br /&gt;
     A       N     A       N      A       N        A       N&lt;br /&gt;
    / \     /     / \     /      / \       \      / \       \&lt;br /&gt;
   L   E   J     L   E   J      L   E       J    L   E       J&lt;br /&gt;
  /       / \     \     / \    /           / \    \         / \&lt;br /&gt;
 D       O   M     D   O   M  D           O   M    D       O   M&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
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 &#039;&#039;&#039;može&#039;&#039;&#039; biti prefiks dužeg koda.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti i opisati strukturu stabla pogodnu za operaciju dekodovanja pojedinačnih simbola poruke.&lt;br /&gt;
# Implementirati funkciju DECODE_MORSE koja na osnovu strukture predložene pod a) dekodira neku zadatu poruku. Poruka je prosleđena kao argument funkcije (&#039;&#039;msg&#039;&#039;) i predstavlja nisku crtica i tacaka. Smatrati da su kodirana slova odvojena blanko znakovima.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
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.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DECODE MORSE(msg)&lt;br /&gt;
i = 0&lt;br /&gt;
new_msg = &amp;quot;&amp;quot;&lt;br /&gt;
while msg[i] ≠ 0 do&lt;br /&gt;
    p = root&lt;br /&gt;
    while (msg[i] ≠ &#039; &#039;) and (p ≠ nil) do&lt;br /&gt;
        if msg[i] = &#039;.&#039; then&lt;br /&gt;
            p = left(p)&lt;br /&gt;
        else if msg[i] = &#039;-&#039; then&lt;br /&gt;
            p = right(p)&lt;br /&gt;
        else&lt;br /&gt;
            ERROR(Invalid code)&lt;br /&gt;
        end_if&lt;br /&gt;
        i = i + 1&lt;br /&gt;
    end_while&lt;br /&gt;
    i = i + 1&lt;br /&gt;
    if (p = nil) or (sign(p) = 0) then&lt;br /&gt;
        ERROR(Invalid code)&lt;br /&gt;
    end_while&lt;br /&gt;
    new_msg = new_msg + sign(p)&lt;br /&gt;
end_while&lt;br /&gt;
return new_msg&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Primenom LZW algoritma &#039;&#039;&#039;prikazati postupak&#039;&#039;&#039; kodiranja znakovnog niza BIBBIDIBOBBIDIBOO, ako je data početna tabela sa kodovima simbola. Napisati kodiranu poruku i izgled tabele simbola nakon postupka kodiranja.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
Krajnje kodirano: &#039;&#039;&#039;0204153628033&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; justify-content: space-between;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tablica LZW kodova (prva četiri data u postavci)&lt;br /&gt;
! Slovo&lt;br /&gt;
! Kod&lt;br /&gt;
|-&lt;br /&gt;
| B || 0&lt;br /&gt;
|-&lt;br /&gt;
| D || 1&lt;br /&gt;
|-&lt;br /&gt;
| I || 2&lt;br /&gt;
|-&lt;br /&gt;
| O || 3&lt;br /&gt;
|-&lt;br /&gt;
| BI || 4&lt;br /&gt;
|-&lt;br /&gt;
| IB || 5&lt;br /&gt;
|-&lt;br /&gt;
| BB || 6&lt;br /&gt;
|-&lt;br /&gt;
| BID || 7&lt;br /&gt;
|-&lt;br /&gt;
| DI || 8&lt;br /&gt;
|-&lt;br /&gt;
| IBO || 9&lt;br /&gt;
|-&lt;br /&gt;
| OB || 10&lt;br /&gt;
|-&lt;br /&gt;
| BBI || 11&lt;br /&gt;
|-&lt;br /&gt;
| ID || 12&lt;br /&gt;
|-&lt;br /&gt;
| DIB || 13&lt;br /&gt;
|-&lt;br /&gt;
| BO || 14&lt;br /&gt;
|-&lt;br /&gt;
| OO || 15&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Postupak dekodovanja&lt;br /&gt;
! Unos&lt;br /&gt;
! String&lt;br /&gt;
! Ispis&lt;br /&gt;
! Dodaje se u tabelu&lt;br /&gt;
|-&lt;br /&gt;
| B || B ||  || &lt;br /&gt;
|-&lt;br /&gt;
| I || BI || 0 (B) || BI&lt;br /&gt;
|-&lt;br /&gt;
| B || IB || 2 (I) || IB&lt;br /&gt;
|-&lt;br /&gt;
| B || BB || 0 (B) || BB&lt;br /&gt;
|-&lt;br /&gt;
| I || BI ||  || &lt;br /&gt;
|-&lt;br /&gt;
| D || BID || 4 (BI) || BID&lt;br /&gt;
|-&lt;br /&gt;
| I || DI || 1 (D) || DI&lt;br /&gt;
|-&lt;br /&gt;
| B || IB ||  || &lt;br /&gt;
|-&lt;br /&gt;
| O || IBO || 5 (IB) || IBO&lt;br /&gt;
|-&lt;br /&gt;
| B || OB || 3 (O) || OB&lt;br /&gt;
|-&lt;br /&gt;
| B || BB ||  || &lt;br /&gt;
|-&lt;br /&gt;
| I || BBI || 6 (BB) || BBI&lt;br /&gt;
|-&lt;br /&gt;
| D || ID || 2 (I) || ID&lt;br /&gt;
|-&lt;br /&gt;
| I || DI ||  || &lt;br /&gt;
|-&lt;br /&gt;
| B || DIB || 8 (DI) || DIB&lt;br /&gt;
|-&lt;br /&gt;
| O || BO || 0 (B) || BO&lt;br /&gt;
|-&lt;br /&gt;
| O || OO || 3 (O) || OO&lt;br /&gt;
|-&lt;br /&gt;
| || O || 3 (O) ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Dužine puteva u stablu&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Formalno definisati i objasniti internu, eksternu i težinsku eksternu dužinu puta u binarnom stablu.&lt;br /&gt;
# 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.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
* Interna dužina puta je zbir dužina puteva od korena do svakog internog čvora.&lt;br /&gt;
* Eksterna dužina puta je zbir dužina puteva od korena do svakog eksternog čvora.&lt;br /&gt;
* Eksterna težinska dužina puta je zbir proizvoda dužina puteva od korena do svakog eksternog čvora i težine tih eksternih čvorova.&lt;br /&gt;
Za potrebe ovog algoritma smatra se da su eksterni čvorovi izjednačeni sa listovima.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CALC EXT WPL(root)&lt;br /&gt;
QUEUE_INIT(Q_nodes)&lt;br /&gt;
QUEUE_INIT(Q_levels)&lt;br /&gt;
INSERT(Q_nodes, root)&lt;br /&gt;
INSERT(Q_levels, 0)&lt;br /&gt;
node = nil&lt;br /&gt;
level = 0&lt;br /&gt;
pwe = 0&lt;br /&gt;
while not QUEUE_EMPTY(Q_nodes) do&lt;br /&gt;
    node = DELETE(Q_nodes)&lt;br /&gt;
    level = DELETE(Q_levels)&lt;br /&gt;
    if (left(node) = nil) and (right(node) = nil) then&lt;br /&gt;
        pwe = pwe + level * weight(node)&lt;br /&gt;
    end_if&lt;br /&gt;
    if left(node) ≠ nil then&lt;br /&gt;
        INSERT(Q_nodes, left(node))&lt;br /&gt;
        INSERT(Q_levels, level + 1)&lt;br /&gt;
    end_if&lt;br /&gt;
    if right(node) ≠ nil then&lt;br /&gt;
        INSERT(Q_nodes, right(node))&lt;br /&gt;
        INSERT(Q_levels, level + 1)&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
return pwe&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Treći kolokvijum ==&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Dat je usmeren, aciklični graf predstavljen pomoću matrice susednosti kod koga su čvorovi numerisani od 1 do &#039;&#039;n&#039;&#039;. 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.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
RELABEL(G, n)&lt;br /&gt;
topsort_length = 0&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    in_deg[i] = 0&lt;br /&gt;
    for j = 1 to n do&lt;br /&gt;
        if M[j, i] then&lt;br /&gt;
            in_deg[i] = in_deg[i] + 1&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    if in_deg[i] = 0 then&lt;br /&gt;
        topsort_length = topsort_length + 1&lt;br /&gt;
        topsort[topsort_length] = i&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    node = topsort[i]&lt;br /&gt;
    for j = 1 to n do&lt;br /&gt;
        if M[node, j] then&lt;br /&gt;
            in_deg[j] = in_deg[j] - 1&lt;br /&gt;
            if in_deg[j] = 0 then&lt;br /&gt;
                topsort_length = topsort_length + 1&lt;br /&gt;
                topsort[topsort_length] = j&lt;br /&gt;
            end_if&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
end_for&lt;br /&gt;
return topsort&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
[[{{ns:6}}:ASP1 jun 2020 zadatak 3.2 graf.svg|thumb|Graf iz postavke drugog zadatka.]]&lt;br /&gt;
&#039;&#039;Floyd&#039;&#039;-ov algoritam. Na slici je dat usmereni težinski graf.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predstaviti dati graf odgovarajućom matričnom reprezentacijom.&lt;br /&gt;
# Pronaći najkraća rastojanja među čvorovima upotrebom &#039;&#039;Floyd&#039;&#039;-ovog algoritma. Postupak prikazati po koracima.&lt;br /&gt;
# Na osnovu rezultat pod b) rekonstruisati najkraću putanju između čvorova &#039;&#039;b&#039;&#039; i &#039;&#039;d&#039;&#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
Rešenje stavke pod c je &#039;&#039;&#039;bfaced&#039;&#039;&#039;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrična reprezentacija grafa&lt;br /&gt;
! - !! a !! b !! c !! d !! e !! f&lt;br /&gt;
|-&lt;br /&gt;
! a&lt;br /&gt;
| ∞ || 7 || 3 || 10 || 8 || ∞&lt;br /&gt;
|-&lt;br /&gt;
! b&lt;br /&gt;
| ∞ || ∞ || ∞ || 22 || ∞ || 1&lt;br /&gt;
|-&lt;br /&gt;
! c&lt;br /&gt;
| ∞ || ∞ || ∞ || 5 || 2 || ∞&lt;br /&gt;
|-&lt;br /&gt;
! d&lt;br /&gt;
| ∞ || ∞ || ∞ || ∞ || ∞ || 12&lt;br /&gt;
|-&lt;br /&gt;
! e&lt;br /&gt;
| ∞ || ∞ || ∞ || 1 || ∞ || ∞&lt;br /&gt;
|-&lt;br /&gt;
! f&lt;br /&gt;
| 6 || ∞ || ∞ || ∞ || ∞ || ∞&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap; justify-content: space-between;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;Floyd&#039;&#039;-ov algoritam za &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || 7 || 3 || 10 || 8 || ∞&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 22 || ∞ || 1&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 5 || 2 || ∞&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || ∞ || ∞ || 12&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 1 || ∞ || ∞&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 13 || 9 || 16 || 14 || ∞&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrica prethodnika za &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;Floyd&#039;&#039;-ov algoritam za &amp;lt;math&amp;gt;k = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || 7 || 3 || 10 || 8 || 8&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 22 || ∞ || 1&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 5 || 2 || ∞&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || ∞ || ∞ || 12&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 1 || ∞ || ∞&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 13 || 9 || 16 || 14 || 14&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrica prethodnika za &amp;lt;math&amp;gt;k = 2&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 1 || 1 || 2&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;Floyd&#039;&#039;-ov algoritam za &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || 7 || 3 || 8 || 5 || 8&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 22 || ∞ || 1&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 5 || 2 || ∞&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || ∞ || ∞ || 12&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 1 || ∞ || ∞&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 13 || 9 || 14 || 11 || 14&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrica prethodnika za &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 3 || 3 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 3 || 3 || 2&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;Floyd&#039;&#039;-ov algoritam za &amp;lt;math&amp;gt;k = 4&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || 7 || 3 || 8 || 5 || 8&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 22 || ∞ || 1&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 5 || 2 || 17&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || ∞ || ∞ || 12&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 1 || ∞ || 13&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 13 || 9 || 14 || 11 || 14&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrica prethodnika za &amp;lt;math&amp;gt;k = 4&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 3 || 3 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 3 || 3 || 2&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;Floyd&#039;&#039;-ov algoritam za &amp;lt;math&amp;gt;k = 5&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || 7 || 3 || 6 || 5 || 8&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 22 || ∞ || 1&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 3 || 2 || 15&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || ∞ || ∞ || 12&lt;br /&gt;
|-&lt;br /&gt;
| ∞ || ∞ || ∞ || 1 || ∞ || 13&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 13 || 9 || 12 || 11 || 14&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrica prethodnika za &amp;lt;math&amp;gt;k = 5&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 5 || 3 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 5 || 0 || 5&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 0 || 0 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 5 || 3 || 2&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;Floyd&#039;&#039;-ov algoritam za &amp;lt;math&amp;gt;k = 6&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 14 || 7 || 3 || 6 || 5 || 8&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 14 || 10 || 13 || 12 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 21 || 28 || 24 || 3 || 2 || 15&lt;br /&gt;
|-&lt;br /&gt;
| 18 || 25 || 21 || 24 || 23 || 12&lt;br /&gt;
|-&lt;br /&gt;
| 19 || 26 || 22 || 1 || 24 || 13&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 13 || 9 || 12 || 11 || 14&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrica prethodnika za &amp;lt;math&amp;gt;k = 6&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 0 || 0 || 5 || 3 || 2&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 6 || 6 || 6 || 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 6 || 6 || 5 || 0 || 5&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 6 || 6 || 6 || 6 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 6 || 6 || 0 || 6 || 4&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || 5 || 3 || 2&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
[[{{ns:6}}:ASP1 jun 2020 zadatak 3.3 graf.svg|thumb|Graf iz postavke trećeg zadatka.]]&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
[[{{ns:6}}:ASP1 jun 2020 zadatak 3.3 rezidualni graf.svg|thumb|Rezidualni graf za treći zadatak.]]&lt;br /&gt;
Mogući putevi povećanog protoka:&lt;br /&gt;
* SCBT (2)&lt;br /&gt;
* SACBT (2)&lt;br /&gt;
* SDECBT (2)&lt;br /&gt;
* SADECBT (2)&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Neka se posmatra se neusmeren netežinski graf.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# 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.&lt;br /&gt;
# 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.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
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.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
IS CYCLIC(G)&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    visited[i] = 0&lt;br /&gt;
end_for&lt;br /&gt;
QUEUE_INIT(Q_nodes)&lt;br /&gt;
QUEUE_INIT(Q_parents)&lt;br /&gt;
INSERT(Q_nodes, 1)&lt;br /&gt;
INSERT(Q_parents, 0)&lt;br /&gt;
node = parent = 0&lt;br /&gt;
while not QUEUE_EMPTY(Q_nodes) do&lt;br /&gt;
    node = DELETE(Q_nodes)&lt;br /&gt;
    parent = DELETE(Q_parents)&lt;br /&gt;
    for (node, i) ∈ E do&lt;br /&gt;
        if i = parent then&lt;br /&gt;
            continue&lt;br /&gt;
        end_if&lt;br /&gt;
        if visited[i] then&lt;br /&gt;
            return true&lt;br /&gt;
        end_if&lt;br /&gt;
        INSERT(Q_nodes, i)&lt;br /&gt;
        INSERT(Q_parents, node)&lt;br /&gt;
        visited[i] = true&lt;br /&gt;
    end_for&lt;br /&gt;
end_while&lt;br /&gt;
return false&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%88%D1%83%D0%BB_2020&amp;diff=7787</id>
		<title>АСП1/Јул 2020</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%88%D1%83%D0%BB_2020&amp;diff=7787"/>
		<updated>2024-09-13T00:08:28Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_jul_2020.pdf Zadaci]&lt;br /&gt;
&lt;br /&gt;
== Prvi kolokvijum ==&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
{{delimično rešeno}}&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Potrebno je retku matricu sa slike predstaviti korišćenjem ulančanih lista na dva načina. Ukratko objasniti kako se to može postići i namenu svakog polja u zapisu kojim je predstavljen jedan element liste, a zatim prikazati i njihov sadržaj ako je podrazumevana vrednost 0 za oba načina.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Retka matrica sa slike&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 3 || 12 || 0 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 0 || 74 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 7 || 0 || 32 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || 2 || 15 || 0&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || 98 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Posmatra se stek implementiran dvostruko ulančanom listom sa zaglavljem, koje sadrži pokazivač na prvi element liste. Pored standardnih operacija, neophodno je podržati i efikasnu operaciju dohvatanja maksimalnog elementa na steku (u &#039;&#039;O(1)&#039;&#039;).&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Ako se u zaglavlju nalazi još jedan pokazivač na dodatnu listu, objasniti kako se ta dodatna lista može koristiti za implementaciju dodatne tražene operacije, bez gubitka efikasnosti standardnih operacija.&lt;br /&gt;
# Koristeći ideju opisanu pod a), napisati tražene operacije.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
Dohvatanje maksimalnog elementa u O(1) postižemo dodatnom listom koja čuva dotadašnji maksimalni element. Lista koja drži elemente se zove &#039;&#039;stack&#039;&#039;, a lista koja drži maksimalne elmente se zove &#039;&#039;max&#039;&#039;.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
PUSH(header, x)&lt;br /&gt;
if header = nil then&lt;br /&gt;
    return&lt;br /&gt;
end_if&lt;br /&gt;
t = GETNODE()&lt;br /&gt;
info(t) = x&lt;br /&gt;
next(t) = stack(header)&lt;br /&gt;
stack(header) = t&lt;br /&gt;
t = GETNODE()&lt;br /&gt;
if max(header) ≠ NIL and x &amp;lt; max(header) then&lt;br /&gt;
    info(t) = info(max(header))&lt;br /&gt;
else&lt;br /&gt;
    info(t) = x&lt;br /&gt;
end_if&lt;br /&gt;
next(t) = max(header)&lt;br /&gt;
max(header) = t&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
POP(header)&lt;br /&gt;
if header ≠ NIL and stack(header) ≠ NIL then&lt;br /&gt;
    t = stack(header)&lt;br /&gt;
    stack(header) = next(stack(header))&lt;br /&gt;
    value = info(t)&lt;br /&gt;
    FREENODE(t)&lt;br /&gt;
    t = max(header)&lt;br /&gt;
    max(header) = next(max(header))&lt;br /&gt;
    FREENODE(t)&lt;br /&gt;
    return value&lt;br /&gt;
end_if&lt;br /&gt;
return NIL&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
MAX(header)&lt;br /&gt;
return info(max(header))&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Transformisati izraz u infiksnom obliku A*(B+C)*(A-D!!)+F/G+K u ekvivalentni izraz u postfiksnoj formi. Tabelu prioriteta operatora dopuniti odgovarajućim vrednostima, pri čemu treba usvojiti standardne prioritete i grupisanje za operacije +,-,* i /. Operacija faktorijel ! unarna operacija koja se grupiše sleva na desno i ima najveći prioritet od svih aritmetičkih operacija. Transformaciju izraza prikazati po koracima.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operator&lt;br /&gt;
! Ulazni prioritet&lt;br /&gt;
! Stek prioritet&lt;br /&gt;
! Rang&lt;br /&gt;
|-&lt;br /&gt;
| +, - || 2 || 2 || -1&lt;br /&gt;
|-&lt;br /&gt;
| *, / || 3 || 3 || -1&lt;br /&gt;
|-&lt;br /&gt;
| !    || 5 || 4 || 0&lt;br /&gt;
|-&lt;br /&gt;
| (    || 6 || 1 || 0&lt;br /&gt;
|-&lt;br /&gt;
| )    || 0 || - || 0&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Simbol&lt;br /&gt;
! Stek&lt;br /&gt;
! Postfiksni izraz&lt;br /&gt;
! Rang&lt;br /&gt;
|-&lt;br /&gt;
| A ||  || A || 1&lt;br /&gt;
|-&lt;br /&gt;
| * || * || A || 1&lt;br /&gt;
|-&lt;br /&gt;
| ( || *( || A || 1&lt;br /&gt;
|-&lt;br /&gt;
| B || *( || AB || 2&lt;br /&gt;
|-&lt;br /&gt;
| + || *(+ || AB || 2&lt;br /&gt;
|-&lt;br /&gt;
| C || *(+ || ABC || 3&lt;br /&gt;
|-&lt;br /&gt;
| ) || * || ABC+ || 2&lt;br /&gt;
|-&lt;br /&gt;
| * || * || ABC+* || 1&lt;br /&gt;
|-&lt;br /&gt;
| ( || *( || ABC+* || 1&lt;br /&gt;
|-&lt;br /&gt;
| A || *( || ABC+*A || 2&lt;br /&gt;
|-&lt;br /&gt;
| - || *(- || ABC+*A || 2&lt;br /&gt;
|-&lt;br /&gt;
| D || *(- || ABC+*AD || 3&lt;br /&gt;
|-&lt;br /&gt;
| ! || *(-! || ABC+*AD || 3&lt;br /&gt;
|-&lt;br /&gt;
| ! || *(-!! || ABC+*AD || 3&lt;br /&gt;
|-&lt;br /&gt;
| ) || * || ABC+*AD!!- || 2&lt;br /&gt;
|-&lt;br /&gt;
| + || + || ABC+*AD!!-* || 1&lt;br /&gt;
|-&lt;br /&gt;
| F || + || ABC+*AD!!-*F || 2&lt;br /&gt;
|-&lt;br /&gt;
| / || +/ || ABC+*AD!!-*F || 2&lt;br /&gt;
|-&lt;br /&gt;
| G || +/ || ABC+*AD!!-*FG || 3&lt;br /&gt;
|-&lt;br /&gt;
| + || + || ABC+*AD!!-*FG/+ || 1&lt;br /&gt;
|-&lt;br /&gt;
| K || + || ABC+*AD!!-*FG/+K || 2&lt;br /&gt;
|-&lt;br /&gt;
| EOF ||  || &#039;&#039;&#039;ABC+*AD!!-*FG/+K+&#039;&#039;&#039; || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Neka se dvostrani red u pseudojeziku opisuje sledećim zapisom:&lt;br /&gt;
 deque = RECORD&lt;br /&gt;
     array, front, rear, size&lt;br /&gt;
 END&lt;br /&gt;
gde &#039;&#039;array&#039;&#039; predstavlja niz ograničenog kapaciteta &#039;&#039;size&#039;&#039;, a &#039;&#039;front&#039;&#039; i &#039;&#039;rear&#039;&#039; pokazivače početka i kraja reda. Indeksi u nizu počinju od 0.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Objasniti kako se dvostrani red može implementirati korišćenjem tehnike kružnog bafera. Navesti uslove punog i praznog reda.&lt;br /&gt;
# Napisati u pseudokodu implementaciju funkcija za umetanje na početak i na kraj dvostranog reda definisanog na prethodni način.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
Uslov punog reda: (rear + 1) % size = front&lt;br /&gt;
&lt;br /&gt;
Uslov praznog reda: front = rear&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
INSERT FRONT(deque, x)&lt;br /&gt;
if deque = NIL or (rear(deque) + 1) % size(deque) = front(deque) then&lt;br /&gt;
    return&lt;br /&gt;
front(deque) = (front(deque) - 1) % size(deque)&lt;br /&gt;
array(deque)[front(deque)] = x&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
INSERT REAR(deque, x)&lt;br /&gt;
if deque = NIL or (rear(deque) + 1) % size(deque) = front(deque) then&lt;br /&gt;
    return&lt;br /&gt;
rear(deque) = (rear(deque) + 1) % size(deque)&lt;br /&gt;
array(deque)[rear(deque)] = x&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Drugi kolokvijum ==&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Povezana binarna stabla&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Precizno definisati šta je povezano stablo i dati strukturu čvora takvog stabla, sa preciznim opisima svakog polja.&lt;br /&gt;
# Napisati u pseudokodu funkciju za uklanjanje čvora &#039;&#039;x&#039;&#039; iz povezanog binarnog stabla po &#039;&#039;inorder&#039;&#039; načinu obilaska, ako je poznato da čvor x nema levog sina.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
Povezano binarno stablo je stablo u kojem su neiskorišćeni pokazivači na levu i desnu decu iskorišćeni u svrhu lakšeg obilaska stabla nekim načinom obilaska. Struktura čvora takvog stabla ima sledeća polja:&lt;br /&gt;
* &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; — vrednost u čvoru stabla&lt;br /&gt;
* &amp;lt;code&amp;gt;left&amp;lt;/code&amp;gt; — pokazivač na levo dete ili prethodnika po redosledu obilaska&lt;br /&gt;
* &amp;lt;code&amp;gt;right&amp;lt;/code&amp;gt; — pokazivač na desno dete ili sledbenika po redosledu obilaska&lt;br /&gt;
* &amp;lt;code&amp;gt;lf&amp;lt;/code&amp;gt; — bit postavljen na 1 ukoliko &amp;lt;code&amp;gt;left&amp;lt;/code&amp;gt; pokazuje na levo dete i 0 ukoliko pokazuje na prethodnika po redosledu obilaska&lt;br /&gt;
* &amp;lt;code&amp;gt;rf&amp;lt;/code&amp;gt; — bit postavljen na 1 ukoliko &amp;lt;code&amp;gt;right&amp;lt;/code&amp;gt; pokazuje na desno dete i 0 ukoliko pokazuje na sledbenika po redosledu obilaska&lt;br /&gt;
U pseudokodu za tačku pod b, kako bi povezano stablo ostalo povezano, potrebno je da pronađemo prethodnika čvora &#039;&#039;x&#039;&#039; po &#039;&#039;inorder&#039;&#039;-u i prvog sledbenika čvora &#039;&#039;x&#039;&#039; po &#039;&#039;inorder&#039;&#039;-u koji se ne nalazi u njegovom podstablu, povežemo ih a sve ostale čvorove između oslobodimo.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
DELETE-T(x)&lt;br /&gt;
prethodnik = left(x)&lt;br /&gt;
sledbenik = right(x)&lt;br /&gt;
next_sledbenik = nil&lt;br /&gt;
while sledbenik ≠ nil do&lt;br /&gt;
    if lf(sledbenik) = 1 then&lt;br /&gt;
        if left(sledbenik) = x then&lt;br /&gt;
            break&lt;br /&gt;
        else&lt;br /&gt;
            next_sledbenik = left(sledbenik)&lt;br /&gt;
            while (next_sledbenik ≠ nil) and ((lf(next_sledbenik) = 1) or (left(next_sledbenik) = nil)) do&lt;br /&gt;
                 if left(next_sledbenik) = x then&lt;br /&gt;
                     break&lt;br /&gt;
                 end_if&lt;br /&gt;
                 next_sledbenik = left(next_sledbenik)&lt;br /&gt;
            end_while&lt;br /&gt;
            if (next_sledbenik ≠ nil) and (left(next_sledbenik) = x) then&lt;br /&gt;
                FREENODE(sledbenik)&lt;br /&gt;
                sledbenik = next_sledbenik&lt;br /&gt;
                break&lt;br /&gt;
            end_if&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        next_sledbenik = right(sledbenik)&lt;br /&gt;
    end_if&lt;br /&gt;
    FREENODE(sledbenik)&lt;br /&gt;
    sledbenik = next_sledbenik&lt;br /&gt;
end_while&lt;br /&gt;
if (prethodnik ≠ nil) and (rf(prethodnik) = 0) then&lt;br /&gt;
    right(prethodnik) = sledbenik&lt;br /&gt;
end_if&lt;br /&gt;
if sledbenik ≠ nil then&lt;br /&gt;
    left(sledbenik) = prethodnik&lt;br /&gt;
    lf(sledbenik) = 0&lt;br /&gt;
end_if&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Neka se posmatra binarno stablo čiji čvorovi sadrže cele brojeve. Napisati u pseudokodu iterativnu implementaciju funkcije CHECK_SUM koja proverava da li sadržaj svakog čvora-oca u stablu na čiji koren ukazuje pokazivač &#039;&#039;root&#039;&#039; predstavlja zbir sadržaja svih njegovih potomaka.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CHECK SUM(root)&lt;br /&gt;
p = root&lt;br /&gt;
STACK_INIT(S)&lt;br /&gt;
while p ≠ nil do&lt;br /&gt;
    PUSH(S, p)&lt;br /&gt;
    p = left(p)&lt;br /&gt;
end_while&lt;br /&gt;
while not STACK_EMPTY(S) do&lt;br /&gt;
    p = POP(S)&lt;br /&gt;
    if p &amp;gt; 0 then&lt;br /&gt;
        while left(p) ≠ nil do&lt;br /&gt;
            PUSH(S, -p)&lt;br /&gt;
            p = left(p)&lt;br /&gt;
        end_while&lt;br /&gt;
        if right(p) ≠ nil then&lt;br /&gt;
            PUSH(S, right(p))&lt;br /&gt;
        end_if&lt;br /&gt;
    else&lt;br /&gt;
        sum = 0&lt;br /&gt;
        if (left(p) ≠ nil) or (right(p) ≠ nil) then&lt;br /&gt;
            if left(p) ≠ nil then&lt;br /&gt;
                sum = sum + value(left(p))&lt;br /&gt;
            end_if&lt;br /&gt;
            if right(p) ≠ nil then&lt;br /&gt;
                sum = sum + value(right(p))&lt;br /&gt;
            end_if&lt;br /&gt;
            if sum * 2 ≠ value(p) then&lt;br /&gt;
                return false&lt;br /&gt;
            end_if&lt;br /&gt;
        end_if&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
return true&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Primenom dinamičkog Huffman algoritma kodirati poruku ABCDBBCAAABC i &#039;&#039;&#039;prikazati postupak&#039;&#039;&#039; kodiranja ukoliko su početni kodovi simbola A, B, C i D 00, 01, 10 i 11 respektivno. Uporediti prosečnu dužinu simbola primenom ovog algoritma sa inicijalno dodeljenim kodovima.&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
* Krajnje transmitovano: &#039;&#039;&#039;00 001 0010 10011 11 11 111 111 111 10 10 101&#039;&#039;&#039;&lt;br /&gt;
* Krajnje stablo:&lt;br /&gt;
    12&lt;br /&gt;
  /    \&lt;br /&gt;
 A      8&lt;br /&gt;
 4     / \&lt;br /&gt;
      4   4&lt;br /&gt;
     / \&lt;br /&gt;
    1   C&lt;br /&gt;
   / \  3&lt;br /&gt;
  NYT D&lt;br /&gt;
   0  1&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; data-expandtext=&amp;quot;Prikaži postupak&amp;quot;&amp;gt;&lt;br /&gt;
 NYT&lt;br /&gt;
  0&lt;br /&gt;
00&lt;br /&gt;
   1&lt;br /&gt;
  / \&lt;br /&gt;
 NYT A&lt;br /&gt;
  0  1&lt;br /&gt;
001&lt;br /&gt;
     2&lt;br /&gt;
    / \&lt;br /&gt;
   1   A&lt;br /&gt;
  / \  1&lt;br /&gt;
 NYT B&lt;br /&gt;
  0  1&lt;br /&gt;
0010&lt;br /&gt;
   3&lt;br /&gt;
  / \&lt;br /&gt;
 A   2&lt;br /&gt;
 1  / \&lt;br /&gt;
   1   B&lt;br /&gt;
  / \  1&lt;br /&gt;
 NYT C&lt;br /&gt;
  0  1&lt;br /&gt;
10011&lt;br /&gt;
        4&lt;br /&gt;
      /   \&lt;br /&gt;
     2     2&lt;br /&gt;
    / \   / \&lt;br /&gt;
   1   C A   B&lt;br /&gt;
  / \  1 1   1&lt;br /&gt;
 NYT D&lt;br /&gt;
  0  1&lt;br /&gt;
11&lt;br /&gt;
        5&lt;br /&gt;
      /   \&lt;br /&gt;
     2     3&lt;br /&gt;
    / \   / \&lt;br /&gt;
   1   C A   B&lt;br /&gt;
  / \  1 1   2&lt;br /&gt;
 NYT D&lt;br /&gt;
  0  1&lt;br /&gt;
11&lt;br /&gt;
   6&lt;br /&gt;
  / \&lt;br /&gt;
 B   3&lt;br /&gt;
 3  / \&lt;br /&gt;
   A   2&lt;br /&gt;
   1  / \&lt;br /&gt;
     1   C&lt;br /&gt;
    / \  1&lt;br /&gt;
   NYT D&lt;br /&gt;
    0  1&lt;br /&gt;
111&lt;br /&gt;
   7&lt;br /&gt;
  / \&lt;br /&gt;
 B   4&lt;br /&gt;
 3  / \&lt;br /&gt;
   C   2&lt;br /&gt;
   2  / \&lt;br /&gt;
     1   A&lt;br /&gt;
    / \  1&lt;br /&gt;
   NYT D&lt;br /&gt;
    0  1&lt;br /&gt;
111&lt;br /&gt;
   8&lt;br /&gt;
  / \&lt;br /&gt;
 B   5&lt;br /&gt;
 3  / \&lt;br /&gt;
   C   3&lt;br /&gt;
   2  / \&lt;br /&gt;
     1   A&lt;br /&gt;
    / \  2&lt;br /&gt;
   NYT D&lt;br /&gt;
    0  1&lt;br /&gt;
111&lt;br /&gt;
   9&lt;br /&gt;
  / \&lt;br /&gt;
 B   6&lt;br /&gt;
 3  / \&lt;br /&gt;
   A   3&lt;br /&gt;
   3  / \&lt;br /&gt;
     1   C&lt;br /&gt;
    / \  2&lt;br /&gt;
   NYT D&lt;br /&gt;
    0  1&lt;br /&gt;
10&lt;br /&gt;
   10&lt;br /&gt;
  /  \&lt;br /&gt;
 A    6&lt;br /&gt;
 4   / \&lt;br /&gt;
    B   3&lt;br /&gt;
    3  / \&lt;br /&gt;
      1   C&lt;br /&gt;
     / \  2&lt;br /&gt;
    NYT D&lt;br /&gt;
     0  1&lt;br /&gt;
10&lt;br /&gt;
    11&lt;br /&gt;
   /  \&lt;br /&gt;
  A    7&lt;br /&gt;
  4   / \&lt;br /&gt;
     3   B&lt;br /&gt;
    / \  4&lt;br /&gt;
   1   C&lt;br /&gt;
  / \  2&lt;br /&gt;
 NYT D&lt;br /&gt;
  0  1&lt;br /&gt;
101&lt;br /&gt;
&lt;br /&gt;
Kraj.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Konverzija &#039;&#039;m&#039;&#039;-arnog u binarno stablo&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Objasniti na koji način se vrši konverzija stabala višeg reda u odgovarajuće binarno stablo iste semantike. Koje dodatne informacije su potrebne?&lt;br /&gt;
# Za stablo reda 4 sa slike, prikazati postupak konverzije u odgovarajuće binarno stablo iste semantike i nacrtati finalno binarno stablo.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
         X&lt;br /&gt;
      / / \ \&lt;br /&gt;
    Y  A   F  C&lt;br /&gt;
  / | \   /  / \&lt;br /&gt;
 B  G  E J  K   M&lt;br /&gt;
      /&lt;br /&gt;
     D&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&#039;&#039;m&#039;&#039;-arno stablo se konvertuje u binarno tako što se svaki čvor stabla pretvori tako da njegovo levo dete pokazuje na njegovo prvo dete a desno dete na sledećeg brata. Ovo se može realizovati tako što se &#039;&#039;postorder&#039;&#039; obilaskom &#039;&#039;m&#039;&#039;-arnog stabla svi čvorovi konvertuju tako da im se kao levo dete nalazi prvo dete, kao desno dete levog deteta drugo dete, kao desno dete desnog deteta levog deteta treće dete itd.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; data-expandtext=&amp;quot;Prikaži postupak&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;Postorder&#039;&#039; poredak čvorova: &#039;&#039;&#039;BGDEYAJFKMCX&#039;&#039;&#039;&lt;br /&gt;
* B, G, D — Nemaju decu&lt;br /&gt;
* E — Već je konvertovan u čvor binarnog stabla&lt;br /&gt;
* Y —&lt;br /&gt;
        X&lt;br /&gt;
     / / \  \&lt;br /&gt;
   Y  A   F  C&lt;br /&gt;
  /      /  / \&lt;br /&gt;
 B      J  K   M&lt;br /&gt;
  \&lt;br /&gt;
   G&lt;br /&gt;
    \&lt;br /&gt;
     E&lt;br /&gt;
    /&lt;br /&gt;
   D&lt;br /&gt;
* A, J — Nemaju decu&lt;br /&gt;
* F — Već je konvertovan u čvor binarnog stabla&lt;br /&gt;
* K, M — Nemaju decu&lt;br /&gt;
* C —&lt;br /&gt;
        X&lt;br /&gt;
     / / \  \&lt;br /&gt;
   Y  A   F  C&lt;br /&gt;
  /      /  /&lt;br /&gt;
 B      J  K&lt;br /&gt;
  \         \&lt;br /&gt;
   G         M&lt;br /&gt;
    \&lt;br /&gt;
     E&lt;br /&gt;
    /&lt;br /&gt;
   D&lt;br /&gt;
* X — Vidi konačno stablo&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konačno stablo:&lt;br /&gt;
      X&lt;br /&gt;
     /&lt;br /&gt;
    Y&lt;br /&gt;
  /   \&lt;br /&gt;
 B     A&lt;br /&gt;
  \     \&lt;br /&gt;
   G     F&lt;br /&gt;
    \   / \&lt;br /&gt;
     E J   C&lt;br /&gt;
    /     /&lt;br /&gt;
   D     K&lt;br /&gt;
          \&lt;br /&gt;
           M&lt;br /&gt;
&lt;br /&gt;
== Treći kolokvijum ==&lt;br /&gt;
=== 1. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Potrebno je implementirati jednostavan algoritam za pomoć pri brisanju nedostižnih objekata u memoriji kao podrška nekom programskom jeziku (&#039;&#039;garbage collection&#039;&#039;). Neka se alocirani objekti u memoriji i njihove veze modeluju usmerenim netežinskim grafom matrične reprezentacije &#039;&#039;G&#039;&#039; sa &#039;&#039;n&#039;&#039; čvorova. Čvorovi grafa predstavljuju objekte, a grane grafa predstavljaju veze između njih, tako da grana &#039;&#039;(x,y)&#039;&#039; modelira postojanje reference u okviru objekta &#039;&#039;x&#039;&#039; na objekat &#039;&#039;y&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Neka je dat niz promenljivih &#039;&#039;vars&#039;&#039; dužine &#039;&#039;n_vars&#039;&#039; koji pokazuju na objekte i počev od kojih je potrebno proveriti da li se do svih alociranih objekata u nekom programu može doći. Implementirati funkciju GC koja treba da vrati skup svih onih objekata koji su nedostižni iz perspektive početnog skupa promenljivih (&#039;&#039;vars&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
Dato je generalno rešenje radi čitljivosti, rešenje u matričnoj reprezentaciji je vežba za čitaoca. Neophodna je implementacija BFS (ili bilo kog algoritma pretrage grafa preko grana) koji vraća skup posećenih čvorova. &#039;&#039;R&#039;&#039; (reachable) je skup čvorova koji su dostižni. Vraćaju se oni čvorovi koji nakon ovih pretraga nisu bili dostižni.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
GC(G, n, vars, n_vars)&lt;br /&gt;
R = ∅&lt;br /&gt;
for each v in vars do&lt;br /&gt;
    R = R ∪ BFS(G, v)&lt;br /&gt;
end_for&lt;br /&gt;
return G \ R&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
=== 2. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
[[{{ns:6}}:ASP1 jul 2020 zadatak 3.2 graf.svg|thumb|Graf iz postavke drugog zadatka.]]&lt;br /&gt;
Jako povezane komponente&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Definisati jako povezane komponente i objasniti način kako se one mogu pronaći u usmerenom grafu.&lt;br /&gt;
# Za graf sa slike, prikazati po koracima postupak pronalaženja jako povezanih komponenti i nacrtati redukovani graf.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
[[{{ns:6}}:ASP1 jul 2020 zadatak 3.2 rešenje.png|thumb|Transponovani graf. Jako povezane komponente su označene različitim bojama]]&lt;br /&gt;
[[{{ns:6}}:ASP1 jul 2020 zadatak 3.2 redukovani.png|thumb|Redukovani graf.]]&lt;br /&gt;
Jako povezanom komponentom nazivamo podgraf u kome je svaki čvor dostižan svim ostalim čvorovima. Algoritam za nalaženje jako povezanih komponenti možemo podeliti na 4 dela:&lt;br /&gt;
# Na datom grafu G radimo DFS i pamtimo završna vremena svakog čvora.&lt;br /&gt;
# Formiramo transponovani graf G&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; grafa G. Transponovani graf je graf u kome je smer svih grana obrnut.&lt;br /&gt;
# Na grafu G&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; radimo DFS počevši od čvora sa najvećim završnim vremenom. Skup posećenih čvorova koji vraća DFS čini jako povezanu komponentu tojest jedan čvor u redukovanom grafu.&lt;br /&gt;
# Sve čvorove koje smo posetili u 3. koraku uklanjamo iz G&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;, te ponavljamo 3. korak dok graf ne postane prazan.&lt;br /&gt;
DFS koji kreće od C:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Čvor !! Početno vreme !! Završno vreme&lt;br /&gt;
|-&lt;br /&gt;
| C || 1 || 20&lt;br /&gt;
|-&lt;br /&gt;
| A || 2 || 19&lt;br /&gt;
|-&lt;br /&gt;
| B || 3 || 12&lt;br /&gt;
|-&lt;br /&gt;
| F || 4 || 11&lt;br /&gt;
|-&lt;br /&gt;
| H || 5 || 10&lt;br /&gt;
|-&lt;br /&gt;
| J || 6 || 9&lt;br /&gt;
|-&lt;br /&gt;
| I || 7 || 8&lt;br /&gt;
|-&lt;br /&gt;
| E || 13 || 18&lt;br /&gt;
|-&lt;br /&gt;
| G || 14 || 17&lt;br /&gt;
|-&lt;br /&gt;
| D || 15 || 16&lt;br /&gt;
|}&lt;br /&gt;
Jako povezane komponente:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Čvor !! Završno vreme&lt;br /&gt;
|-&lt;br /&gt;
| C || 20&lt;br /&gt;
|-&lt;br /&gt;
! Čvor !! Završno vreme&lt;br /&gt;
|-&lt;br /&gt;
| A || 19&lt;br /&gt;
|-&lt;br /&gt;
! Čvor !! Završno vreme&lt;br /&gt;
|-&lt;br /&gt;
| E || 18&lt;br /&gt;
|-&lt;br /&gt;
| D || 16&lt;br /&gt;
|-&lt;br /&gt;
| G || 17&lt;br /&gt;
|-&lt;br /&gt;
! Čvor !! Završno vreme&lt;br /&gt;
|-&lt;br /&gt;
| B || 12&lt;br /&gt;
|-&lt;br /&gt;
| I || 8&lt;br /&gt;
|-&lt;br /&gt;
| J || 9&lt;br /&gt;
|-&lt;br /&gt;
| H || 10&lt;br /&gt;
|-&lt;br /&gt;
| F || 11&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
[[{{ns:6}}:ASP1 jul 2020 zadatak 3.3 graf.svg|thumb|Graf iz postavke trećeg zadatka.]]&lt;br /&gt;
Na slici je dat težinski neusmeren graf.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Naći minimalno obuhvatno stablo primenom Primovog algoritma, ako se za početni čvor uzima čvor S. Prikazati redom koje grane se dodaju u obuhvatno stablo.&lt;br /&gt;
# Naći minimalno obuhvatno stablo primenom Primovog algoritma, ako se za početni čvor uzima čvor B. Prikazati redom koje grane se dodaju u obuhvatno stablo.&lt;br /&gt;
# Ukratko i precizno objasniti da li je prilikom traženja minimalnog obuhvatnog stabla u prethodnim tačkama moglo da se dobije i drugačije minimalno obuhvatno stablo? Ako da, napisati od čega to zavisi i navesti odovarajući korak u kome se to desilo.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Od S !! Od B&lt;br /&gt;
|-&lt;br /&gt;
| S-M 3 || B-A 3&lt;br /&gt;
|-&lt;br /&gt;
| M-K 2 || A-T 2&lt;br /&gt;
|-&lt;br /&gt;
| K-B 4 || B-K 4&lt;br /&gt;
|-&lt;br /&gt;
| B-A 3 || K-M 2&lt;br /&gt;
|-&lt;br /&gt;
| A-T 2 || M-S 3&lt;br /&gt;
|-&lt;br /&gt;
| T-F 6 || S-F 5&lt;br /&gt;
|}&lt;br /&gt;
Moguće je dobiti drugačije stablo ukoliko se desi da imamo dve grane koje su minimalne ali iste težine. Ako ne postoje dodatni kriterijumi gde bi jedna grana bila bolja od druge i pri biranju jedne grane neće doći do toga da i druga bude dodata u krajnje stablo, onda postoje dve opcije. U ovom zadatku to se dešava u 3. koraku kada krećemo od S, gde možemo birati ili K-B 4 ili M-B 4.&lt;br /&gt;
&lt;br /&gt;
=== 4. zadatak ===&lt;br /&gt;
==== Postavka ====&lt;br /&gt;
Ekscentričnost čvora i središte grafa&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Formalno definisati i objasniti pojmove ekscentričnosti čvora i središta grafa i na koji način se oni određuju.&lt;br /&gt;
# Napisati u pseudokodu iterativnu implementaciju funkcije koja u grafu sa &#039;&#039;n&#039;&#039; čvorova i poznatom matricom najkraćih rastojanja &#039;&#039;D&#039;&#039; određuje ekcentričnost svih čvorova grafa. Funkcija vraća vektor koji sadrži izračunate ekscentričnosti čvorova.&lt;br /&gt;
# Napisati u pseudokodu iterativnu implementaciju funkcije koja u grafu sa &#039;&#039;n&#039;&#039; čvorova i poznatim ekscentričnostima čvorova u vektoru &#039;&#039;ecc&#039;&#039; određuje središte grafa.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Rešenje ====&lt;br /&gt;
&#039;&#039;Ekscentričnost čvora&#039;&#039; se definiše kao maksimum od najkraćih rastojanja od svih čvorova grafa do tog čvora tj. &amp;lt;math&amp;gt; ecc(v) = max \{ d[i,v] : i \in V \} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Središte grafa&#039;&#039; je čvor sa najmanjom ekscentičnošću.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Određivanje ekscentričnosti čvora:&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
G_ECC(D,n)&lt;br /&gt;
ecc = ALLOC(n)&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    ecc[1] = D[i][1]&lt;br /&gt;
    for j = 2 to n do&lt;br /&gt;
        if D[i][j] &amp;gt; ecc[i] then&lt;br /&gt;
            ecc[i] = D[i][j]&lt;br /&gt;
        end_if&lt;br /&gt;
   end_for&lt;br /&gt;
end_for&lt;br /&gt;
return ecc&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
|| Određivanje središta grafa:&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
G_CENTER(ecc,n)&lt;br /&gt;
c = 1&lt;br /&gt;
for i = 2 to n do&lt;br /&gt;
    if ecc[c] &amp;gt; ecc[i] then&lt;br /&gt;
        c = i&lt;br /&gt;
    end_if&lt;br /&gt;
end_for&lt;br /&gt;
return c&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%88%D1%83%D0%BB_2018&amp;diff=7786</id>
		<title>АСП1/Јул 2018</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%88%D1%83%D0%BB_2018&amp;diff=7786"/>
		<updated>2024-09-13T00:08:24Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
[https://rti.etf.bg.ac.rs/rti/ri3sp/rokovi/13S111ASP1_jul_2018.pdf Zadaci]&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Odrediti binarno stablo čijim eksternim čvorovima su pridružene težine: 3, 6, 3, 1, za koje je težinska eksterna dužina puta najmanja i izračunati tu dužinu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
   13&lt;br /&gt;
  /  \&lt;br /&gt;
 6    7&lt;br /&gt;
     / \&lt;br /&gt;
    3   4&lt;br /&gt;
       / \&lt;br /&gt;
      3   1&lt;br /&gt;
Eksterna dužina puta: &amp;lt;math&amp;gt;1 \cdot 6 + 2 \cdot 3 + 3 \cdot 1 + 3 \cdot 3 = 6 + 6 + 3 + 9 = 24&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Dat je aritmetički izraz u infiksnoj notaciji: 3+7+4*(2+1). Pretvoriti dati izraz u postfiksni izraz, a zatim prikazati stanje steka po koracima tokom izračunavanja vrednosti dobijenog postfiksnog izraza. Smatrati da pokazivač vrha steka pokazuje na poslednju zauzetu lokaciju i obeležiti ga na slici.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Postfiksni izraz: &#039;&#039;&#039;3 7 + 4 2 1 + * +&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | 3&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | 7&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | +&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | 4&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | 2&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | 1&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | +&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | *&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | +&lt;br /&gt;
|-&lt;br /&gt;
|   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- &lt;br /&gt;
|-&lt;br /&gt;
|   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- &lt;br /&gt;
|-&lt;br /&gt;
|   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- ||   || -- &lt;br /&gt;
|-&lt;br /&gt;
|   || -- ||   || -- ||   || -- ||   || -- ||   || -- || → || 1  ||   || -- ||   || -- ||   || -- &lt;br /&gt;
|-&lt;br /&gt;
|   || -- ||   || -- ||   || -- ||   || -- || → || 2  ||   || 2  || → || 3  ||   || -- ||   || -- &lt;br /&gt;
|-&lt;br /&gt;
|   || -- || → || 7  ||   || -- || → || 4  ||   || 4  ||   || 4  ||   || 4  || → || 12 ||   || --&lt;br /&gt;
|-&lt;br /&gt;
| → || 3  ||   || 3  || → || 10 ||   || 10 ||   || 10 ||   || 10 ||   || 10 ||   || 10 || → || 22 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se vektorska implementacija kompletnog ili skoro kompletnog stabla reda 3 u vidu vektora &#039;&#039;V[1:n]&#039;&#039;.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Prikazati stablo čija je vektorska reprezentacija data na slici.&lt;br /&gt;
# Napisati u pseudokodu funkciju koja nalazi put od čvora sa indeksom &#039;&#039;k&#039;&#039; ka korenu i funkciju koja nalazi sve sinove čvora sa indeksom &#039;&#039;k&#039;&#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Slika uz deo pod a.&lt;br /&gt;
| 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 || 13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
             1&lt;br /&gt;
        /    |    \&lt;br /&gt;
    2        3         4&lt;br /&gt;
  / | \    / | \    /  |  \&lt;br /&gt;
 5  6  7  8  9 10  11  12  13&lt;br /&gt;
&lt;br /&gt;
U pseudokodu ispod pretpostavlja se da nam put od čvora ka korenu kao i deca trenutnog čvora trebaju vraćeni kao ulančane liste.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
NODE TO ROOT(V, n, k)&lt;br /&gt;
t = 0&lt;br /&gt;
path = nil&lt;br /&gt;
p = k&lt;br /&gt;
while p ≠ 0 do&lt;br /&gt;
    LIST_INSERT(path, v[p])&lt;br /&gt;
    t = p mod 3&lt;br /&gt;
    if t = 0 then&lt;br /&gt;
        p = p / 3&lt;br /&gt;
    else if t = 1 then&lt;br /&gt;
        p = (p - 1) / 3&lt;br /&gt;
    else&lt;br /&gt;
        p = (p + 1) / 3&lt;br /&gt;
    end_if&lt;br /&gt;
end_while&lt;br /&gt;
return path&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
CHILD NODES(V, n, k)&lt;br /&gt;
children = nil&lt;br /&gt;
if 3 * k - 1 ≤ n then&lt;br /&gt;
    LIST_INSERT(children, v[3 * k - 1])&lt;br /&gt;
end_if&lt;br /&gt;
if 3 * k ≤ n then&lt;br /&gt;
    LIST_INSERT(children, v[3 * k])&lt;br /&gt;
end_if&lt;br /&gt;
if 3 * k + 1 ≤ n then&lt;br /&gt;
    LIST_INSERT(children, v[3 * k + 1])&lt;br /&gt;
end_if&lt;br /&gt;
return children&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka je data opšta kvadratna matrica A[&#039;&#039;l:u&#039;&#039;, &#039;&#039;l:u&#039;&#039;] koja sadrži elemente samo ispod glavne dijagonale, uključujući i tu dijagonalu. Formalno definisati i kratko objasniti adresnu funkciju za pristup proizvoljnom elementu A[&#039;&#039;i&#039;&#039;, &#039;&#039;j&#039;&#039;], ukoliko se matrica linearizuje po vrstama.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;math&amp;gt;A_{ij} = A_{ll} + \left(\frac{(i-l)(i-l+1)}{2} + j - l\right) \cdot S&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{ll}&amp;lt;/math&amp;gt; je adresa početnog elementa matrice.&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{(i-l)(i-l+1)}{2}&amp;lt;/math&amp;gt; je broj elemenata u redovima iznad elementa kojeg tražimo. &amp;lt;math&amp;gt;i-l&amp;lt;/math&amp;gt; je broj redova iznad trenutnog reda i stoga broj elemenata u redu iznad našeg, a pošto broj elemenata opada sa brojem reda ovaj zbir dobijamo kao Gausov zbir.&lt;br /&gt;
* &amp;lt;math&amp;gt;j-l&amp;lt;/math&amp;gt; je broj elemenata levo od našeg trenutnog elementa.&lt;br /&gt;
&lt;br /&gt;
== 5. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Neka se posmatra jedan skup veb stranica u okviru lokalnog intraneta jedne kompanije. Svaka stranica sadrži određeni broj hiperlinkova koji vode ka drugim stranicama u okviru intraneta.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Opisati na koji način se ovaj skup stranica može modelovati grafom. Komentarisati tip i usmerenost grafa.&lt;br /&gt;
# Napisati u pseudokodu iterativnu funkciju koja određuje prosečan broj klikova potreban da se sa neke veb stranice stigne do neke druge veb stranice u okviru kompanijskog intraneta. Prosek računati na nivou svih mogućih parova stranica.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Ovaj skup stranica se može modelovati netežinskim usmerenim grafom gde čvorovi predstavljaju stranice a grana od strane A do strane B znači da postoji veza na strani A do strane B.&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
AVG CLICKS NUM(G)&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    for i = 1 to n do&lt;br /&gt;
        if (i, j) ∈ E then&lt;br /&gt;
            d[i, j] = 1&lt;br /&gt;
        else&lt;br /&gt;
            d[i, j] = ∞&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
end_for&lt;br /&gt;
for k = 1 to n do&lt;br /&gt;
    for i = 1 to n do&lt;br /&gt;
        for j = 1 to n do&lt;br /&gt;
            if d[i, k] + d[k, j] &amp;lt; d[i, j] then&lt;br /&gt;
                d[i, j] = d[i, k] + d[k, j]&lt;br /&gt;
            end_if&lt;br /&gt;
        end_for&lt;br /&gt;
    end_for&lt;br /&gt;
end_for&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    for j = 1 to n do&lt;br /&gt;
        if i ≠ j then&lt;br /&gt;
            sum = sum + d[i, j]&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
end_for&lt;br /&gt;
return sum / (n * (n - 1))&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 6. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[{{ns:6}}:ASP1 jul 2018 zadatak 6 graf.svg|thumb|Graf iz postavke zadatka.]]&lt;br /&gt;
Primenom algoritma za određivanje kritičnih puteva u grafu odrediti kritične puteve u grafu sa slike kao i dozvoljena kašnjenja svih aktivnosti u grafu.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Kritični putevi: &#039;&#039;&#039;AEDCM&#039;&#039;&#039; i &#039;&#039;&#039;AEDVM&#039;&#039;&#039;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Čvor&lt;br /&gt;
! EST&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| D&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| E&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| K&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| M&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| V&lt;br /&gt;
| 11&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Aktivnost&lt;br /&gt;
! I&lt;br /&gt;
|-&lt;br /&gt;
| A-B&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| A-E&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| E-D&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| D-B&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| D-C&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| B-C&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| C-M&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| D-V&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| V-M&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| E-V&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| E-K&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| K-V&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je dvostruko ulančana lista. Implementirati funkciju REARRANGE_LIST koja prosleđenu listu preuređuje tako da se svi elementi sa neparnih pozicija u originalnom poretku nađu pre svih elemenata sa parnih pozicija u originalnom poretku.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
LIST REMOVE(node)&lt;br /&gt;
next(prev(node)) = next(node)&lt;br /&gt;
prev(next(node)) = prev(node)&lt;br /&gt;
return node&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
LIST INSERT(before, node)&lt;br /&gt;
t = prev(before)&lt;br /&gt;
prev(before) = node&lt;br /&gt;
next(t) = node&lt;br /&gt;
prev(node) = t&lt;br /&gt;
next(node) = before&lt;br /&gt;
return node&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
REARRANGE LIST(head)&lt;br /&gt;
if head = nil then&lt;br /&gt;
    return&lt;br /&gt;
end_if&lt;br /&gt;
p = head&lt;br /&gt;
n = nil&lt;br /&gt;
loop&lt;br /&gt;
    for k = 1 to i + 1 do&lt;br /&gt;
        p = next(p)&lt;br /&gt;
        if p = nil then&lt;br /&gt;
            return&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
    n = LIST_REMOVE(p)&lt;br /&gt;
    for k = 1 to i do&lt;br /&gt;
        p = prev(p)&lt;br /&gt;
    end_for&lt;br /&gt;
    LIST_INSERT(p, n)&lt;br /&gt;
    p = n&lt;br /&gt;
    i = i + 1&lt;br /&gt;
end_loop&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 8. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prikazati postupak kodiranja poruke ADBECDAADBE primenom dinamičkog &#039;&#039;Huffman&#039;&#039; algoritma.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
Krajnje &#039;&#039;Huffman&#039;&#039;-ovo stablo:&lt;br /&gt;
       11&lt;br /&gt;
      /   \&lt;br /&gt;
    5       6&lt;br /&gt;
   / \     / \&lt;br /&gt;
  B   3   D   A&lt;br /&gt;
  2  / \  3   3&lt;br /&gt;
    1   E&lt;br /&gt;
   / \  2&lt;br /&gt;
 NYT  C&lt;br /&gt;
  0   1&lt;br /&gt;
Krajnja poruka: &#039;&#039;&#039;A 0D 00B 100E 000C 00 00 01 10 00 011&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== 9. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se neusmeren težinski graf predstavljen matricom susednosti, čiji čvorovi predstavljaju gradove u kojima se nalaze benzinske pumpe na kojima se može dopuniti rezervoar, a težine grana predstavljaju koliko litara goriva se potroši u putu između povezanih gradova. Perica kreće iz grada src i želi da stigne u grad dst. Na efikasan način odrediti minimalni kapacitet rezervoara Peričinog automobila da bi on mogao da uspešno da završi svoj put.&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
GETNODE(i, j)&lt;br /&gt;
ALLOCATE(node)&lt;br /&gt;
from(node) = i&lt;br /&gt;
to(node) = j&lt;br /&gt;
next(node) = nil&lt;br /&gt;
return node&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
{{Милокод|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
GASOLINE TRAVEL(G, src, dst)&lt;br /&gt;
branches = nil&lt;br /&gt;
t = nil&lt;br /&gt;
for i = 1 to n do&lt;br /&gt;
    for j = 1 to n do&lt;br /&gt;
        if e[i, j] = 1 then&lt;br /&gt;
            if branches = nil then&lt;br /&gt;
                branches = GETNODE(i, j)&lt;br /&gt;
            else&lt;br /&gt;
                t = next(branches)&lt;br /&gt;
                next(branches) = GETNODE(i, j)&lt;br /&gt;
                next(next(branches)) = t&lt;br /&gt;
            end_if&lt;br /&gt;
        end_if&lt;br /&gt;
    end_for&lt;br /&gt;
end_for&lt;br /&gt;
S = {src}&lt;br /&gt;
loop&lt;br /&gt;
    t = branches&lt;br /&gt;
    min_branch = nil&lt;br /&gt;
    while t ≠ nil do&lt;br /&gt;
        if (from(t) ∈ S) and (to(t) ∈ (V - S) then&lt;br /&gt;
            if (min_branch = nil) or (w(from(t), to(t)) &amp;lt; w(from(min_branch), to(min_branch))) then&lt;br /&gt;
                min_branch = t&lt;br /&gt;
            end_if&lt;br /&gt;
        end_if&lt;br /&gt;
        t = next(t)&lt;br /&gt;
    end_while&lt;br /&gt;
    if to(min_branch) = dst then&lt;br /&gt;
        return last_min&lt;br /&gt;
    end_if&lt;br /&gt;
    S = S + {to(min_branch)}&lt;br /&gt;
end_loop&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== 10. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Prilikom obilaska nekog grafa može se dobiti &#039;&#039;&#039;stablo obilaska&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Definisati ovo stablo.&lt;br /&gt;
# Prilikom obilaska usmerenog grafa po dubini dobijena su početna (&#039;&#039;t1&#039;&#039;) i završna vremena (&#039;&#039;t2&#039;&#039;) čvorova kao u priloženoj tabeli. Rekonstruisati stablo obilaska i precizno objasniti postupak rekonstrukcije.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! &#039;&#039;t1&#039;&#039;&lt;br /&gt;
! &#039;&#039;t2&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| A || 3 || 4&lt;br /&gt;
|-&lt;br /&gt;
| B || 5 || 10&lt;br /&gt;
|-&lt;br /&gt;
| C || 11 || 12&lt;br /&gt;
|-&lt;br /&gt;
| D || 14 || 15&lt;br /&gt;
|-&lt;br /&gt;
| E || 8 || 9&lt;br /&gt;
|-&lt;br /&gt;
| F || 2 || 13&lt;br /&gt;
|-&lt;br /&gt;
| G || 1 || 16&lt;br /&gt;
|-&lt;br /&gt;
| H || 6 || 7&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Stablo obilaska je aciklični neusmereni netežinski graf čije grane označavaju iz kog je čvora posećen koji čvor prilikom obilaska grafa, a čvorovi su isti kao u grafu koji se obilazi.&lt;br /&gt;
# Postupak ide tako što udemo predom kroz brojeve &amp;lt;math&amp;gt;t = 1 ... 2n&amp;lt;/math&amp;gt; i čuvamo jedan imaginarni pokazivač koji je u &amp;lt;math&amp;gt;t = 1&amp;lt;/math&amp;gt; postavljam na koren. Ako &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; označava početno vreme nekog čvora, na trenutni pokazivač dodajemo dete sa vrednošću tog čvora i prebacujemo pokazivač na to dete. Ako &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; označava krajnje vreme nekog čvora, prebacujemo pokazivač na njegovog roditelja (ako je pokazivač na korenu, završavamo).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
      G&lt;br /&gt;
     / \&lt;br /&gt;
    F   D&lt;br /&gt;
  / | \&lt;br /&gt;
 A  B  C&lt;br /&gt;
   / \&lt;br /&gt;
  H   E&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A3_%D0%88%D1%83%D0%BB_2021&amp;diff=7784</id>
		<title>АСП1/К3 Јул 2021</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%90%D0%A1%D0%9F1/%D0%9A3_%D0%88%D1%83%D0%BB_2021&amp;diff=7784"/>
		<updated>2024-09-13T00:00:05Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена начина истицања милокода.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{tocright}}&lt;br /&gt;
{{nerešeno}}&lt;br /&gt;
&#039;&#039;&#039;Jul 2021. godine&#039;&#039;&#039; nema postavku dostupnu sa stranice predmeta.&lt;br /&gt;
&lt;br /&gt;
== 1. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Posmatra se plan za realizaciju jednog softverskog projekta dat tabelom. Faza S je početna.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|+ Plan za realizaciju projekta&lt;br /&gt;
| A || S – 7 dana&lt;br /&gt;
|-&lt;br /&gt;
| B || G – 6 dana, R – 2 dana&lt;br /&gt;
|-&lt;br /&gt;
| F || L – 11 dana&lt;br /&gt;
|-&lt;br /&gt;
| L || S – 7 dana&lt;br /&gt;
|-&lt;br /&gt;
| G || L – 3 dana,  A – 4 dana&lt;br /&gt;
|-&lt;br /&gt;
| M || F – 5 dana, B – 3 dana&lt;br /&gt;
|-&lt;br /&gt;
| R || A – 5 dana&lt;br /&gt;
|-&lt;br /&gt;
| T || B – 7 dana, M – 2 dana&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;(5p)&#039;&#039;&#039; Predstaviti projekat grafom.&lt;br /&gt;
# &#039;&#039;&#039;(10p)&#039;&#039;&#039; Ako faza B predstavlja beta fazu projekta i želimo da znamo da ni ona neće kasniti naći kritični put (ili puteve) i kritične aktivnosti za beta fazu.&lt;br /&gt;
# &#039;&#039;&#039;(10p)&#039;&#039;&#039; Naći kritični put (ili puteve) za uspešnu realizaciju ovog projekta kao i kritične aktivnosti.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 2. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Data je mreža puteva između gradova predstavljena matričnom reprezentacijom grafa. Putarina između bilo koja dva povezana grada iznosi 1. Međutim pri ulasku u svaki grad, postoji određena taksa koju je potrebno platiti. Cena takse se definiše na nivou grada.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Mika voli da putuje i nalazi se u gradu X. Izračunati za svaki grad koliko je novca Miki potrebno da ga obiđe ukoliko uvek kreće iz mesta X. Implementirati funkciju koja efikasno računa minimalnu potrebnu količinu novca za posetu svakom gradu. Funkciji su prosleđeni broj gradova, graf, cene taksi za svaki grad (niz prirodnih brojeva) i indeks početnog grada.{{Милокод|&amp;lt;nowiki&amp;gt;CALC EXPENSES(N, G, taxes, X)&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
# Jedan od gradova je zbog nedostatka turista uveo da turisti pri ulasku ne plaćaju taksu, već da dobiju beneficiju u vidu novca. Ukratko prokomentarisati kako ova modifikacija utiče na predloženi algoritam pod a). Da li bi se u tom slučaju koristio isti algoritam ili bi bio pogodniji neki drugi (ako da, koji)?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 3. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
[[Датотека:ASP1 jul 2021 zadatak 3.svg|1000px|frame|center|Slika iz trećeg zadatka.]]&lt;br /&gt;
Uparivanje neusmerenog netežinskog grafa.&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Predložiti i ukratko opisati način na koji se vrši pronalaženje maksimalnog uparenog skupa grafa.&lt;br /&gt;
# Za graf sa slike prikazati pronalaženje maksimalnog uparenog skupa po koracima.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
== 4. zadatak ==&lt;br /&gt;
=== Postavka ===&lt;br /&gt;
Obilazak po dubini&lt;br /&gt;
&amp;lt;div class=&amp;quot;abc-list&amp;quot;&amp;gt;&lt;br /&gt;
# Definisati stablo obilaska.&lt;br /&gt;
# Definisati početno i završno vreme prilikom obilaska grafa po dubini. Koja je njegova uloga?&lt;br /&gt;
# Napisati u pseudokodu implementaciju funkcije koja na osnovu zapisanih početnih i završnih vremena obilaska svakog čvora obilaskom po dubini određuje da li se čvor X nalazi u podstablu čvora Y u stablu obilaska.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;milo&amp;quot;&amp;gt;&lt;br /&gt;
IS SUCCESSOR(start_time, finish_time, x, y)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rešenje ===&lt;br /&gt;
&lt;br /&gt;
[[Категорија:Рокови]]&lt;br /&gt;
[[Категорија:АСП1]]&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_jun_2023_zadatak_9.svg&amp;diff=6653</id>
		<title>Датотека:ZP jun 2023 zadatak 9.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_jun_2023_zadatak_9.svg&amp;diff=6653"/>
		<updated>2023-09-30T23:31:04Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = PGP дијаграм из [[Заштита података/Јун 2023#9. zadatak 3|деветог задатка са јунског рока 2023. године за РТИ]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/ZP/ZP%20jun%202023%20zadatak%209.drawio Изворни &#039;&#039;draw.io&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_jun_2022_zadatak_9_digitalni_imuni_sistem.svg&amp;diff=6652</id>
		<title>Датотека:ZP jun 2022 zadatak 9 digitalni imuni sistem.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_jun_2022_zadatak_9_digitalni_imuni_sistem.svg&amp;diff=6652"/>
		<updated>2023-09-30T23:31:03Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = &#039;&#039;IBM&#039;&#039;-ов дигитални имуни систем из [[Заштита података/Јун 2022#9. zadatak|деветог задатка са јунског рока 2022. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/ZP/ZP%20jun%202022%20zadatak%209.drawio Изворна &#039;&#039;draw.io&#039;&#039; датотека]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_jul_2021_zadatak_10.svg&amp;diff=6651</id>
		<title>Датотека:ZP jul 2021 zadatak 10.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_jul_2021_zadatak_10.svg&amp;diff=6651"/>
		<updated>2023-09-30T23:31:02Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = PGP дијаграм из [[Заштита података/Јул 2021#10. zadatak|10. задатка са јулског испитног рока 2021. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/ZP/ZP%20jul%202021%20zadatak%2010.drawio Изворни draw.io дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_K2_2023_grupa_2_zadatak_1.svg&amp;diff=6650</id>
		<title>Датотека:ZP K2 2023 grupa 2 zadatak 1.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_K2_2023_grupa_2_zadatak_1.svg&amp;diff=6650"/>
		<updated>2023-09-30T23:31:01Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Шема из [[Заштита података/К2 2023#1. zadatak 2|првог задатка за другу групу на другом колоквијуму 2023. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/ZP/ZP%20K2%202023%20grupa%202%20zadatak%201.drawio Изворни &#039;&#039;draw.io&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_K_2022_zadatak_4_%C5%A1ema_C.svg&amp;diff=6649</id>
		<title>Датотека:ZP K 2022 zadatak 4 šema C.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_K_2022_zadatak_4_%C5%A1ema_C.svg&amp;diff=6649"/>
		<updated>2023-09-30T23:30:59Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Шема Ц из [[Заштита података/К 2022#4. zadatak|четвртог задатка са колоквијума за РТИ 2022. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/ZP/ZP%20K%202022%20zadatak%204.drawio Изворни &#039;&#039;draw.io&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_K_2022_zadatak_4_%C5%A1ema_B.svg&amp;diff=6648</id>
		<title>Датотека:ZP K 2022 zadatak 4 šema B.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_K_2022_zadatak_4_%C5%A1ema_B.svg&amp;diff=6648"/>
		<updated>2023-09-30T23:30:58Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Шема Б из [[Заштита података/К 2022#4. zadatak|четвртог задатка са колоквијума за РТИ 2022. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/ZP/ZP%20K%202022%20zadatak%204.drawio Изворни &#039;&#039;draw.io&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_K_2022_zadatak_4_%C5%A1ema_A.svg&amp;diff=6647</id>
		<title>Датотека:ZP K 2022 zadatak 4 šema A.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:ZP_K_2022_zadatak_4_%C5%A1ema_A.svg&amp;diff=6647"/>
		<updated>2023-09-30T23:30:57Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Шема А из [[Заштита података/К 2022#4. zadatak|четвртог задатка са колоквијума за РТИ 2022. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/ZP/ZP%20K%202022%20zadatak%204.drawio Изворни &#039;&#039;draw.io&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:VIS_K1_2023_zadatak_4_grafik.svg&amp;diff=6646</id>
		<title>Датотека:VIS K1 2023 zadatak 4 grafik.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:VIS_K1_2023_zadatak_4_grafik.svg&amp;diff=6646"/>
		<updated>2023-09-30T23:30:56Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = График функције расподеле у [[Вероватноћа и статистика/К1 2023#4. задатак|шестом задатку са првог колоквијума 2023. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/VIS/jan-2023.py Скрипта за генерисање дијаграма]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:URV_jun_2018_zadatak_3_dijagram.svg&amp;diff=6645</id>
		<title>Датотека:URV jun 2018 zadatak 3 dijagram.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:URV_jun_2018_zadatak_3_dijagram.svg&amp;diff=6645"/>
		<updated>2023-09-30T23:30:55Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = GRAFCET дијаграм из [[Управљање у реалном времену/Питања#Jun 2018 3|трећег задатка из јунског рока 2018. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/URV/URV%20jun%202018%20zadatak%203%20dijagram.drawio Изворни &#039;&#039;draw.io&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:RM2_pitanja_VPN_2.svg&amp;diff=6644</id>
		<title>Датотека:RM2 pitanja VPN 2.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:RM2_pitanja_VPN_2.svg&amp;diff=6644"/>
		<updated>2023-09-30T23:30:54Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Мрежа из [[Рачунарске мреже 2/Питања#Pitanje 28 2|питања 28. из VPN дела базе питања]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/RM2/RM2%20pitanja%20VPN.drawio Изворни draw.io дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:RM2_pitanja_VPN_1.svg&amp;diff=6643</id>
		<title>Датотека:RM2 pitanja VPN 1.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:RM2_pitanja_VPN_1.svg&amp;diff=6643"/>
		<updated>2023-09-30T23:30:53Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Мрежа из [[Рачунарске мреже 2/Питања#Pitanje 26 2|питања 26. из VPN дела базе питања]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/RM2/RM2%20pitanja%20VPN.drawio Изворни draw.io дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:RM1_jun_2021_zadatak_4A.svg&amp;diff=6642</id>
		<title>Датотека:RM1 jun 2021 zadatak 4A.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:RM1_jun_2021_zadatak_4A.svg&amp;diff=6642"/>
		<updated>2023-09-30T23:30:52Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Реконструкција [[Рачунарске мреже 1/Јун 2021#Grupa 4A|слике задатка 4А из јунског испитног рока 2021. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/RM1/RM1%20jun%202021%20zadatak%204A.drawio Изворна draw.io датотека]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2022_zadatak_2_dopunjeno.svg&amp;diff=6641</id>
		<title>Датотека:PSI jun 2022 zadatak 2 dopunjeno.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2022_zadatak_2_dopunjeno.svg&amp;diff=6641"/>
		<updated>2023-09-30T23:30:50Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Дијаграм из решења другог задатка у [[ПСИ/Јун 2022|јунском року 2022. године]].&lt;br /&gt;
| license     = permission&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/PSI/jun2022/rafting.mdj Изворни &#039;&#039;StarUML&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2022_dijagram.svg&amp;diff=6640</id>
		<title>Датотека:PSI jun 2022 dijagram.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2022_dijagram.svg&amp;diff=6640"/>
		<updated>2023-09-30T23:30:49Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Дијаграм секвенце из решења трећег задатка на [[ПСИ/Јун 2022|јунском року 2022. године]], последња ставка.&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/PSI/jun2022/rafting.mdj Изворни &#039;&#039;StarUML&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2022_zadatak_2.svg&amp;diff=6639</id>
		<title>Датотека:PSI jun 2022 zadatak 2.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2022_zadatak_2.svg&amp;diff=6639"/>
		<updated>2023-09-30T23:30:48Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Дијаграм из поставке другог задатка у [[ПСИ/Јун 2022|јунском року 2022. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/PSI/jun2022/rafting.mdj Изворни &#039;&#039;StarUML&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2022_Django.zip&amp;diff=6638</id>
		<title>Датотека:PSI jun 2022 Django.zip</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2022_Django.zip&amp;diff=6638"/>
		<updated>2023-09-30T23:30:47Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Целокупан практични део [[ПСИ/Јун 2022|јунског испита 2022. године]] писан у &#039;&#039;Django&#039;&#039; радном оквиру са &#039;&#039;Selenium IDE&#039;&#039; тестовима и &#039;&#039;StarUML&#039;&#039; моделом.&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/PSI/jun2022 Репозиторијум кода]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2020_dijagram_slu%C4%8Dajeva_kori%C5%A1%C4%87enja.svg&amp;diff=6637</id>
		<title>Датотека:PSI jun 2020 dijagram slučajeva korišćenja.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2020_dijagram_slu%C4%8Dajeva_kori%C5%A1%C4%87enja.svg&amp;diff=6637"/>
		<updated>2023-09-30T23:30:46Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Дијаграм случајева коришћења из решења [[ПСИ/Јун 2020#3. задатак|прве ставке трећег задатка у јунском року 2020. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/PSI/jun2020/model.mdj Изворни &#039;&#039;StarUML&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
	<entry>
		<id>https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2020_dijagram_sekvence.svg&amp;diff=6636</id>
		<title>Датотека:PSI jun 2020 dijagram sekvence.svg</title>
		<link rel="alternate" type="text/html" href="https://siwiki.rs/w/index.php?title=%D0%94%D0%B0%D1%82%D0%BE%D1%82%D0%B5%D0%BA%D0%B0:PSI_jun_2020_dijagram_sekvence.svg&amp;diff=6636"/>
		<updated>2023-09-30T23:30:45Z</updated>

		<summary type="html">&lt;p&gt;KockaBot: Замена линкова до etf.kocka.tech са GitHub линковима&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{file&lt;br /&gt;
| description = Дијаграм секвенце из решења [[ПСИ/Јун 2020#3. задатак|прве ставке трећег задатка у јунском року 2020. године]].&lt;br /&gt;
| license     = self&lt;br /&gt;
| author      = [[Корисник:KockaAdmiralac|Лука Симић]]&lt;br /&gt;
| source      = [https://github.com/KockaAdmiralac/ETF/blob/master/PSI/jun2020/model.mdj Изворни &#039;&#039;StarUML&#039;&#039; дијаграм]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>KockaBot</name></author>
	</entry>
</feed>