137
1

Ajzenhamer Nikola · (q 1)2: Primetimo prvo da je prvi clan (za i= 0) sume Pn i=0 iqi 1 jednak nuli, te mo zemo napisati Pn i=0 i iq 1 = n i=1 iqi 1. Koriste ci ovu napomenu, uz mno

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

  • 1

  • Ajzenhamer Nikola

    Konstrukcija i analizaalgoritama 2

    — Zadaci sa vežbi —

    4. februar 2018.

  • Sadržaj

    Predgovor iii

    1 Uvod 11.1 Sumiranja. Rekurentne jednačine. Analiza asimptotske složenosti . . . . . . . . . 11.2 Strategije konstrukcije algoritama . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    2 Geometrijski algoritmi 11

    3 Napredne strukture podataka i algoritmi sortiranja 253.1 AVL stabla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.2 Day-Stout-Warren algoritam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363.3 Sufiksna stabla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.4 Napredni algoritmi sortiranja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    3.4.1 Sortiranje razvrstavanjem . . . . . . . . . . . . . . . . . . . . . . . . . . . 423.4.2 Sortiranje vǐsestrukim razvrstavanjem . . . . . . . . . . . . . . . . . . . . 42

    4 Probabilistički algoritmi 45

    5 Grafovski algoritmi 515.1 Problem uparivanja u grafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515.2 Transportne mreže . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545.3 Hamiltonovi grafovi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    6 Redukcije 65

    7 Pretraga i grananje sa odsecanjem 69

    8 Paralelni algoritmi 758.1 Uvodni zadaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768.2 Paralelni problem prefiksa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808.3 Paralelni algoritmi sa povezanim listama . . . . . . . . . . . . . . . . . . . . . . . 838.4 Tehnika Ojlerovog obilaska . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858.5 Paralelni algoritmi za mreže računara . . . . . . . . . . . . . . . . . . . . . . . . 86

    9 Dodatni algoritmi 939.1 Nalaženje dve najdalje tačke u datom skupu od n tačaka u ravni . . . . . . . . . 939.2 Ukonenov algoritam za formiranje sufiksnog stabla . . . . . . . . . . . . . . . . . 96

    9.2.1 Naivni algoritam za formiranje sufiksnog stabla . . . . . . . . . . . . . . . 969.2.2 Algoritam za formiranje sufiksnog stabla u linearnom vremenu . . . . . . 97

    9.3 Sortiranje prosečne linearne složenosti . . . . . . . . . . . . . . . . . . . . . . . . 1079.4 Minimiziranje maksimalne sume uzastopna tri broja na krugu . . . . . . . . . . . 109

    9.4.1 Uvod u linearno programiranje . . . . . . . . . . . . . . . . . . . . . . . . 109

    i

  • SADRŽAJ ii

    9.4.2 Minimiziranje maksimalne sume uzastopna tri broja na krugu . . . . . . . 1109.5 Suočavanje sa NP-kompletnošću . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

    9.5.1 Dokaz nepostojanja približnog algoritma za rešavanje (opšteg) problematrgovačkog putnika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

    9.6 Dokaz NP-kompletnosti problema “zbir podskupa” . . . . . . . . . . . . . . . . . 1129.7 Približni algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

    9.7.1 Približni algoritmi za rešavanje problema minimalnog pokrivanja skupa . 1159.7.2 Približni algoritmi za rešavanje problema zbira podskupa . . . . . . . . . 118

    Literatura 123

    A Liste slika i tabela 125

  • Predgovor

    Ovaj tekst predstavlja skriptu iz predmeta’’Konstrukcija i analiza algoritama 2”, na Mate-

    matičkom fakultetu Univerziteta u Beogradu, zasnovanu na materijalima Vesne Marinković sačasova vežbi iz istog kursa i knjizi “Algoritmi” profesora Miodraga Živkovića [1]. Skripta jeprateći materijal pre svega studentima koji ovaj kurs slušaju u okviru svojih studija, ali i svimaVama koji biste želeli da se upoznate sa ovom tematikom. Ovaj materijal ne može zamenitipohadanje vežbi niti drugu preporučenu literaturu.

    Tekst je formiran kroz poglavlja koji obraduju jednu od naprednih podoblasti algoritmike, au okviru poglavlja se eventualno nalaze sekcije koje obraduju odgovarajuće teme u datoj podo-blasti. U značajnom delu teksta nije data teorijska podloga za teme koje slede, ali ipak, autorje odlučio da u nekim delovima uvede čitaoca u podoblast, tamo gde smatra da je to značajno.Kao teorijska osnova za sve podoblasti može se koristiti pomenuta knjiga [1], odakle su i preuzetiodgovarajući delovi.

    Tekst u ovoj skripti je izložen kroz niz zadataka i rešenja, kroz koje se čitalac upoznaje satematikom koja se obraduje. Svaki novi koncept se uvodi ili kroz kratku teorijsku napomenu ilikroz uvodni zadatak. Veliki broj zadataka koji slede takvim konceptima koriste iskustvo steknutou prethodnim zadacima, te se čitaoci ohrabruju da prvobitno sami pokušaju da dodu do rešenja,a tek onda da obrate pažnju na predloženo rešenje.

    Prilikom izrade odredenih figura korǐsćen je programski sistem Dia. Spisak slika generisanihovim sistemom može se pronaći u dodatku A. Za vǐse informacija o programskom sistemu Dia,posetite http://dia-installer.de/.

    Ukoliko ste pažljivi čitalac ove skripte, i ukoliko uočite bilo kakvu grešku ili propust, možetese javiti autoru na [email protected]. Svi komentari, sugestije, kritike, ali i pohvalevezane za ovaj materijal su dobrodošli.

    Autor

    iii

    http://www.matf.bg.ac.rs/~vesnamhttp://www.matf.bg.ac.rs/~ezivkovmhttp://dia-installer.de/

  • Glava 1

    Uvod

    U ovom poglavlju ćemo se osvrnuti na nekoliko osnovnih zadataka iz analize algoritama itime obnoviti ovu oblast. Razmatraćemo pristupe rešavanja različitih matematičkih zadataka,kao što su sumiranja, rekurentne jednačine i asimptotska ponašanja.

    1.1 Sumiranja. Rekurentne jednačine. Analiza asimptot-ske složenosti

    Zadatak 1.1. Dokazati jednakostn∑i=0

    qi =qn+1 − 1q − 1

    .

    Rešenje: Raspǐsimo sumu S(n) =n∑i=0

    qi kao

    1 + q + q2 + . . .+ qn = S(n).

    Množenjem prethodne jednakosti brojem q, a zatim dodavanjem broja 1 dobijamo jednakost

    1 + q + q2 + . . .+ qn + qn+1 = qS(n) + 1.

    Uočimo da je zbir prvih n+ 1 članova leve strane prethodne jednakosti jednak S(n), tj.

    S(n) + qn+1 = qS(n) + 1.

    Grupisanjem članova koji sadrže S(n), iz prethodne jednakosti dobijamo

    qn+1 − 1 = qS(n)− S(n), tj.qn+1 − 1 = (q − 1)S(n),

    odakle se dobija

    S(n) =qn+1 − 1q − 1

    ,

    što je i trebalo dokazati. ♣

    Zadatak 1.2. Dokazati jednakostn∑i=1

    i · 2i = (n− 1)2n+1 + 2.

    1

  • GLAVA 1. UVOD 2

    Rešenje: Za rešavanje ovog zadatka, koristićemo jednakostn∑i=0

    qi =qn+1 − 1q − 1

    koju smo dokazali

    u zadatku 1.1. Dakle, počinjemo od

    n∑i=0

    qi =qn+1 − 1q − 1

    .

    Diferenciranjem prethodne jednakosti po promenljivoj q, dobijamo jednakost

    n∑i=0

    i · qi−1 = (n+ 1) · qn · (q − 1)− (qn+1 − 1) · 1

    (q − 1)2,

    odnosno, odgovarajućim sredivanjem brojioca na desnoj strani jednakosti, dobijamo

    n∑i=0

    i · qi−1 = n · qn+1 − (n+ 1) · qn + 1

    (q − 1)2.

    Primetimo prvo da je prvi član (za i = 0) sumen∑i=0

    i · qi−1 jednak nuli, te možemo napisatin∑i=0

    i · qi−1 =n∑i=1

    i · qi−1. Koristeći ovu napomenu, uz množenje prethodne jednakosti brojem q,

    dobijamo jednakostn∑i=1

    i · qi = n · qn+2 − (n+ 1) · qn+1 + q

    (q − 1)2.

    Uvodenjem smene q = 2 u prethodnoj jednakosti, a zatim sredivanjem desne strane jednakosti,dobijamo niz jednakosti

    n∑i=1

    i · 2i = n · 2n+2 − (n+ 1) · 2n+1 + 2

    (2− 1)2=

    = n · 2n+2 − (n+ 1) · 2n+1 + 2 == 2n · 2n+1 − (n+ 1) · 2n+1 + 2 == (n− 1) · 2n+1 + 2.

    Zadatak 1.3. Dokazati jednakostn∑i=1

    i · 2n−i = 2n+1 − n− 2.

    Rešenje: Da bismo dokazali ovu jednakost, prvo ćemo uvesti smenu j = n−i, odnosno, i = n−j.Time se dobija naredna jednakost

    n∑i=1

    i · 2n−i =n−1∑j=0

    (n− j) · 2j .

    Razdvajanjem sume sa desne strane prethodne jednakosti dobijamo jednakost

    n−1∑j=0

    (n− j) · 2j = n ·n−1∑j=0

    2j −n−1∑j=1

    j · 2j .

  • GLAVA 1. UVOD 3

    Primenjujući jednakost dokazanu u zadatku 1.1 na prvu sumu, uz smenu q = 2, i jednakostdokazanu u zadatku 1.2 na drugu sumu, sve sa desne strane prethodne jednakosti, a zatimsredivanjem, dobijamo niz jednakosti

    n−1∑j=0

    (n− j) · 2j = n · 2n − 12− 1

    − (n− 2) · 2n − 2 =

    = n · (2n − 1)− (n− 2) · 2n − 2 == 2n+1 − n− 2.

    Zadatak 1.4. Rešiti rekurentnu jednačinu

    T (n) = 3T(n

    2

    )+ n2 − n, n ≥ 2,

    za koju važi T (1) = 1.

    Rešenje: Rekurentnim raspisivanjem date jednačine možemo uočiti zakonitost, kao u nizu jed-nakosti

    T (n) = 3T(n

    2

    )+ n2 − n =

    = 3

    (3T(n

    4

    )+(n

    2

    )2− n

    2

    )+ n2 − n =

    = 32T(n

    4

    )+

    3

    4n2 + n2 − 3

    2n− n =

    = 32T

    (3T(n

    8

    )+(n

    4

    )2− n

    4

    )+

    3

    4n2 + n2 − 3

    2n− n =

    = 33T(n

    8

    )+

    32

    42n2 +

    3

    4n2 + n2 − 3

    2

    22n− 3

    2n− n =

    = . . . =

    = 3iT( n

    2i

    )+ n2 ·

    i−1∑j=0

    (3

    4

    )j− n ·

    i−1∑j=0

    (3

    2

    )j.

    Uvodenjem smene i = log2 n u prethodnoj jednakosti, dobijamo jednakost

    T (n) = 3log2 nT( n

    2log2 n

    )+ n2 ·

    log2 n−1∑j=0

    (3

    4

    )j− n ·

    log2 n−1∑j=0

    (3

    2

    )j.

    Korǐsćenjem jednakosti

    T( n

    2log2 n

    )= T

    (nn

    )= T (1) = 1,

    pri čemu poslednja jednakost sledi iz uslova zadatka, kao i jednakosti dokazane u zadatku 1.1, azatim daljim sredivanjem, dobijamo niz jednakosti

    T (n) = 3log2 n · 1 + n2 ·(34

    )log2 n − 134 − 1

    − n ·(32

    )log2 n − 132 − 1

    =

    = 3log2 n − 4n2 · 3log2 n

    22 log2 n+ 4n2 − 2n · 3

    log2 n

    2log2 n+ 2n =

  • GLAVA 1. UVOD 4

    = 3log2 n − 4n2 · 3log2 n

    n2+ 4n2 − 2n · 3

    log2 n

    n+ 2n =

    = 3log2 n − 4 · 3log2 n + 4n2 − 2 · 3log2 n + 2n == 4n2 + 2n− 5 · 3log2 n == 4n2 + 2n− 5 · nlog2 3,

    pri čemu poslednja jednakost sledi iz niza ekvivalentnih jednakosti

    log2 n = log2 n

    log2 3 · log2 n = log2 n · log2 3log2 n

    log2 3 = log2 3log2 n,

    odakle se dobija 3log2 n = nlog2 3. ♣

    Pretpostavimo da nam je cilj analiza algoritma A, pri čemu broj operacija T (n) pri primenialgoritma A na ulaz veličine n (vremenska složenost) zadovoljava rekurentnu jednačinu tipa

    T (n) = aT(nb

    )+ cnk (1.1)

    pri čemu je a, b, c, k ≥ 0, b 6= 0, i zadata je vrednost T (1). Ovakva jednačina dobija se zaalgoritam kod koga se obrada ulaza veličine n svodi na obradu a ulaza veličine nb , posle čega jepotrebno izvršiti još cnk koraka da bi se od parcijalnih rešenja konstruisalo rešenje kompletnogulaza veličine n. Jasno je zašto se za ovakve algoritme kaže da su tipa “zavadi pa vladaj”,(engleski divide-and-conquer), kako se još zovu algoritmi zasnovani na dekompoziciji. Obično jeu ovakvim rekurentnim jednačinama b prirodan broj.

    Teorema 1 (Master teorema). Asimptotsko ponašanje niza T (n), rešenja rekurentne jednačine1.1 dato je jednakošću

    T (n) =

    O(nlogb a), za a > bk

    O(nk log n), za a = bk

    O(nk), za a < bk

    Zadatak 1.5. Oceniti složenost rekurentne jednačine date u zadatku 1.4.

    Rešenje: Složenost rekurentne jednačine možemo oceniti na dva načina:

    1. Rešavanjem rekurentne jednačine, a zatim analiziranjem rešenja i ustanovljavanjem njenogasimptotskog ponašavanja, i

    2. Korǐsćenjem teoreme 1.

    Prikažimo oba načina ocenjivanja:

    1. Već smo videli rešavanjem zadatka 1.4, da rekurentna jednačina

    T (n) = 3T(n

    2

    )+ n2 − n, n ≥ 2, T (1) = 1

    ima rešenje

    T (n) = 4n2 + 2n− 5 · nlog2 3.

    Primetimo da je log2 3 ∈ [1, 2], pa je najuticajniji sabirak u prethodnoj jednakosti član 4n2.Time dobijamo da je složenost rekurentne jednačine O(n2).

  • GLAVA 1. UVOD 5

    2. Posmatranjem rekurentne relacije

    T (n) = 3T(n

    2

    )+ n2 − n, n ≥ 2, T (1) = 1

    kao i rekuretne relacije iz teoreme 1, dolazimo do zaključka da je a = 3, b = 2 i k = 2. Kakovaži a < bk (jer je 3 < 22), to zaključujemo da je složenost rekuretne jednačine O(n2).

    Zadatak 1.6. Odrediti asimptotsko ponašanje rešenja jednačine

    T (n) = 2T

    (⌊n

    log2 n

    ⌋)+ 3n, n > 2

    za koju važi T (1) = 1, T (2) = 2, tj. odrediti funkciju f(n) tako da važi T (n) = Θ(f(n)).

    Rešenje: Prisetimo se da važi T (n) = Θ(f(n)) ako i samo ako a · f(n) ≤ T (n) ≤ b · f(n), pričemu je n ≥ N, a ≤ b za neke a, b,N ∈ N. Prvo ćemo pokušati analiziranjem date jednačine daodredimo red funkcije f(n). Primetimo da (asimptotski posmatrano) važi

    2T

    (⌊n

    log2 n

    ⌋)+ 3n < 2T

    (nc

    )+ 3n, c ≥ 2

    odnosno, da će T (n) asimptotski rasti “sporije” od izraza sa desne strane nejednakosti. Kakovaži c ≥ 2, to korǐsćenjem teoreme 1 dobijamo da je asimptotsko ponašanje izraza sa desnestrane nejednakosti najvǐse O(n log n). Sada možemo zaključiti da će asimptotsko ponašanjeT (n) biti linearno (ili eventualno, sublinearno, ali neposrednim posmatranjem izraza T (n) možese zaključiti da neće biti sublinearno). Dakle, treba pokazati da je f(n) = n.

    Prvo, primetimo da važi T (n) ≥ 3n, za svako n > 21. Drugo, primetimo da je T (n) rastućafunkcija2. Odredimo sada gornje ograničenje, tj. odrediti b, tako da važi

    T (n) ≤ b · n

    za neko n ≥ N, N ∈ N. Zamenom izraza T (n) u prethodnu nejednakost dobijamo

    2T

    (⌊n

    log2 n

    ⌋)+ 3n ≤ b · n.

    Može se pokazati da je T

    (⌊n

    log2 n

    ⌋)≤ b′ · bnc3, čime dobijamo nejednakosti

    2T

    (⌊n

    log2 n

    ⌋)+ 3n ≤ 2b′ ·

    ⌊n

    log2 n

    ⌋+ 3n ≤ 2b′ · n

    log2 n+ 3n,

    pri čemu je očigledna poslednja nejednakost. Dakle, treba pokazati

    2b′ · nlog2 n

    + 3n ≤ b · n,

    za neke b, b′ ∈ N. Neka je b′ = b. Tada dobijamo niz ekvivalentnih nejednakosti

    2b · nlog2 n

    + 3n ≤ b · n

    1Ova činjenica se može pokazati potpunom matematičkom indukcijom. Čitalac se ohrabruje da dokaže ovunejednakost za vežbu.

    2I ova činjenica se može pokazati matematičkom indukcijom nejednakosti T (n) < T (n+ 1). Ponovo, čitalac seohrabruje da ovo dokaže samostalno.

    3Ponovo, primenom potpune matematičke indukcije.

  • GLAVA 1. UVOD 6

    n · 2blog2 n

    ≤ (b− 3)n

    log2 n ≥2b

    b− 3.

    Možemo birati bilo kakav broj b ∈ N, takav da važi poslednja nejednakost, za neko n ≥ N, N ∈ N.Neka je, na primer, b = 9. Dobijamo nejednakost

    log2 n ≥ 3,

    koja važi za n ≥ 8 (odnosno, N = 8). Zaključujemo da važi

    3n ≤ T (n) ≤ 9n, n ≥ 8,

    tj. T (n) = Θ(n). ♣

    1.2 Strategije konstrukcije algoritama

    Zadatak 1.7. Svaki pozitivni razlomak manji od 1 se može izraziti kao zbir različitih raz-lomaka sa jediničnim brojiocem, na primer

    87

    100=

    1

    2+

    1

    5+

    1

    11.

    Ovakva reprezentacija je korǐsćena od strane starih Egipćana i zato se naziva Egipatskimrazlomcima. Naravno, dati razlomak može imati vǐse od jedne ovakve reprezentacije. Kon-struisati pohlepni algoritam koji nalazi reprezentaciju Egipatskim razlomcima za svako r =mn , m < n. Pokazati zaustavljanje predloženog algoritma. Kolika je složenost algoritma?

    Rešenje: Pri svakoj konstrukciji algoritama prvo je neophodno definisati ulaz i izlaz. Ulaz ovogalgoritma predstavlja razlomak r = mn , odnosno, možemo reći da ulaz čine prirodni brojevi m

    i n. Izlaz iz algoritma predstavlja skup razlomaka { 1k1 ,1k2, . . . , 1kr }, takav da je

    mn =

    r∑i=1

    1ki

    .

    Radi jednostavnosti, možemo za izlaz posmatrati skup S = {k1, k2, . . . , kr}, tj. skup imenilacatraženih razlomaka.

    Sledeći korak predstavlja pronalaženje rešenja. Ideja iza pohlepnog rešenja ovog problemajeste da pokušavamo da od zadatog razlomka oduzimamo najveći razlomak sa jediničnim brojio-cem koji možemo, pri čemu ažuriramo skup imenilaca od razlomaka sa jediničnim brojiocem kojesmo oduzimali od tekuće vrednosti datog razlomka. Postupak ćemo ponavljati sve dok razlomakne bude jednak nuli, što će biti slučaj kada je brojilac jednak nuli.

    Razmotrimo opisane korake. Prvo, trebalo bi pronaći najveći razlomak od kojeg možemooduzeti trenutnu vrednost datog razlomka, tj. biramo najveći razlomak 1k ≤

    mn , odnosno, biramo

    najmanje (celobrojno!) k takvo da je k ≥ nm . Odavde se jasno vidi da za vrednost k mora bitiuzeta

    ⌈nm

    ⌉. Kako ažuriramo vrednosti m i n? Iz jednakosti

    m

    n− 1k

    =mk − nnk

    ,

    zaključujemo da se brojilac ažurira na vrednost mk − n, a imenilac na vrednost nk.Naredni pseudokôd daje algoritamski prikaz opisanog rešenja.

    Algoritam: Egipatski_razlomci(m,n)Ulaz: m (brojilac razlomka), n (imenilac razlomka)

    Izlaz: S (skup vrednosti k tako da 1k ulazi u datu reprezentaciju)begin

  • GLAVA 1. UVOD 7

    S := ∅;while (m > 0) do

    k :=⌈nm

    ⌉;

    S := S ∪ {k};m := mk − n;n := nk;

    return S;end.

    Dokažimo da se predloženi algoritam zaustavlja. Da bismo to dokazali, treba da pokažemoda će brojilac u nekom trenutku imati vrednost nula. Prvo, prisetimo se da računamo k takvoda je k ≥ nm , odnosno, mk − n ≥ 0. Odavde zaključujemo da brojilac nikad neće biti negativnavrednost. Drugo, znamo da za k ∈ N, nm ∈ Q

    4 važi

    k =⌈ nm

    ⌉ako i samo ako

    n

    m≤ k < n

    m+ 1.

    Ako od nejednakosti k <n

    m+ 1 oduzmemo broj 1, a zatim pomnožimo brojem m, nakon čega

    dobijenoj nejednakosti dodamo izraz m− n, dobijamo nejednakost

    mk − n < m,

    odakle zaključujemo da je novi brojilac uvek strogo manji od prethodnog. Dakle, niz brojilacakoji dobijamo je nenegativan i strogo opada, te zaključujemo da dostiže vrednost nula. Dakle,algoritam se zaustavlja.

    Razmotrimo složenost ovog algoritma. Kako se brojilac stalno smanjuje, to očekujemo da je|S| najvǐse m. Odatle možemo zaključiti da su vremenska i prostorna složenost O(m). ♣

    Zadatak 1.8. Za dati broj dinara x, koji je izmedu 0 i 99, treba vratiti x u apoenima od1, 5, 10 i 25 dinara koristeći minimalan broj novčića. Konstruisati pohlepni algoritam zarešavanje ovog problema.

    Šta ako su nam na raspolaganju apoeni od 1, 5 i 12 dinara? Preciznije, okarakterisatikakav treba biti skup vrednosti kojima predstavljamo proizvoljan broj x u nekom zadatomopsegu, da bi pohlepni algoritam dao rešenje sa minimalnim brojem novčića.

    Rešenje: Za rešavanje ovog problema primenićemo princip sličan onom iz zadatka 1.7. Naime,da bismo konstruisali pohlepan algoritam za vraćanje kusura, prirodno se nameće da prvo vratimodeo kusura u najvećem apoenu koji možemo (naravno, apoena može biti vǐse). Na primer, akoimamo uslove zadate u zadatku, za x = 47, vratićemo kusur 1×25, 2×10 i 2×1, pri čemu br× coznačava br novčanica/kovanica u apoenu vrednosti c.

    Naredni pseudokôd daje algoritamski prikaz opisanog rešenja.

    Algoritam: Vracanje_kusura(S, a)Ulaz: S (iznos koji treba da vratimo), a (niz vrednosti novčića)Izlaz: vraćamo broj novčića od svake od vrednosti

    begin

    while S > 0 doc := vrednost najveće kovanice koja nije veća od S;br := S div c;vraćamo br novčića vrednosti c;S := S − br · c;

    end.

    4Ekvivalencija važi i pod nešto slabijim uslovima, tj. za k ∈ N, r ∈ R važi k = dre ako i samo ako r ≤ k < r+1.

  • GLAVA 1. UVOD 8

    Razmotrimo sada osobine ovog algoritma. Prvo, nije teško zaključiti da ukoliko skup apoenasadrži 1, rešenje će uvek postojati. Postavlja se pitanje optimalnosti ovog algoritma. Za skupapoena {1, 5, 12}, ukoliko treba da vratimo kusur x = 15, predloženi algoritam će vratiti kusur1× 12 i 3× 1 (što je 4 kovanice), dok je optimalno rešenje 3× 5 (3 kovanice). Dakle, od skupaapoena zavisi optimalnost algoritma. Ispostavlja se da u slučaju skupa apoena {1, 5, 10, 25},predloženi algoritam uvek daje optimalno rešenje. ♣

    Zadatak 1.9. Konstruisati algoritam zasnovan na dekompoziciji koji izračunava Fibonačijevebrojeve. Koristiti (pre toga dokazati) da važe jednakosti F2k−1 = (Fk)

    2 + (Fk−1)2 i F2k =

    (Fk)2 + 2 · Fk · Fk−1. Kolika je složenost datog algoritma?

    Rešenje: Prisetimo se da Fibonačijevi brojevi čine rastuči niz opisan rekurentnom relacijom

    Fn = Fn−1 + Fn−2, n ≥ 2,

    pri čemu je F0 = 0 i F1 = 1. Koristićemo matematičku indukciju da dokažemo obe traženejednakosti. Ono što je zanimljivo jeste da se ove jednakosti jednostavno rešavaju ukoliko serešavaju simultano.

    Baza indukcije se dobija za k = 1, čime se jednakosti F2k−1 = (Fk)2 + (Fk−1)

    2 i F2k =(Fk)

    2 + 2 · Fk · Fk−1 transformǐsu u jednakosti F1 = F 21 + F 20 i F2 = F 21 + 2F1F0, redom, a kojesu trivijalno tačne (uvrštavanjem vrednosti F0 = 0, F1 = 1 i F2 = F1 + F0 = 1 + 0 = 1, obejednakosti se svode na 1 = 1). Pretpostavimo da važe jednakosti F2k−1 = (Fk)

    2 + (Fk−1)2 i

    F2k = (Fk)2 + 2 · Fk · Fk−1. Primenom rekuretne relacije Fn = Fn−1 + Fn−2 nad izrazom F2k+1,

    a zatim primenom induktivne pretpostavke i daljim sredivanjem, dobijamo niz jednakosti

    F2k+1 = F2k + F2k+1 =

    = (Fk)2 + 2FkFk−1 + (Fk)

    2 + (Fk−1)2 =

    = (Fk)2 + (Fk + Fk−1)

    2 =

    = (Fk)2 + (Fk+1)

    2,

    čime smo pokazali prvu jednakost. Slično dobijamo i drugu jednakost

    F2k+2 = F2k+1 + F2k =

    = (Fk)2 + (Fk+1)

    2 + (Fk)2 + 2FkFk−1 =

    = (Fk+1)2 + 2(Fk)

    2 + 2FkFk−1 =

    = (Fk+1)2 + 2Fk(Fk + Fk−1) =

    = (Fk+1)2 + 2Fk+1Fk.

    Ideja iza konstruisanja algoritma zasnovanog na dekompoziciji za računanje n-tog Fibonačijevogbroja jeste da, korǐsćenjem prethodne dve jednakosti, možemo svesti problem veličine n, na dvapotproblema veličine (grubo ocenjeno na) n2 , uz dodatni napor sakupljanja rešenja potproblemau konstantnom vremenu (u pitanju su dve ili tri operacije množenja i jedna operacija sabiranja,zavisno od jednakosti koja se koristi).

    Naredni pseudokôd daje algoritamski prikaz opisanog rešenja.

    Algoritam: Fibonačijev_broj(n)

    Ulaz: n (redni broj Fibonačijevog broja koji želimo da izračunamo)Izlaz: n-ti Fibonačijev brojbegin

    if (n == 0 || n == 1)return n;

    else

  • GLAVA 1. UVOD 9

    a := Fibonačijev_broj(n+12 );

    b := Fibonačijev_broj(n+12 − 1);if (n mod 2 == 0)

    return a · (a+ 2b);else

    return a · a+ b · b;end.

    Razmotrimo asimptotsko ponašanje algoritma. Kao što smo već rekli (a, dodatno, opisalialgoritmom), problem veličine n svodimo na dva potproblema veličine n2 , uz konstantni faktor.Time dolazimo do rekurentne relacije

    T (n) = 2T(n

    2

    )+ cn0,

    koja definǐse asimptotsko ponašanje predloženog algoritma. Koristeći teoremu 1, zaključujemoda je vremenska složenost algoritma O(n). Prostorna složenost je konstantna, za svaki pozivfunkcije Fibonačijev broj. ♣

    Zadatak 1.10. Dat je niz matrica A1, A2, . . . , An takvih da je matrica Ai dimenzije pi−1×pi. Konstruisati algoritam koji u proizvodu A1 ·A2 · . . . ·An rasporeduje zagrade tako da seminimizuje ukupan broj množenja brojeva.

    Rešenje: Za početak, podsetimo se da je vremenska složenost množenja matrica kubna5. Uve-dimo oznaku Ai..j = Ai·Ai+1·. . .·Aj . Ideja iza ovog algoritma će biti da izračuvanje Ai..j svedemona rešavanje Ai..k ·Ak+1..j , za i ≤ k < j, pri čemu je k odabrano takvo da u potproblemima imanajmanje množenja. Ovakav pristup problemu se naziva dinamičko programiranje.

    Neka je m[i, j] minimalni broj množenja skalara neophodnih za izračunavanje Ai..j . Dakle,ono što je nama neophodno da izračunamo je m[1, n]. Kako se računaju m[i, j]? Jasno je daće za i = j, vrednost m[i, j] biti jednaka 0. Za i < j, pronalazimo takvo k (i ≤ k < j) kojeminimizuje izraz

    m[i, k] +m[k + 1, j] + pi−1 · pk · pj .Naredni pseudokôd daje algoritamski prikaz opisanog rešenja.

    Algoritam: Redosled_množenja_matrica(p, n)Ulaz: p (niz dimenzija matrica), n (broj matrica)Izlaz: Element m[1, n] sadrži minimalnu vrednost broja množenja, a matrica s je

    takva da je s[i, j] = k ako na k-tom elementu delimo proizvodbegin

    for i := 1 to nm[i, i] := 0;

    for l := 2 to n /* l je dužina sekvence */for i := 1 to n− l + 1 /* i označava početnu tačku */

    j := i+ l − 1; /* j označava krajnju tačku */m[i, j] := ∞;for k := i to j − 1 /* k označava gde ide zagrada */

    q := m[i, k] +m[k + 1, j] + p[i− 1]p[k]p[j];if (q < m[i, j])

    m[i, j] := q;s[i, j] := k;

    end.

    5Pretpostavimo da se koristi naivni algoritam množenja matrica, pri čemu se množe matrice dimenzija p× q iq × r, te je složenost O(p · q · r).

  • GLAVA 1. UVOD 10

    Razmotrimo složenost predloženog algoritma. Prvo, prisetimo se da dinamičko programira-nje koristi matricu koja čuva podatke m[i, j], te je prostorna složenost kvadratna. Vremenskasloženost je kubna, jer za kvadratno mnogo elemenata imamo linearno računanje (zbog traženjak u slučaju i ≤ k < j, koje je linearno). ♣

  • Glava 2

    Geometrijski algoritmi

    Geometrijski algoritmi koji će biti izloženi u ovom delu teksta bave se poligonima sa n temena.Izuzećemo jednostavne algoritme iz analitičke geometrije kao što su odredivanje preseka dveprave, preseka dve duži, orijentacija trougla, i sl. Ukoliko čitalac želi da obnovi znanje iz ovakvihi sličnih algoritama, autor preporučuje [2], pre svega zbog odličnog izlaganja u knjizi, kao ičinjenice da je svaki algoritam teorijski potkovan.

    Zbog toga, u algoritmima koji slede, pretpostavka je da su pomenuti algoritmi poznati, tećemo u pisanju pseudokôdova slobodno pisati naredbe poput “izračunati ugao izmedu pravih pii pj”. Ono što treba napomenuti jeste da su takvi algoritmi konstantne složenosti. Dodatno, utekstu će biti pretpostavljeni najopštiji slučajevi, odnosno, nećemo se posebno baviti degenera-tivnim slučajevima. Na primer, ako su nam date tri tačke, pretpostavka je da nisu kolinearne.Svaki zadatak može biti trivijalno preformulisan da obuhvati i takve slučajeve. Započnimo ovopoglavlje narednom definicijom.

    Definicija 1 (Prost mnogougao). Prost mnogougao je onaj kod koga odgovarajući put nemapreseka sa samim sobom, tj. jedine ivice koje imaju zajedničke tačke su susedne ivice sa njihovimzajedničkim temenom.

    Na slici 2.1 prikazan je jedan prost mnogougao (levo) i jedan neprost mnogougao (desno).Vidimo da je mnogougao ABCDE prost jer svaki par ivica iz skupa {AB,BC, ..., EA} imanajvǐse jednu zajedničku tačku, pri čemu one koje imaju zajedničku tačku su susedne (AB i BC,BC i CD, . . ., EA i AB). Sa druge strane, mnogougao A′B′C ′D′E′ nije prost jer ivice A′B′ iD′E′, kao i B′C ′ i D′E′, imaju zajedničku tačku (F ′ i G′, redom), pri čemu one nisu susedne.

    A B

    C

    D

    E

    A′

    B′

    C ′

    D′E′

    F ′ G′

    Slika 2.1: Primer prostog (levo) i neprostog mnogougla (desno).

    11

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 12

    Zadatak 2.1. Neka je dato n tačaka u ravni. Konstruisati algoritam koji proizvodi prostmnogougao čija su temena zadate tačke.

    Rešenje: Za početak, nije teško uvideti da rešenje ne mora biti jedinstveno. Na slici 2.2 dat jeskup od pet tačaka koje se mogu povezati tako da formiraju dva različita prosta mnogougla.

    A

    B

    C

    DE

    A

    B

    C

    DE

    Slika 2.2: Primer skupa tačaka koji se može povezati na dva različita načina.

    Većina algoritama o kojima će biti reči započinju od neke ekstremne tačke, na primer, tačkakoja ima najveću x koordinatu, ili tačka koja ima najmanju y koordinatu, i sl. Ideju ćemo prvoprikazati slikovito, a zatim ćemo dati i pseudokôd algoritma. Posmatrajmo sliku 2.3 na kojoj jezadat skup tačaka. Pretpostavimo da smo odabrali tačku p1 za početnu tačku (na primer, zatošto ima najmanju y koordinatu). Trebalo bi da nam se prirodno nameće da odaberemo tačku p2sa kojom ćemo povezati p1 (naravno, postoje i alternative – p4 i p6).

    p1

    p2

    p3

    p4

    p5

    p6

    p1

    p2

    p3

    p4

    p5

    p6

    p1

    p2

    p3

    p4

    p5

    p6

    Slika 2.3: Primer formiranja prostog mnogougla od zadatog skupa tačaka.

    Kako da odaberemo narednu tačku? Jedan jednostavan način je da se povuku prave krozpočetnu tačku i svake od drugih tačaka, čime se formiraju prave −p1−p2−,−p1−p3−, . . . ,−p1−p6− (slika 2.3, sredina). Ideja je da krenemo “sa desna na levo”1 i na koju pravu −p1 − pi−“naidemo”, spojimo tačku pi sa prethodnom tačkom.

    Postavlja se pitanje kako da efikasno “nailazimo” na prave “sa desna na levo”. Zapravo,dovoljno je da za narednu pravu biramo onu pravu (odnosno, tačku koja će biti naredno temeu mnogouglu) koja gradi najmanji ugao sa nekom fiksiranom pravom, na primer, sa apscisnomosom. Ukoliko krenemo od tačke p1 na slici 2.3, onda je naredna tačka p2, pa zatim p3, . . . i nakraju završavamo tačkom p6. Rezultat je mnogougao na slici 2.3 (desno), koji je očigledno prost.

    Naredni pseudokôd daje algoritamski prikaz opisanog rešenja.

    1Jasno je da je ova formulacija neformalna jer su prave beskonačni geometrijski objekti, ali intuitivno bi trebaloda bude jasno o čemu je reč. Ukoliko pogledamo sliku 2.3, možemo privremeno da odgovarajuće prave posmatramokao duži.

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 13

    Algoritam: Prost_mnogougao(p1, p2, . . ., pn)Ulaz: p1, p2, . . . , pn (skup tačaka u ravni)Izlaz: P (prost mnogougao sa temenima p1, p2, . . . , pn)begin

    promeniti oznake tako da p1 ima minimalnu y koordinatu//ako ih ima više onda biramo onu sa maksimalnom x koordinatomfor i := 2 to n do

    izračunati ugao αi izmedu −p1 − pi− i apscisne osesortirati tačke prema uglovima α2, α3, . . . , αn// u grupi sa istim uglom, sortirati ih prema rastojanju od p1P je mnogougao definisan sortiranom listom tačaka

    end

    Razmotrimo složenost ovog algoritma. Osnovna komponenta vremenske složenosti ovog al-goritma potiče od sortiranja (sva ostala izračunavanja – menjanje oznaka i računanje uglova –složenosti su O(n)). Složenost algoritma je dakle O(n log n). ♣

    Definicija 2 (Konveksni mnogougao). Ako za proizvoljne dve tačke koje pripadaju unutrašnjostimnogougla važi da duž, čiji su krajevi te dve tačke, cela pripada unutrašnjosti mnogougla, ondatakav mnogougao nazivamo konveksnim mnogouglom.

    Definicija 3 (Konveksni mnogougao (alt.)). Ako su svi unutrašnji uglovi mnogougla manjiod π radijana, onda takav mnogougao nazivamo konveksnim mnogouglom.

    Na slici 2.4 data su dva mnogougla od kojih je jedan konveksan (levo), a drugi je nekonveksan(desno). Primetimo da je konveksnost ovih mnogouglova dobro definisana obema definicijama 2i 3.

    A B

    C

    D

    E

    A′

    B′

    C ′

    D′E′

    Slika 2.4: Primer konveksnog i nekonveksnog mnogougla.

    Definicija 4 (Konveksni omotač skupa tačaka). Konveksni omotač skupa tačaka je najma-nji2 konveksni mnogougao koji sadrži sve tačke skupa.

    Zadatak 2.2. Neka je dato n tačaka u ravni. Konstruisati algoritam koji proizvodi kon-veksni omotač zadatog skupa tačaka.

    Rešenje: Zadatak možemo preformulisati na sledeći način – odrediti podskup zadatog skupatačaka tako da taj podskup predstavlja najmanji konveksni mnogougao, a sve tačke zadatog skupatačaka koje nisu elementi tog podskupa se nalaze u unutrašnjosti tog mnogougla. Algoritam kojiće biti prikazan naziva se u literaturi pod imenom Grahamov algoritam [1, 2].

    2Pod najmanjim se smatra onaj koji ima najmanju površinu.

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 14

    Ideja je da krenemo od prostog mnogougla koji možemo dobiti algoritmom Prost mnogougaoiz zadatka 2.1, a zatim ćemo eliminisati tačke tako da dobijemo konveksan mnogougao. Naslici 2.5 zadat je skup tačaka (levo) i crvenom isprekidanom linijom označen prost mnogougaodobijen algoritmom Prost mnogougao i crnom punom linijom konveksan mnogougao koji sedobija eliminisanjem tačke p4.

    p1

    p2

    p3

    p4

    p5

    p6

    p1

    p2

    p3

    p4

    p5

    p6

    Slika 2.5: Dobijanje konveksnog omotača od prostog mnogougla.

    Kako odrediti tačke koje eliminǐsemo? Krenemo redom po nizu tačaka koje čine prost mno-gougao. Pri tome, pamtimo trenutni niz tačaka sve dok je tekući mnogougao koji se konstruǐsekonveksan. Kada ubacivanjem tačke dobijemo nekonveksan tekući mnogougao, odnosno, kadadobijemo unutrašnji ugao koji je veći od π radijana, onda eliminǐsemo tačku kod koje se nalaziugao koji je veći od π radijana i ažuriramo trenutni niz tako što se povežu tačke koje su bile su-sedne upravo eliminisanoj tački. Primetimo da se može desiti da se nekada vǐse tačaka uzastopnomogu eliminisati, pa zato u donjem algoritmu stoji while umesto if.

    Naredni pseudokôd daje algoritamski prikaz opisanog rešenja.

    Algoritam: Grahamov_algoritam(p1, p2, . . ., pn)Ulaz: p1, p2, . . . , pn (skup tačaka u ravni)Izlaz: q1, q2, . . . , qm (konveksni omotač tačaka p1, p2, . . . , pn)begin

    neka je p1 tačka sa minimalnom y koordinatom// ako ih ima više onda biramo onu sa maksimalnom x koordinatomuredujemo tačke algoritmom Prost_mnogougao(p1, p2, . . ., pn)q1 := p1;q2 := p2;q3 := p3;m := 3;for k := 4 to n do

    while ugao izmedu (−qm−1 − qm−,−qm − pk−) ≥ π do// ugao se meri iz unutrašnjosti mnogougla

    m := m− 1;m := m+ 1;qm := pk;

    end

    Složenost algoritma je, kao u algoritmu Prost mnogougao, reda O(n log n), zbog sortiranjakoje je asimptotski najsloženija komponenta. ♣

    Zadatak 2.3. Dokazati da u algoritmu Grahamov algoritam tačke p2 i pn moraju pripadatikonveksnom omotaču tačaka p1, p2, . . . , pn.

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 15

    Rešenje: Primetimo prvo da prave −p1 − p2− i −p1 − pn− zaklapaju najmanji i najveći ugaosa apscisnom osom, redom. Posmatrajmo tačku pn. Prepostavimo da ona ne pripada kon-veksnom omotaču. Bez gubitka opštosti, neka je, na primer, qm = pn−1. Prema algoritmuGrahamov algoritam, to bi onda značilo da je ugao izmedu (−p1−pn−,−pn−pn−1−) veći od π.To dakle znači da se tačka pn nalazi sa suprotne strane prave −p1 − pn−1−, odnosno, da prava−p1− pn− zaklapa manji ugao sa apsicsnom osom u odnosu na pravu −p1− pn−1− (videti sliku2.6). Kontradikcija. Analogno se pokazuje za tačku p2.

    p1

    p2

    p3

    p4

    p5

    p6

    p1

    p2

    p3

    p4

    p5

    p6

    Slika 2.6: Skica dokaza da se tačka pn nalazi u konveksnom omotaču dobijenom algoritmomGrahamov algoritam.

    Definicija 5 (Prava oslonca konveksnog mnogougla). Prava oslonca konveksnog mnogou-gla je prava koja sadrži barem jednu tačku mnogougla i sve ostale tačke mnogougla nalaze se saiste strane prave.

    Zadatak 2.4. Dat je konveksan mnogougao P0P1 . . . Pn−1 i tačka A van njega. Kako semogu konstruisati dve prave oslonca mnogougla kroz tačku A algoritmom složenosti O(log n)?

    Rešenje: Pokušajmo prvo da analiziramo algoritam grube sile. Prema takvom algoritmu, do-voljno je da za svaku tačku Pi razmotrimo ugao izmedu prave −A − Pi− i apscisne ose. Dveprave oslonca će biti one prave −A−Pi− koje grade najmanji i najveći ugao sa apscisnom osom(videti sliku 2.7). Složenost ovog algoritma je očigledno O(n). Dakle potreban nam je efikasnijialgoritam.

    P0

    P1

    P2

    P3

    P4

    A

    Slika 2.7: Algoritam grube sile za odredivanje dve prave oslonca.

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 16

    Indeksu i ∈ {0, 1, . . . , n − 1} pridružujemo veličinu ugla αi = ∠P0APi. Jasno je da je−π < αi < π. Neka je αn = 0. Ako su svi uglovi αi istog znaka (odnosno pozitivni, što semože pretpostaviti bez smanjenja opštosti), onda je AP0 prava oslonca, a druga prava APmodredena je temenom Pm za koje ugao αm ima najveću apsolutnu vrednost. Teme Pm nalazi sebinarnom pretragom intervala 1, 2, . . . , n−1, jer niz |αi| najpre raste, pa opada. U dve “srednje”tačke i, i+ 1 intervala indeksa posmatra se razlika uglova αi+1 − αi, pa

    • ako je pozitivna, onda je m ≥ i+ 1,

    • ako je negativna, onda je m ≤ i,

    • ako je αi+1 = αi, onda je, na primer, m = i, ali prava oslonca P0Pm sadrži celu stranicuPmPm+1.

    Ako pak nisu svi uglovi αi istog znaka (tj. kada odredujemo P0), onda postoje dve simetričnemogućnosti: uglovi rastu, opadaju, pa rastu, ili opadaju, rastu, pa opadaju. U oba slučaja sebinarnom pretragom nalaze dva susedna temena sa uglovima suprotnog znaka. Ta dva temenarazdvajaju interval indeksa na dva podintervala, u kojima se na opisani način (tražeći maksimalniugao po apsolutnoj vrednosti) pronalazi binarnom pretragom po jedna prava oslonca.

    S obzirom da osnovna komponenta vremenske složenosti ovog algoritma potiče od binarnepretrage, onda je ukupna složenost algoritma O(log n). ♣

    Zadatak 2.5. Dato je n tačaka u ravni i prava p. Konstruisati algoritam linearne složenostiza nalaženje prave paralelne pravoj p koja dati skup tačaka razbija na dva podskupa jednakeveličine (ako tačka leži na toj pravoj, može se uračunati u bilo koji od podskupova).

    Rešenje: Razmotrimo ponovo metodu grube sile. Za svaku tačku možemo u konstantnomvremenu izračunati rastojanje od prave p, koja ima jednačinu y = ax+ b. Zatim sortiramo tačkepo dobijenim rastojanjima i biramo sredǐsnju tačku u sortiranom nizu, neka je to, na primer,tačka (xi, yi). Tražena prava q će imati jednačinu y = ax + b

    ′, pri čemu je b′ = yi − axi.Zbog biranja sredǐsnje tačke, sigurni smo da je algoritam korektan. Složenost ovog algoritma jeO(n log n). Dakle, potreban nam je efikasniji algoritam.

    Slika 2.8: Primer odredivanja prave koja razbija skup tačaka na dva podskupa jednake veličine,metodom grube sile.

    Ideja iza efikasnijeg algoritma je vrlo slična metodi grube sile. Neka je y = ak + b jednačinaprave p. Prava q paralelna sa p ima jednačinu y = ak + b′. Rastojanje tačke (xk, yk) od svoje“projekcije” (u vertikalnom smeru) (xk, axk+b

    ′) na pravu q u pravcu y-ose jednako je yk−axk−b′

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 17

    (ono je pozitivno, odnosno negativno, ako je tačka iznad, odnosno ispod prave q), 1 ≤ k ≤ n.Potrebno je izabrati b′ tako da polovina brojeva yk − axk − b bude veća ili jednaka od nule,odnosno tako da polovina brojeva yk − axk bude veća ili jednaka od b′. Problem se dakle svodina nalaženje medijane brojeva yk − axk, 1 ≤ k ≤ n. Pronalaženje medijane brojeva, odnosno n2 -tog najmanjeg elementa, izračunava se u linearnom vremenu (podsekcija 5.4.2. Nalaženje k-tognajmanjeg elementa u [1]). ♣

    Zadatak 2.6. Neka je P prost (ne obavezno konveksni) mnogougao sadržan u datom pra-vougaoniku R i neka je q proizvoljna tačka unutar pravougaonika R. Konstruisati algoritamsloženosti O(n log n) za odredivanje takve tačke r van pravougaonika R za koju važi da jebroj ivica mnogougla P koje seče duž q − r minimalan.

    Rešenje: Treba sortirati temena mnogougla p1, p2, . . . , pn ciklički prema uglovima koji čine dužiq − pi sa nekom fiksiranom pravom. Tim redosledom (na primer, pi1 , pi2 , . . . , pin) treba proćitemena. Započinje se sa temenom pi1 : prebroje se ivice koje se seku sa polupravom q − pi1−,za šta je dovoljno O(n) provera ivica mnogougla. Pri prelasku sa temena pik na teme pik+1dovoljno je uporediti broj preseka polupravih q − pik− i q − pik+1− sa stranicama mnogouglasusednim sa temenima pik , pik+1 , da bi se videlo za koliko se broj preseka promenio u odnosu naprethodni položaj poluprave (O(1) provera). Usput se pamti teme p za koje je najmanji brojpreseka poluprave q − p− sa ivicama mnogougla. Složenost algoritma je O(n log n).

    q

    r

    Slika 2.9: Primer odredivanja tačke r, za zadati mnogougao P i zadatu tačku q van njega, zakoju važi da je broj ivica mnogougla koje seče duž q − r minimalan.

    Definicija 6 (Dominirajuća tačka). Za tačku p u ravni kaže se da dominira nad tačkom qako su x i y koordinate tačke p veće od odgovarajućih koordinata tačke q.

    Definicija 7 (Maksimalna tačka). Tačka p je maksimalna u datom skupu tačaka P ako ni-jedna druga tačka iz P ne dominira nad njom.

    Zadatak 2.7. Konstruisati algoritam složenosti O(n log n) za nalaženje svih maksimalnihtačaka datog skupa P od n tačaka.

    Rešenje: Tačke skupa sortiraju se opadajuće po x-koordinatama. Tačka (x1, y1) sa najvećomx-koordinatom je očigledno maksimalna. Ostale tačke kojima je y-koordinata manja od y1 nisumaksimalne, jer nad njima dominira tačka (x1, y1). Dakle, tačke se razmatraju redom prema

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 18

    opadajućim x-koordinatama i eliminǐsu do nailaska na prvu tačku (x2, y2) za koju je y2 > y1, kojaje maksimalna. Postupak se nastavlja dalje na isti način, eliminǐsući tačke sa y-koordinatamamanjim od y-koordinate poslednje pronadene maksimalne tačke (videti sliku 2.10). Deo algoritmaposle sortiranja ima složenost O(n), te ceo algoritam ima složenost O(n log n).

    Početni skup tačaka. Korak 1.

    Korak 2. Korak 3.

    Korak 4. Kraj algoritma.

    Slika 2.10: Primer izvršavanja opisanog algoritma. Pri svakom koraku, podebljana tačkaoznačava poslednju odredenu maksimalnu tačku, a tačke sa oznakom × označavaju tačke kojese eliminǐsu do naredne maksimalne tačke (ili kraja algoritma).

    Zadatak 2.8. Dat je skup od n horizontalnih duži u ravni. Konstruisati algoritam složenostiO(n log n) koji pronalazi sve njihove preseke.

    Rešenje: Duži (ai, yi)− (bi, yi) mogu se sortirati leksikografski po parovima (yi, ai) (dakle po y-koordinatama, a u okviru grupe sa istim y-koordinatama, u okviru kojih su jedino mogući preseci,po x-koordinatama levog kraja duži). Prilikom prolaska grupe (duži sa istom y-koordinatom),pamte se u povezanoj listi kandidati – duži čiji je levi kraj levo, a desni kraj desno od pokretnevertikalne prave; u posebnom vektoru se za svaku duž pamti lokacija levog kraja u sortiranomvektoru. Ako je pokretna prava naǐsla na levi kraj duži, onda se registruju preseci te duži sasvim kandidatima, i duž se ubacuje u listu kandidata. Ako se naide na desni kraj duži, ta dužse (po nalaženju pozicije u listi) izbacuje sa liste kandidata (videti sliku 2.11). Obrada grupe odk duži sa istom y-koordinatom traje O(k), pa je složenost ukupne obrade posle sortiranja O(n),odnosno, ukupna složenost algoritma je O(n log n).

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 19

    A B

    C D

    E F

    G H

    I J

    Korak 1.

    A B

    C D

    E F

    G H

    I J

    Korak 2.

    A B

    C D

    E F

    G H

    I J

    Korak 3.

    A B

    C D

    E F

    G H

    I J

    Korak 4.

    A B

    C D

    E F

    G H

    I J

    Korak 5.

    A B

    C D

    E F

    G H

    I J

    Korak 6.

    A B

    C D

    E F

    G H

    I J

    Korak 7.

    A B

    C D

    E F

    G H

    I J

    Korak 8.

    A B

    C D

    E F

    G H

    I J

    Korak 9.

    Slika 2.11: Primer postepenog prolaženja kroz jednu grupu duži u opisanom algoritmu. Duži surasporedene na različitim y-koordinatama radi boljeg pregleda.

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 20

    A B

    C D

    E F

    G H

    I J

    Korak 10.

    A B

    C D

    E F

    G H

    I J

    Korak 11.

    A B

    C D

    E F

    G H

    I J

    Korak 12.

    Slika 2.11: Primer postepenog prolaženja kroz jednu grupu duži u opisanom algoritmu. Duži surasporedene na različitim y-koordinatama radi boljeg pregleda (nastavak).

    Tabela 2.1: Tabela koraka sa slike 2.11. U svakom koraku pamtimo listu kandidata (lk) i listupreseka (lp).

    Korak lk lp1 ∅ ∅2 {AB} ∅3 {AB,GH} {(AB,GH, xH)}4 {AB,GH, IJ} {(AB,GH, xH), (AB, IJ, xJ), (GH, IJ, xJ)}5 {AB, IJ} {(AB,GH, xH), (AB, IJ, xJ), (GH, IJ, xJ), (AB,GH, xG), (IJ,GH, xG)}

    6 {IJ} {(AB,GH, xH), (AB, IJ, xJ), (GH, IJ, xJ), (AB,GH, xG), (IJ,GH, xG),(IJ,AB, xA)}

    7 ∅ {(AB,GH, xH), (AB, IJ, xJ), (GH, IJ, xJ), (AB,GH, xG), (IJ,GH, xG),(IJ,AB, xA)}

    8 {CD} {(AB,GH, xH), (AB, IJ, xJ), (GH, IJ, xJ), (AB,GH, xG), (IJ,GH, xG),(IJ,AB, xA)}

    9 ∅ {(AB,GH, xH), (AB, IJ, xJ), (GH, IJ, xJ), (AB,GH, xG), (IJ,GH, xG),(IJ,AB, xA)}

    10 {EF} {(AB,GH, xH), (AB, IJ, xJ), (GH, IJ, xJ), (AB,GH, xG), (IJ,GH, xG),(IJ,AB, xA)}

    11 ∅ {(AB,GH, xH), (AB, IJ, xJ), (GH, IJ, xJ), (AB,GH, xG), (IJ,GH, xG),(IJ,AB, xA)}

    12 ∅ {(AB,GH, xH), (AB, IJ, xJ), (GH, IJ, xJ), (AB,GH, xG), (IJ,GH, xG),(IJ,AB, xA)}

    Zadatak 2.9. Dat je skup intervala na pravoj, predstavljenih koordinatama svojih krajeva.Konstruisati algoritam složenosti O(n log n) za nalaženje svih intervala sadržanih u nekomdrugom intervalu iz skupa.

    Rešenje: Najpre se intervali sortiraju prema rastućim x-koordinatama svojih levih krajeva.Problem se može rešiti pomoću sledeće induktivne hipoteze: u skupu sa < n intervala umemoda označimo sve intervale sadržane u drugim intervalima, i da odredimo najveći desni kraj tihintervala. Ako je x-koordinata desnog kraja n-tog intervala veća od do tog trenutka najveće

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 21

    x-koordinate desnog kraja nekog intervala, onda n-ti interval nije sadržan u nekom drugomintervalu; njegov desni kraj preuzima ulogu najvećeg desnog kraja. U protivnom je on deo nekogdrugog intervala, pa se označava. Poslednji interval ima najveću x-koordinatu levog kraja, pa nesadrži ni jedan drugi interval. Složenost algoritma je O(n log n), zbog početnog sortiranja. ♣

    Zadatak 2.10. Dato je n pravougaonika u ravni sa stranicama paralelnim osama. Kon-struisati algoritam linearne složenosti za nalaženje preseka svih datih pravougaonika.

    Rešenje: Presek dva pravougaonika sa stranicama paralelnim osama pronalazi se za konstantnovreme. Taj presek je ili prazan, ili je neki pravougaonik. Prema tome, problem se može rešitiza vreme O(n), nalazeći preseke jednog po jednog pravougaonika sa presekom svih prethodnihpravougaonika. ♣

    Zadatak 2.11. Data su dva konveksna mnogougla cikličkim rasporedom svojih temena.Konstruisati algoritam linearne vremenske složenosti za odredivanje preseka ovih mnogo-uglova. Izlaz (takode konveksan mnogougao) treba da bude predstavljen ciklički uredenomlistom temena.

    Rešenje: Ideja je izdeliti oba mnogougla vertikalnim pravama na trapeze, i onda pronaći presekeparova trapeza. Najpre se sva temena sortiraju prema x-koordinatama. Ovo se može uraditiza vreme O(n), jer se zna ciklički redosled temena oba mnogougla. Kroz svako teme povučese vertikalna prava i na taj način su oba mnogougla izdeljena na trapeze (sa osnovama para-lelnim y-osi; trougao je specijalan slučaj trapeza). U jednoj po jednoj vertikalnoj traci, slevaudesno, pronalaze se (za vreme O(1), jer oba trapeza imaju po najvǐse četiri temena) preseci podva trapeza, dela dva mnogougla. Zatim se za vreme O(n) odgovarajući preseci objedinjuju umnogougao.

    Slika 2.12: Odredivanje preseka dva mnogougla.

    Zadatak 2.12. Dato je n tačaka u ravni. Odrediti medu njima takve dve tačke da duž kojaih povezuje ima najveći nagib. Složenost algoritma treba da bude O(n log n).

    Rešenje: Tačke se najpre sortiraju po svojim x-koordinatama. Zatim se medu nagibima dužikoje povezuju uzastopne tačke pronalazi najveći, i to je rešenje problema. Korektnost algoritmaposledica je činjenice da ako izmedu tačaka A0 i Ak u sortiranom redosledu postoje još neke tačkeA1, A2, . . . , Ak−1, onda postoje takve dve uzastopne tačke Ai i Ai+1 da je nagib duži AiAi+1

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 22

    veći ili jednak od nagiba duži A0Ak. Ovo tvrdenje može se dokazati indukcijom po k ≥ 1.Bazni slučaj k = 1 je trivijalan. Neka je tvrdenje tačno za neko k. Posmatrajmo proizvoljnihuzastopnih k + 2 tačaka A0, A1, . . . , Ak, Ak+1. Ako je tačka A1 iznad duži A0Ak+1, ili leži nanjoj, onda je nagib duži A0A1 veći ili jednak od nagiba A0Ak+1; u protivnom, nagib A1Ak+1je veći od nagiba A0Ak+1, pa po induktivnoj hipotezi izmedu A1 i Ak+1 postoje dve uzastopnetačke Ai, Ai+1 takve da je nagib AiAi+1 veći ili jednak od nagiba A1Ak+1, a time i veći od nagibaA0Ak+1.

    A1

    A0

    A1

    Ai

    Ai+1

    Ak

    Ak+1

    Slučaj kad je A1 iznad duži A0Ak+1.

    A0

    A1

    Ai

    Ai+1

    Ak

    Ak+1

    Slučaj kad je A1 ispod duži A0Ak+1.

    Slika 2.13: Skica dokaza za odredivanje najvećeg nagiba.

    Zadatak 2.13. Dato je n tačaka u ravni sa celobrojnim koordinatama. Odrediti najmanjiskup pravih ili paralelnih bilo nekoj od osa ili bilo nekoj od simetrala kvadranta, tako dasadrži svih n tačaka.

    Rešenje: Neka su date tačke Pi = (xi, yi), i = 1, n. Formiraju se četiri skupa brojeva A ={xi|1 ≤ i ≤ n}, B = {yi|1 ≤ i ≤ n}, C = {xi − yi|1 ≤ i ≤ n} i D = {xi + yi|1 ≤ i ≤ n}.Sortiranjem brojeva u ovim skupovima utvrduje se broj različitih elemenata u svakom od njih,koji je upravo jednak broju paralelnih pravih koje sadrže sve date tačke, a paralelne su y-osi (A),x-osi (B), pravoj y = x (C) i pravoj y = −x (D). Najmanji od ova četiri broja odreduje rešenjezadatka. Zbog sortiranja, složenost algoritma je O(n log n), jer su ostale komponente algoritmamanje asismptotske složenosti. ♣

    Zadatak 2.14. Dato je n tačaka u ravni, predstavljenih vektorom povezanih listi na sledećinačin. Svaki element vektora ima dva polja: polje X koje sadrži x-koordinatu i polje Narednikoje pokazuje na (nepraznu) povezanu listu svih tačaka skupa sa x-koordinatom jednakomX, sortiranih prema svojim y-koordinatama. Vektor je sortiran prema x-koordinatama.Konstruisati algoritam složenosti O(n) koji pronalazi najblǐzi par tačaka sa jednakim x-koordinatama ili sa x-koordinatama koje su susedne u nizu. Da li je u okviru algoritma ne-ophodno izračunavanje kvadratnih korenova? Da li algoritam pronalazi najblǐzi par tačaka?

    Rešenje: Opisanu strukturu podataka možemo grafički prikazati kao na slici 2.14. U svakojlisti traži se najmanji moduo razlike uzastopnih članova. Složenost ove komponente algoritma jeO(n). Kad se za parove susednih lista traži najbliži par tačaka, dovoljno je računati rastojanjesvake tačke iz jedne liste od samo dve tačke (jedne ispod, jedne iznad) iz susedne liste; parovitačaka za koje se traži rastojanje dobijaju se objedinjavanjem (koje ima linearnu složenost) dvejususednih lista prema y-koordinatama. Ukupan broj parova tačaka za koje se traži rastojanje (ilikvadrat rastojanja, da bi se izbeglo računanje kvadratnog korena) je dakle O(n). Algoritamne garantuje nalaženje para tačaka na najmanjem rastojanju, jer dve najbliže tačke ne moraju

  • GLAVA 2. GEOMETRIJSKI ALGORITMI 23

    x1

    y11

    y12

    . . .

    y1m1

    x2

    y21

    y22

    . . .

    y2m2

    . . . xn

    yn1

    yn2

    . . .

    ynmn

    Slika 2.14: Grafički prikaz strukture podataka iz zadatka 2.14.

    pripadati susednim listama ili jednoj listi (na primer, za tačke (0, 5), (1, 0) i (2, 5), algoritam nebi našao par (0, 5)− (2, 5) na rastojanju 2).

    Zadatak 2.15. Konveksni n-tougao dat je ciklički uredenom listom svojih temena. Kon-struisati algoritam složenosti O(n) za odredivanje n trouglova čiji je presek dati mnogougao.

    Rešenje: Neka gornja granica d za dijametar mnogougla (dužinu najveće duži koju sadrži) možese odrediti za O(n) koraka – to je, na primer, dijagonala pravougaonika koji sadrži mnogougao,a ivice su mu paralelne osama. Zatim se za svako teme Pi mnogougla konstruǐse jednakokrakitrougao kome je Pi teme, stranice mu sadrže stranice mnogougla koje se sustiču u temenu Pi, avisina iz temena Pi ima dužinu d (taj trougao sadrži celi mnogougao!). Presek ovih n trouglovaje zadati mnogougao. ♣

  • Glava 3

    Napredne strukture podataka ialgoritmi sortiranja

    Strukture podataka predstavljaju elemente nad kojima se kontruǐsu algoritmi. Da bismoumeli da konstruǐsemo efektivne algoritme nad strukturama podataka, neophodno je da znamonjihova elementarna svojstva i da umemo da procenimo složenosti operacija nad njima. U ovompoglavlju biće predstavljena struktura podataka koja je u literaturi poznata pod nazivom AVLstabla, a zatim će biti prikazano kako ih možemo modifikovati da dobijemo druge korisne strukturepodataka. U narednoj sekciji prikazaćemo jedan efikasan algoritam za balansiranje proizvoljnogbinarnog stabla pretrage, poznat pod nazivom Day-Stout-Warren algoritam. Zatim će biti reči ojoš jednoj drvolikoj strukturi podataka – sufiksna stabla – kao i o njihovim primenama. Potomsledi diskusija o algoritmima sortiranja, odnosno, diskusija o drugačijim načinima za ustanovlja-vanje poretka pored onih načina koji su zasnovani na relaciji uredenja.

    3.1 AVL stabla

    Definicija 8 (AVL Stablo). AVL stablo je binarno stablo pretrage kod koga je za svaki čvorapsolutna vrednost razlike visina levog i desnog podstabla manja ili jednaka od jedan.

    h

    h+ 1

    A

    B

    BL BR

    AR

    Slika 3.1: Primer AVL stabla.

    U narednim zadacima obratićemo pažnju na neke karakteristike AVL stabala. Na ovom mestućemo dati jednu od osnovnih karakteristika ovih stabala, a to je da, na osnovu teoreme 2, visinaAVL stabla je O(log n), gde je n je broj elemenata.

    25

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 26

    Teorema 2 (Asimptotska složenost visine AVL stabla). Za AVL stablo sa n unutrašnjihčvorova, visina h zadovoljava uslov

    h < 1.4405 log2(n+ 2)− 0.327.

    AVL stabla su prva struktura koja garantuje da složenost ni jedne od operacija traženja,umetanja i brisanja u najgorem slučaju nije veća od O(log n). Ideja je uložiti dopunski napor dase posle svake operacije stablo uravnoteži, tako da visina stabla uvek bude O(log n).

    Definicija 9 (Kritičan čvor). Kritičan čvor je koren najmanjeg podstabla koje sadrži umetnuti(odnosno, obrisani) čvor, a koje posle njegovog umetanja (odnosno, brisanja) postaje ne-AVL.

    h

    h+ 1

    h+ 2

    A

    B

    BL

    C

    BR

    AR

    h

    h+ 1

    h+ 2

    A

    B

    BL BR

    C

    AR

    Slika 3.2: Primer dodavanja lista C levom podstablu kojem AVL stablo sa slike 3.1 postajene-AVL stablo.

    h

    h+ 1

    h+ 2

    A ↓

    B ↑

    BL

    C

    BR

    AR ↓

    h+ 1

    B

    BL

    C

    A

    BR AR

    Slika 3.3: Primer LL-rotacije.

    Na slici 3.1 dato je jedno AVL stablo. Dodavanjem čvora C u podstablima BL ili BR, stabloprestaje da bude AVL (visina levog podstabla korena je veća od visine desnog podstabla korenaza dva), što je ilustrovano na slici 3.2. Jasno je da je kritičan čvor u ovom slučaju čvor A, tj. korenstabla. Da bismo ponovo uravnotežili stablo, neophodno je da izvršimo operaciju rotacije. U

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 27

    h

    h+ 1

    h+ 2

    A ↓

    B

    BL

    D ↑↑

    DL

    C

    DR

    AR ↓

    h

    h+ 1

    D

    B

    BL DL

    C

    A

    DR AR

    Slika 3.4: Primer LR-rotacije.

    zavisnosti od toga da li je novi list dodat levom ili desnom podstablu levog podstabla, razlikujemodva slučaja: LL-rotacija i LR-rotacija, redom.

    U slučaju LL-rotacije, koren levog podstabla B (videti sliku 3.3) podiže se i postaje korenstabla, a ostatak stabla preureduje se tako da stablo i dalje ostane stablo pretrage. Stablo BL sepodiže za jedan nivo ostajući i dalje levo podstablo čvora B; stablo BR ostaje na istom nivou,ali umesto desnog podstabla B postaje levo podstablo A; desno podstablo A spušta se za jedannivo.

    Slučaj LR-rotacije je komplikovaniji. Posmatrajmo stablo sa slike 3.2 (desno). Verovatno namse prvo nameće da ponovo postavimo B za koren. Medutim, tada će desno podstablo biti na visiniza dva većoj od levog podstabla, što ne rešava problem. Potrebno je malo drugačije posmatratiovaj slučaj, odnosno, da detaljnije prikažemo podstablo BR (videti sliku 3.4). Odavde se vidi dase stablo može uravnotežiti dvostrukom rotacijom: čvor D se dvostruko podiže i postaje korenstabla, čiji su direktni potomci B i A; stabla DL i DR postaju levo, odnosno, desno podstabloB, odnosno, A, redom. Primetimo da je svejedno da li je C bio list u podstablu DL i DR.

    Ukoliko se list dodaje u desno ili levo podstablo desnog podstabla, razlikujemo još dva slučaja:RR-rotacija i RL-rotacija. RR-rotacija je analogna LL-rotaciji, a RL-rotacija je analogna LR-rotaciji, te one neće biti detaljno opisane.

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 28

    Zadatak 3.1. Odrediti izgled AVL stabla dobijenog umetanjem redom brojeva 1, 2, . . . , 8 uprazno stablo i demonstrirati svaki od koraka u izgradnji stabla.

    Rešenje: Rešenje je dato narednim nizom koraka. Crvenom bojom su označeni čvorovi kojipostaju kritični nakon dodavanja novog čvora u odgovarajućem koraku.

    1

    1

    2

    1

    2

    3

    Korak 0. Praznostablo.

    Korak 1. Dodavanje1.

    Korak 2. Dodavanje2.

    Korak 3. Dodavanje3.

    2

    1 3

    2

    1 3

    4

    2

    1 3

    4

    5

    Korak 4. PrimenaRR-rotacije.

    Korak 5. Dodavanje 4. Korak 6. Dodavanje 5.

    2

    1 4

    3 5

    2

    1 4

    3 5

    6

    4

    2 5

    1 3 6

    Korak 7. PrimenaRR-rotacije.

    Korak 8. Dodavanje 6. Korak 9. PrimenaRR-rotacije.

    4

    2 5

    1 3 6

    7

    4

    2 6

    1 3 5 7

    Korak 10. Dodavanje 7. Korak 11. Primena RR-rotacije.

    Slika 3.5: Prikaz dodavanja brojeva 1, 2, . . . , 8 u prazno AVL stablo.

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 29

    4

    2 6

    1 3 5 7

    8

    Korak 12. Dodavanje 8. Kraj.

    Slika 3.5: Prikaz dodavanja brojeva 1, 2, . . . , 8 u prazno AVL stablo (nastavak).

    Zadatak 3.2. Odrediti izgled AVL stabla dobijenog umetanjem redom brojeva 20, 9, 15, 8,5, 12, 11, 10 u prazno stablo i demonstrirati svaki od koraka u izgradnji stabla.

    Rešenje: Rešenje je dato narednim nizom koraka. Crvenom bojom su označeni čvorovi kojipostaju kritični nakon dodavanja novog čvora u odgovarajućem koraku.

    Korak 0. Praznostablo.

    20

    Korak 1.Dodavanje 20.

    20

    9

    Korak 2.Dodavanje 9.

    20

    9

    15

    Korak 3.Dodavanje 15.

    15

    9 20

    Korak 4. PrimenaLR-rotacije.

    15

    9 20

    8

    Korak 5. Dodavanje 8.

    15

    9 20

    8

    5

    Korak 6. Dodavanje 5.

    Slika 3.6: Prikaz dodavanja brojeva 20, 9, 15, 8, 5, 12, 11, 10 u prazno AVL stablo.

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 30

    15

    8 20

    95

    Korak 7. PrimenaLL-rotacije.

    15

    8 20

    95

    12

    Korak 8. Dodavanje 12.

    9

    8 15

    205 12

    Korak 9. PrimenaLR-rotacije.

    9

    8 15

    205 12

    11

    Korak 10. Dodavanje 11.

    9

    8 15

    205 12

    11

    10

    Korak 11. Dodavanje 10.

    9

    8 15

    205 11

    10 12

    Korak 12. Primena LL-rotacije. Kraj.

    Slika 3.6: Prikaz dodavanja brojeva 20, 9, 15, 8, 5, 12, 11, 10 u prazno AVL stablo (nastavak).

    Zadatak 3.3. Odrediti najmanji i najveći broj elemenata koje može imati AVL stablo visineh.

    Rešenje: Odredimo prvo najveći broj elemenata. Da bismo uspeli da u stablo stavimo najvǐsečvorova, ono mora biti potpuno, odnosno, svaki čvor koji nije list mora imati dva naslednika. Nijeteško primetiti da na svakom nivou imamo 2i čvorova. Dakle, za stablo visine h, treba sumiratibroj čvorova na svakom nivou, odnosno, dobijamo da je najveći broj elemenata jednak

    h∑i=0

    2i =2h+1 − 1

    2− 1= 2h+1 − 1,

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 31

    pri čemu prva jednakost sledi na osnovu jednakosti iz zadatka 1.1. Odredimo ovo na još jedannačin – postavljanjem rekurentne jednačine: broj čvorova u stablu visine h je zbir broja čvorovau podstablima visine h− 1 i dodajemo broj 1 zbog korena. Time se dobija rekurentna jednačina

    Ah+1 = 2 ·Ah + 1, (3.1)

    uz početni uslov A0 = 1. U pitanju je nehomogena rekurentna jednačina reda 1. U nastavkućemo prikazati kako se ova jednačina rešava, a za vǐse detalja može se pogledati [3] (sekcija 3.4.Rekurentne jednačine) ili [1] (sekcija 2.5. Diferencne jednačine). Datu nehomogenu rekurentnujednačinu reda 1 svešćemo na homogenu rekurentnu jednačinu reda 2. Napǐsimo rekurentne vezeza članove Ah+1 i Ah+2, tj.

    Ah+1 = 2 ·Ah + 1,Ah+2 = 2 ·Ah+1 + 1.

    Oduzimanjem prve od druge jednačine, dobija se jednačina

    Ah+2 −Ah+1 = 2 · (Ah+1 −Ah),

    odnosno, nakon odgovarajućih transformacija homogena rekurentna jednačina reda 2

    Ah+2 − 3 ·Ah+1 + 2 ·Ah = 0. (3.2)

    Karakteristična jednačina prethodno dobijene jednačine izgleda

    r2 − 3r + 2 = 0,

    čija su rešenja r1 = 2 i r2 = 1. Odavde sledi da je opšte rešenje jednačine 3.2 oblika

    Ah = c1 · rh1 + c2 · rh2 = c1 · 2h + c2.

    Konstante c1 i c2 se dobijaju rešavanjem sistema jednačina1 = A0 = c1 · 1 + c2

    3 = A1 = c1 · 2 + c2

    .Rešenja ovog sistema su c1 = 2 i c2 = −1, pa je opšte rešenje jednačine 3.1

    Ah = 2 · 2h − 1 = 2h+1 − 1.

    Odredimo sada najmanji broj čvorova. Najmanji broj čvorova za dubinu 1 je 1. Najmanjibroj čvorova za dubinu 2 je 2. Za dubinu h, najmanji broj čvorova predstavlja zbir jedinice(koren), najmanjeg broja čvorova na visini h− 1 i najmanjeg broja čvorova na visini h− 2, štose opisuje nehomogenom rekurentnom jednačinom reda 2

    Bh = Bh−1 +Bh−2 + 1, (3.3)

    čiji su početni uslovi B1 = 1 i B2 = 2. Slično kao u prethodnom slučaju, prethodnu jednačinumožemo svesti na homogenu rekurentnu jednačinu reda 3

    Bh+1 − 2 ·Bh +Bh−2 = 0. (3.4)

    Karakteristična jednačina prethodno dobijene jednačine izgleda

    r3 − 2r2 + 1 = 0,

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 32

    čija su rešenja r1 = 1, r2 =1+√5

    2 i r3 =1−√5

    2 . Odavde sledi da je opšte rešenje jednačine 3.4oblika

    Bh = c1 · rh1 + c2 · rh2 + c3 · rh3 = c1 + c2 ·

    (1 +√

    5

    2

    )h+ c3 ·

    (1−√

    5

    2

    )h.

    Konstante c1, c2 i c3 se dobijaju rešavanjem sistema jednačina

    1 = B1 = c1 +c2 ·1 +√

    5

    2+c3 ·

    1−√

    5

    2

    2 = B2 = c1 +c2 ·

    (1 +√

    5

    2

    )2+c3 ·

    (1−√

    5

    2

    )2

    4 = B3 = c1 +c2 ·

    (1 +√

    5

    2

    )3+c3 ·

    (1−√

    5

    2

    )3

    .

    Rešenja ovog sistema su c1 = −1, c2 =√5+2√5

    i c3 =√5−2√5

    , pa je opšte rešenje jednačine 3.3

    Bh = −1 +√

    5 + 2√5·

    (1 +√

    5

    2

    )h+

    √5 + 2√

    (1−√

    5

    2

    )h.

    Definicija 10 (S-AVL čvor). Čvor binarnog stabla zovemo S-AVL čvorom ako on nije list iako je njegov faktor ravnoteže (razlika visina levog i desnog podstabla) jednak 0.

    Zadatak 3.4. Napisati algoritam koji označava sve čvorove koji su S-AVL čvorovi, ali čijinijedan potomak nije S-AVL čvor. Vreme izvršavanja algoritma treba da bude linearno pobroju čvorova stabla.

    Rešenje: Na slici 3.7 dat je primer jednog AVL stabla. Čvorovi koji su ispunjeni bojom zado-voljavaju uslove iz zadatka. Dakle, za neki čvor, informacije od značaja su dubine levog i desnogpodstabla, kao i oznaka da li postoje potomci koji su S-AVL čvorovi.

    Slika 3.7: Primer AVL stabla sa označenim S-AVL čvorovima čiji nijedan potomak nije S-AVLčvor.

    Da bismo rešili ovaj zadatak, iskoristićemo algoritam za računanje dubine stabla, pri čemuizlaz iz algoritma neće biti samo dubina stabla nego označena dubina stabla – negativna dubinaoznačava da se u podstablu nalazi barem jedan S-AVL čvor, a pozitivna dubina stabla da upodstablu nema S-AVL čvorova. Na primer, za koren stabla sa slike 3.7, poziv algoritma za levopodstablo vratiće +3, a poziv algoritma za desno podstablo vratiće −3, pa se koren ne obeležava.Izlaz iz poziva algoritma za koren vratiće vrednost 1+max{|3|, |−3|} = 4, sa predznakom minusjer je bio barem jedan S-AVL čvor u nekom od podstabla.

    Naredni pseudokôd daje algoritamski prikaz opisanog rešenja.

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 33

    Algoritam: S-AVL(x)Ulaz: x (dato stablo)Izlaz: dubina drveta sa odgovarajućim predznakom

    begin

    if (x == NIL) then return 1;else

    x->oznaka := FALSE;l := S-AVL(x->levo);d := S-AVL(x->desno);if (l > 0 and d > 0) then

    if (l == d) thenx->oznaka := TRUE;return −(l + 1);

    else

    return max(l, d) + 1;else

    if (l < 0 or d < 0) thenreturn −(max(abs(l), abs(d)) + 1);

    else

    return max(l, d) + 1;end

    S obzirom da se obilazi svaki čvor u stablu tačno jedanput, vremenska složenost algoritma jeO(n), pri čemu je n broj čvorova u stablu. ♣

    Zadatak 3.5. Opisati realizaciju apstraktnog tipa podataka koji podržava sledeće operacije:

    • Umetni(x) – umetni ključ x u strukturu podataka, ako ga tamo već nema;

    • Obrisi(x) – obrǐsi ključ x iz strukture podataka (ako ga ima);

    • Naredni(x, k) – pronadi u strukturi podataka k-ti najmanji ključ medu onima kojisu veći od x.

    Izvršavanje svake od operacija treba da ima vremensku složenost O(log n) u najgorem slučaju,gde je n broj elemenata u strukturi.

    Rešenje: S ozbirom da se zahteva logaritamska složenost za sve operacije, ukoliko koristimoAVL stablo, već imamo da su operacije Umetni(x) i Obrisi(x) podržane. Potrebno je na nekinačin “preraditi” AVL stablo tako da podrži i operaciju Naredni(x, k).

    Svakom čvoru v dodajemo novo polje v.D, koje sadrži broj potomaka v, zajedno sa v. Nekaza dati čvor v, Rang(v) označava broj elemenata stabla, sa ključem manjim ili jednakim odv.Ključ. Korǐsćenjem polja D može se odrediti rang čvora v u toku njegovog traženja, na sledećinačin. Induktivna hipoteza je da znamo rangove svih čvorova na putu od korena do nekog čvoraw. Ako koren ima levog sina, onda je njegov rang za jedan veći od vrednosti D njegovog levogsina; u protivnom je rang korena 1. Neka je wL levi sin čvora w, wD desni sin w, wLD desni sinwL i wDL levi sin wD. Rangovi sinova čvora w mogu se izraziti na sledeći način

    Rang(wL) = Rang(w)− wLD.D − 1Rang(wD) = Rang(w) + wDL.D + 1

    (ako neki od sinova ne postoji, uzima se da je odgovarajuća vrednost polja D jednaka 0). Da bise izvršila operacija Naredni(x, k), treba najpre pronaći čvor v takav da je v.Ključ = x (akotakav čvor ne postoji, onda je potraga neuspešna). Zatim se traži čvor sa rangom Rang(v) + k;

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 34

    traženje prema rangu iste je složenosti kao i traženje prema ključevima: rangovi se izračunavajuusput, a redosled u stablu isti im je kao redosled ključeva.

    Time posao nije završen; pošto je uvedeno novo polje, treba ga ažurirati posle operacija kojega menjaju. Posle umetanja, odnosno brisanja elemenata inkrementiraju se, odnosno dekremen-tiraju polja D u svim čvorovima na putu od korena; u slučaju neuspešnog umetanja ili brisanjaove promene se moraju ponǐstiti.

    Zašto je uvedeno polje D umesto polja Rang, koje bi traženje ključa sa datim rangom činilojednostavnijim? Zbog toga što umetanje i brisanje u najgorem slučaju menjaju rangove O(n)elemenata! ♣

    Zadatak 3.6. Demonstrirati brisanje čvora 15 iz AVL stabla

    20

    10

    5

    6

    15

    30

    25

    22 28

    27

    34

    38

    Rešenje: Brisanje čvora iz AVL stabla predstavlja nadogradnju algoritma brisanja čvora izbinarnog stabla pretrage. Čvor 15 u zadatom AVL stablu je list, pa ga je moguće jednostavnoukloniti. Nakon brisanja, AVL stablo izgleda

    20

    10

    5

    6

    30

    25

    22 28

    27

    34

    38

    Dobijeno stablo nije AVL stablo jer ima kritični čvor 10. Potrebno je uraditi odgovarajućerotacije da bismo uravnotežili dobijeno stablo. Rotacija koja se ovde primenjuje je LR-rotacija(dobijeno je stablo kao da smo umetnuli čvor 6), nakon čega se dobija

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 35

    20

    6

    5 10

    30

    25

    22 28

    27

    34

    38

    Ni ovo stablo nije AVL stablo jer ima kritični čvor 20. Rotacija koja se ovde primenjuje jeRL-rotacija (dobijeno je stablo kao da smo umetnuli čvor 27), nakon čega se dobija

    25

    20

    6

    5 10

    22

    30

    28

    27

    34

    38

    Dobijeno stablo jeste AVL. Primetimo da kod dodavanja imamo jednu rotaciju, a kod brisanjamože biti vǐse rotacija. Ispostavlja se da ima najvǐse O(log n) rotacija. ♣

    Zadatak 3.7. Neka je S = {s1, s2, . . . , sm} vrlo veliki skup, izdeljen u k disjunktnih blo-kova. Pretpostavimo da nam je na raspolaganju procedura Koji blok(si) koja za dati ele-ment si daje redni broj bloka koji sadrži si; ova procedura radi u konstantnom vremenu. Ciljje omogućiti rad sa malim podskupovima T ⊂ S i to sledeće operacije:

    • Umetni(si);

    • Obrisi(si);

    • Obrisi blok(j) – brǐse sve elemente koji pripadaju bloku j.

    Inicijalno je T prazan skup. Složenost svake od operacija treba da bude O(log n) u najgoremslučaju, gde je n tekući broj elemenata u T . Operacija Obrisi blok samo uklanja elementeiz strukture podataka – nije neophodno fizičko brisanje svakog od tih elemenata. Oba broja,i m i k, mogu biti vrlo veliki pa se ne može koristiti tabela veličine m ili k. Medutim, n jerelativno malo i na raspolaganju je prostor veličine O(n).

    Rešenje: Za skup T može se iskoristiti struktura od dva nivoa AVL stabala: čvorovi stablana vǐsem nivou (glavnog stabla) su blokovi čiji elementi se pojavljuju u T , sa pokazivačima nakorene stabala nižeg nivoa, namenjenih za smeštanje elemenata pojedinih blokova. OperacijeUmetni(si) i Obrisi(si) počinju izvršenjem procedure Koji blok(si); dobijeni broj bloka sekoristi da se iz glavnog stabla dobije pokazivač na stablo sa elementima tog bloka u T , posle čegapreostaje da se na običan način izvrše operacije u tom stablu. Treća operacija, Obrisi blok(j)izvršava se uklanjanjem bloka j iz glavnog stabla (posle toga pomoćno stablo j postaje nedo-stupno). ♣

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 36

    3.2 Day-Stout-Warren algoritam

    Day-Stout-Warren algoritam (nadalje, DSW algoritam) predstavlja metod za efikasno balan-siranje binarnih stabala pretrage. Za razliku od uravnoteženih binarnih stabala pretrage kojase automatski balansiraju nakon svake operacije (ukoliko je balansiranje neophodno), DSW al-goritam ne radi inkrementalno, već periodično, tako da se ukupna cena amortizuje tokom vǐseoperacija. Algoritam se sastoji iz naredne dve faze:

    1. Ispravljanje zadatog stabla u povezanu listu – transformacija od početnog stabla do dege-nerisanog stabla;

    2. Balansiranje – transformacija od degenerisanog stabla do AVL stabla.

    Ključne operacije u DSW algoritmu su rotacije potomka oko pretka. Postoje dve vrste rotacija:leva rotacija (slika 3.8) i desna rotacija (slika 3.9).

    B

    A D

    C

    D

    B

    A C

    Slika 3.8: Leva rotacija potomka oko pretka.

    C

    A

    B

    D

    A

    C

    B D

    Slika 3.9: Desna rotacija potomka oko pretka.

    Postavlja se pitanje kako pomoću prve operacije možemo da ispravimo stablo u listu. Postu-pak će biti prikazan kroz naredni zadatak.

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 37

    Zadatak 3.8. Ispraviti u listu binarno stablo pretrage

    G

    C

    B

    A

    D

    E

    F

    L

    J

    I

    H

    K

    M

    N

    O

    Rešenje: Ideja je da napravimo degenerisano stablo koje će imati desne grane. U skladu satime, leve grane su problematične. Dakle, prvi korak je rotacija čvora C oko čvora G, odnosno,desna rotacija. Time se dobija stablo

    C

    B

    A

    G

    D

    E

    F

    L

    J

    I

    H

    K

    M

    N

    O

    Isti postupak ponovimo za rotaciju čvora B oko čvora C, a zatim čvora A oko čvora B. Nakonte dve rotacije, stablo koje se dobija izgleda

    A

    B

    C

    G

    D

    E

    F

    L

    J

    I

    H

    K

    M

    N

    O

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 38

    Sada treba izvršiti rotaciju čvora D oko čvora G, čime se dobija stablo

    A

    B

    C

    D

    G

    E

    F

    L

    J

    I

    H

    K

    M

    N

    O

    Nadalje se primenjuju sledeće rotacije:

    • čvor E oko čvora G;

    • čvor F oko čvora G;

    • čvor J oko čvora L;

    • čvor I oko čvora J ;

    • čvor H oko čvora I;

    • čvor K oko čvora L.

    Rezultat je stablo (tj. povezana lista)

    A

    B

    C

    D

    E

    F

    G

    H

    I

    J

    K

    L

    M

    N

    O

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 39

    Zadatak 3.9. Napisati algoritam koji od proizvoljnog binarnog stabla pretrage pravi pove-zanu listu.

    Rešenje: Naredni pseudokôd daje algoritamski prikaz opisanog rešenja iz zadatka 3.8.

    Algoritam: Kreiraj_listu(x)Ulaz: x (dato stablo)Izlaz: Povezana lista

    begin

    tmp := x;while (tmp != NIL) do

    if (tmp->levi != NIL) thenizvrši rotaciju čvora tmp->levi oko čvora tmp;tmp := tmp->levi;

    else

    tmp := tmp->desni;end

    Opǐsimo sada drugu fazu DSW algoritma. Ponovo, postupak će biti prikazan kroz zadatak.

    Zadatak 3.10. Balansirati povezanu listu koja se dobija primenom algoritma iz zadatka3.9 na binarno stablo pretrage iz zadatka 3.8.

    Rešenje: Najpre biramo svaki drugi element iz povezane liste i primenjujemo levu rotaciju nasvakog od njih (sa izuzetkom elementa na poslednjoj parnoj poziciji). Time se dobija stablo

    B

    D

    F

    H

    J

    L

    N

    O

    A

    C

    E

    G

    I

    K

    M

    Zatim ponovo biramo svaki drugi element (na “glavnoj grani”) i primenjujemo levu rotacijuna svakog od njih (ponovo, osim na elementu na poslednjoj parnoj poziciji). Time se dobijastablo

    D

    H

    L

    N

    B

    F

    J

    M

    A C

    E G

    I K O

    Ovaj postupak se dalje ponavlja rekurzivno. U ovom primeru ima još jedan korak, odnosno,leva rotacija čvora H oko čvora D, čime se dobija stablo

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 40

    H

    D L

    B F J N

    A C E G I K M O

    Zadatak 3.11. Oceniti složenost DSW algoritma.

    Rešenje: U prvoj fazi algoritma prolazimo kroz svaki element stabla tačno jednom. Dakle,vremenska složenost prve faze je O(n), pri čemu je n broj elemenata u stablu. U drugoj fazialgoritma vršimo rotacije nad n2 elemenata, pa zatim nad

    n4 , pa zatim nad

    n8 , itd. Ukupno takvih

    operacija imalog2 n∑i=0

    n

    2i= n ·

    log2 n∑i=0

    1

    2i= O(n).

    S obzirom da algoritam radi u mestu, njegova prostorna složenost je O(1). ♣

    3.3 Sufiksna stabla

    Sufiksna stabla su još jedna korisna struktura podataka o kojoj će biti reči u daljem tekstu.Iako neće biti izloženi detalji algoritama rada sa njima, ideja je da sama struktura podataka budepredstavljena, kao i da bude diskusije o nekim njenim karakteristikama. Sekciju ćemo započetijednostavnom definicijom sufiksnog stabla, a zatim će uslediti zadatak kojim ćemo prikazatikonstrukciju sufiksnog stabla korǐsćenjem algoritma grube sile na jednom primeru. Detaljnije osufiksnim stablima će biti reči u sekciji 9.2, gde ćemo izložiti nešto detaljnije sufiksna stabla, kaoi efikasniji algoritam za njihovu konstrukciju.

    Definicija 11 (Sufiksno stablo). Sufiksno stablo je stablo čijim obilaskom se dobija skup su-fiksa neke reči.

    Zadatak 3.12. Konstruisati sufiksno stablo reči BANANA.

    Rešenje: Uglavnom se na kraju reči dopisuje terminirajuća nula, koja će biti označavana zna-kom $. Skup sufiksa reči BANANA$ je {BANANA$, ANANA$, NANA$, ANA$, NA$, A$}.Pokažimo kako bismo napravili sufiksno stablo zadate reči.

    Zapitajmo se kojim slovima mogu početi svi sufiksi reči BANANA$. To su slova {A, B, N}.To znači da će koren sufiksnog stabla imati tri potomka. Na slovo A postoje 3 različita sufiksa,a kako je njihov zajednički prefiks A, to znači da će na grani ka prvom potomku korena stajatiA. Na slovo B postoji samo jedan sufiks, BANANA, tako da će upravo to stajati na grani kadrugom potomku korena. Na slovo N postoje 2 različita sufiksa, a njihov zajednički prefiks jeNA, tako da će upravo to stajati na grani ka trećem potomku korena. Čvorove koji su listovitokom konstrukcije obeležavamo brojevima koji predstavljaju indeks odakle počinje taj sufiks uzadatoj reči. Do sada imamo jedan list, to je drugi potomak korena. Trenutno stablo izgleda:

    1

    ABANANA$

    NA

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 41

    Primetimo da su oznake grana sortirane, pri čemu ćemo oznaci $ dati prednost u odnosu naostala slova. Razmotrimo sada prefikse koji počinju na slovo A. Nakon što uklonimo slovo A sapočetka, vidimo da dva sufiksa počinju na NA, a treći samo na $. To znači da ćemo dodati dvapotomka, pri čemu će oznake grana biti $ i NA. Dobili smo još jedan list, koji će biti obeleženbrojem 6, jer je to sufiks koji počinje od šeste pozicije u zadatoj reči. Za drugi dodati čvor,u kojem se nalaze sufiksi {ANANA$, ANA$}, imamo ponovo dve putanje – jednu sa oznakomgrane $ i jednu sa oznakom grane NA$. Čvorovi koje dobijamo su listovi, te ih je potrebnoadekvantno označiti. Trenutno stablo izgleda:

    1

    6

    4 2

    ABANANA$

    NA

    $ NA

    $ NA$

    Preostali su nam sufiksi koji počinju na NA, to su {NANA$, NA$}. Kada sklonimo sa njihprefiks NA, ostaje nam {NA$, $}, što će predstavljati listove. Ovo je ujedno i kraj konstrukcijesufiksnog stabla. Konačno, sufiksno stablo reči BANANA izgleda:

    1

    6

    4 2

    5 3

    ABANANA$

    NA

    $ NA

    $ NA$

    $ NA$

    Sada ćemo diskutovati o upotrebi sufiksnih stabala. Ispostavlja se da se većina operacija nadniskama efikasnije sprovodi ukoliko se niske predstave pomoću odgovarajućih sufiksnih stabala.Neke od njih su:

    • pretraživanje:

    – da li je niska P dužine m podniska niske S, za vreme O(m);

    – prvo pojavljivanje sekvence niski P1, . . . , Pq ukupne dužine m kao podniski, za vremeO(m);

    – svih z pojavljivanja sekvence niski P1, . . . , Pq ukupne dužine m kao podniski, za vremeO(m+ z).

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 42

    • pronalaženje svojstva niski:

    – pronaći niske odredene dužine koji se najvǐse puta ponavljaju za vreme Θ(n);

    – pronaći najduže ponavljajuće podniske za vreme Θ(n);

    – pronaći najkraće podniske koji se pojavljuju samo jednom za vreme Θ(n).

    3.4 Napredni algoritmi sortiranja

    Sortirati neki proizvoljan niz znači urediti elemente tog niza na osnovu neke unapred zadaterelacije. Kako se najpre sortiraju nizovi celobrojnih elemenata, relacija za uredivanje je relacijaporedenja ≤ definisana nad celobrojnim vrednostima. Stoga, najčešće se razmatraju algoritmikoji u osnovi imaju operaciju poredenja. Može se pokazati da je za takve algoritme donja granicavremenske složenosti Ω(n log n) [1]. U ovoj sekciji biće reči o algoritmima za sortiranje koji nisuzasnovani na poredenju, a zatim će uslediti diskusija o nekim svojstvima takvih algoritama.

    3.4.1 Sortiranje razvrstavanjem

    Sortiranje razvrstavanjem (engl. bucket sort) polazi od pretpostavke da se može obezbeditidovoljan broj lokacija za svaki mogući element niza, a zatim da se svaki element smesti na svojulokaciju. Zatim se jednim prolaskom kroz sve lokacije (redom!) “pokupe” one vrednosti kojesu smeštene i time se dobija sortirani niz. Vremenska složenost prvog dela algoritma, smeštanjaelemenata, reda je O(n). Ako je opseg brojeva iz intervala [a, b] ∩ Z, a, b ∈ Z, a ≤ b, ondaje vremenska složenost drugog dela algoritma, prolazak kroz sve lokacije, reda O(m), gde jem = b − a. Dakle, ukupna vremenska složenost algoritma je O(n + m). Prostorna složenostalgoritma je očigledno O(m).

    Sortiranje razvrstavanjem može se iskoristiti i ako je dopušteno ponavljanje elemenata u nizu.Svaki put kada se naide na element, onda se na njegovu odgovarajuću lokaciju inkrementirabrojač. Pri prolasku kroz lokacije, element na nekoj lokaciji se broji onoliko puta koliko iznosibrojač na toj lokaciji.

    Razmotrimo sada efikasnost algoritma. Ako je opseg brojeva konstantan, onda je sortiranjerazvrstavanjem linearne složenosti. Ako opseg brojeva linearno zavisi od broja elemenata u nizu,onda je vremenska složenost O(n+O(n)) = O(n), a prostorna složenost O(O(n)) = O(n), dakle,ponovo je linearna složenost. Sortiranje razvrstavanjem je efikasniji što je opseg brojeva manji.

    Varijanti opisanog algoritma ima mnogo. Jedna varijanta pretpostavlja da su podaci pred-stavljeni u obliku brojeva u pokretnom zarezu, kao i da dolaze iz ravnomerne raspodele inter-vala [0, 1). Za ovakve podatke se može konstruisati algoritam sortiranja razvrstavanjem koji uprosečnom slučaju za vremensku složenost ima linearnu funkciju po broju elemenata. Vǐse oovome će biti reči u sekciji 9.3.

    3.4.2 Sortiranje vǐsestrukim razvrstavanjem

    Sortiranje vǐsestrukim razvrstavanjem predstavlja prirodno uopštenje sortiranja razvrstava-njem. Neka je opseg brojeva u nizu izrazito veliki, na primer, m = 100000. Sortiranje razvr-stavanjem u ovom slučaju nije pogodno, jer je preveliki opseg mogućih brojeva. Kako smanjitipotreban opseg? Primenićemo indukciju po opsegu na sledeći način. Najpre koristimo 10 pre-grada i sortiramo brojeve prema prvoj cifri. Svaka pregrada sada pokriva 10000 različitih brojeva(odredenih sa preostalih pet cifara). Broj operacija za ovu etapu je O(n). Na kraju prve etapeimamo 10 pregrada, od kojih svaka odgovara manjem opsegu. Dalje se problem za svaku pre-gradu rešava indukcijom. Pošto se opseg posle svake etape smanjuje za faktor 10, i pošto brojeviimaju šest cifara, dovoljno je šest etapa. Kad se sadržaji pregrada sortiraju, lako ih je objedinitiu sortiranu (uredenu) listu. Razmotrena verzija sortiranja vǐsestrukim razvrstavanjem (cifre seprolaze sleva udesno) poznata je kao sortiranje obratnim vǐsestrukim razvrstavanjem.

  • GLAVA 3. NAPREDNE STRUKTURE PODATAKA I ALGORITMI SORTIRANJA 43

    Rekurzivna realizacija sortiranja obratnim vǐsestrukim razvrstavanjem zahteva pomoćne lo-kacije (oko 60 pregrada u primeru sa opsegom m = 100000; svaki nivo rekurzije ima svojepregrade). Drugi način realizacije sortiranja vǐsestrukim razvrstavanjem zasniva se na primeniindukcije obrnutim redosledom: sortiranje se radi zdesna ulevo, polazeći od najnižih umesto odnajvǐsih cifara. Ovakva verzija sortiranje vǐsestrukim razvrstavanjem poznata je kao sortiranjedirektnim vǐsestrukim razvrstavanjem (engl. radix sort).

    Zadatak 3.13. Sortirati algoritmom radix sort brojeve: 329, 457, 657, 839, 436, 720, 355.

    Rešenje: U tabeli 3.1 dat je prikaz sortiranja datih brojeva algoritmom radix sort. U svakomkoraku (osim u početnom), označene su cifre na osnovu kojih je izvršeno sortiranje u tom koraku.Ono što treba primetiti jeste da kad se brojevi sortiraju u koraku d, onda ne menjamo cifre kojesu sortirane u koraku < d. Time obezbedujemo da brojevi koji se dobijaju od cifara u koraku dbudu sortirani, pa kada d bude poslednji korak u algoritmu, onda i celi brojevi postaju sortirani.

    Tabela 3.1: Postepeni prikaz sortiranja brojeva 329, 457, 657, 839, 436, 720, 355 algoritmomradix sort.

    Korak # 1 2 3 4Brojevi 329 720 720 329

    457 355 329 355657 436 436 436839 457 839 457436 657 355 657720 329 457 720355 839 657 839

    Zadatak 3.14. Odrediti vremensku složenost radix sort algoritma.

    Rešenje: Neka je d broj ponavljanja algoritma sortiranja razvrstavanjem (odnosno, d je brojcifara najvećeg elementa), k broj pregrada koje se koriste i n broj elemenata zadatog niza. Tada,ukupna vremenska složenost algoritma radix sort je O(d · O(n+ k)) = O(d · (n+ k)), u opštemslučaju. Ipak, broj cifara i opseg su često konstantni (u zadatku 4.1 važi da je d = 4 i k = 10),pa je složenost u prosečnom slučaju O(n). ♣

    Zadatak 3.15. Dato je k listi i svaka od njih sadrži n elemenata. Ključevi elemenata suceli brojevi iz opsega [1,m]. Pokazati kako se mogu sortirati sve liste tako da vremenskasloženost u najgorem slučaju bude O(kn+m).

    Rešenje: Razmotrimo prvo algoritam grube sile. Kada bismo svaku listu sortirali razvrstava-njem, onda bi vremenska složenost bila O(k ·O(n+m)) = O(kn+ km). Ova složenost je lošijaod zahteva