konstrukcija i analiza algoritama { odgovori na pitanjanikolaajzenhamer.rs/pdf/kiaa-odgovori.pdf ·...

Download Konstrukcija i analiza algoritama { odgovori na pitanjanikolaajzenhamer.rs/pdf/KIAA-odgovori.pdf · Konstrukcija i analiza algoritama { odgovori na pitanja Anja Bukurov Nikola Ajzenhamer

If you can't read please download the document

Upload: hatruc

Post on 08-Feb-2018

294 views

Category:

Documents


16 download

TRANSCRIPT

  • Konstrukcija i analiza algoritama odgovori na pitanja

    Anja BukurovNikola AjzenhamerVojislav Stankovic

    11. juni 2015.

    1

  • Sadrzaj

    1 Pravila izvoenja, valjani dokazi, rezolucija. Pravila izvoenja sa kvantifikatorima. 4

    2 Metodi dokazivanja teorema; teoreme sa kvantifikatorima primeri. 42.1 Metodi dokazivanja teorema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 Dokazivanje teorema sa kvantifikatorima . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    3 Primeri dokaza matematickom indukcijom; Ojlerova formula V + F = E + 2 63.1 Ojlerova formula: V + F = E + 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    4 Nalazenje binarnih cifara celog broja, dokaz korektnosti. 8

    5 Analiza algoritama, Onotacija, vremenska i prostorna slozenost 8

    6 Asimptotsko ponasanje resenja rekurentne relacije T (n) = aT (n/b) + cnk. 9

    7 Resenje rekurentne relacije T (n) = 2n

    ni=1

    T (i) + n 1, n 2,

    T (1) = 0 (prosecna slozenost algoritma kvik sort) 10

    8 Pohlepni (greedy) algoritmi; primer: nalazenje Hofmanovog koda 12

    9 Izracunavanje vrednosti polinoma 14

    10 Nalazenje maksimalnog indukovanog podgrafa grafa sa stepenovima cvorova ne ma-njim od zadatog broja 14

    11 Nalazenje maksimalnog podskupa S A datog skupa A na kome je zadata funkcijaf : A A sa osobinom 1 1 15

    12 Algoritam za nalazenje takvog i da su u kvadratnoj 0 1 matrici svi elementi itevrste (sem itog) 1, i svi elementi ite kolone (sem itog) 0 16

    13 Racunanje svih faktora ravnoteze binarnog stabla 17

    14 Nalazenje maksimalnog (uzastopnog) podniza datog niza realnih brojeva 18

    15 Binarna pretraga, primeri primene; interpolaciona pretraga 1815.1 Binarna pretraga, primeri primene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1815.2 Interpolaciona pretraga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    16 Istovremeno nalazenje najmanjeg i najveceg elementa u nizu 22

    17 Nalazenje k-tog najmanjeg od n zadatih brojeva 22

    18 Nalazenje dve najblize tacke u datom skupu od n tacaka u ravni 23

    19 Dinamicko programiranje, problem ranca. 26

    20 Algoritam za nalazenje editrastojanja dva niza i priblizno trazenje reci u tekstu. 27

    21 KMP algoritam za nalazenje jednog stringa u drugom. 2921.1 Izracunavanje pomocnog niza za algoritam KMP . . . . . . . . . . . . . . . . . . . . . . . 31

    22 Hes tablice. 31

    23 Struktura podataka pogodna za problem nalazenja unije. 32

    24 Predstavljanje grafova: matrica povezanosti, lista povezanosti. 34

    25 Nalazenje Ojlerovog ciklusa u povezanom neusmerenom grafu. 35

    2

  • 26 Pretraga u dubinu neusmerenog grafa. 35

    27 Pretraga grafa u sirinu. 37

    28 Topolosko sortiranje aciklickog grafa 38

    29 Nalazenje svih najkracih puteva iz zadatog cvora grafa aciklicki slucaj. 39

    30 Nalazenje svih najkracih puteva iz zadatog cvora grafa 41

    31 Minimalno povezujuce stablo grafa. 43

    32 Nalazenje svih najkracih puteva u grafu. 44

    33 Tranzitivno zatvorenje grafa. 45

    34 Stepenovanje prirodnim brojem. 46

    35 Euklidov algoritam 48

    36 Vinogradov i Strasenov algoritam za mnozenje matrica 49

    37 Brza Fruijeova transformacija i mnozenje polinoma 5037.1 Direktna Furijeova transformacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5137.2 Inverzna Furijeova transformacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

    38 Algoritam za nalazenje trouglova u neusmerenom grafu, dobijen svodenjem na mnozenjematrica. 54

    39 Redukcije polinomijalne vremenske slozenosti, tranzitivnost. 55

    40 Nedeterministicki algoritmi, Kukova teorema. 5540.1 Kukova teorema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

    41 Dokaz NPkompletnosti problema nalazenje pokrivaca cvorova grafa. 56

    42 Dokaz NPkompletnosti problema nalazenje dominirajuceg skupa grafa. 57

    43 Dokaz NPkompletnosti problema 3SAT. 58

    44 Dokaz NPkompletnosti problema klika. 59

    45 Dokaz NP-kompletnosti problema 3-obojivosti grafa 60

    46 Moguci kompromisi prilikom resavanja teskih (NP kompletnih) problema; pretragasa vracanjem, 3bojenje grafa. 61

    47 Grananje sa odsecanjem, primena na bojenje grafa. 62

    48 Priblizni algoritam za nalazenje pokrivaca grana na osnovu maksimalnog uparivanja. 64

    49 Priblizni algoritmi za resavanje 1D problema pakovanja. 64

    50 Priblizni algoritmi za resavanje Euklidskog problema trgovackog putnika. 65

    3

  • 1 Pravila izvoenja, valjani dokazi, rezolucija. Pravila izvoenjasa kvantifikatorima.

    Pravila izvoenja predstavljaju osnovu ispravnog zakljucivanja. Neka od pravila izvoenja su:

    Ime Pravilo Pravilo zadato tautologijom

    1 Modus ponensp

    p = qq

    (p (p = q)) = q

    2 Dodavanjep

    p q p = (p q)

    3 Uproscavanjep qp

    (p q) = p

    4 Konjunkcijapq

    p q(p q) = (p q)

    5 Modus tolensq

    p = qp

    (q (p = q)) = p

    6 Hipoteticki silogizamp = qq = rp = r

    ((p = q) (q = r)) = (p = r)

    7 Disjunktivni silogizamp qpq

    ((p q) p) = q

    8 Rezolucijap qp rq r

    ((p q) (p r)) = (q r)

    Pravila izvodenja sa kvantifikatorima:

    Ime Pravilo

    1 Univerzalna specijalizacijaxP (x)P (c)

    2 Univerzalna generalizacijaP (c)xP (x)

    3 Egzistencijalna specijalizacijaxP (x)P (c)

    4 Egzistencijalna generalizacijaP (c)xP (x)

    2 Metodi dokazivanja teorema; teoreme sa kvantifikatorima primeri.

    2.1 Metodi dokazivanja teorema

    Dokazi se odnose na teoreme oblika p = q.

    Direktni dokaz (najjednostavnije) Krece se od pretpostavke da je p tacno i pokazuje se da je i qtacno.Primer: ,,Ako je n neparan, onda je i n2 neparan broj.Dokaz: Posto je n neparan, moze se zapisati u obliku n = 2 k + 1.Onda je n2 = (2 k+ 1)2 = 4 k2 + 4 k + 1 = 2 (2 k2 + 2 k) + 1, i to je takode neparan broj.

    4

  • Indirektni dokaz Umesto implikacije p = q dokazujemo njenu kontrapoziciju, odnosno q = p.Primer: ,,Ako je 3 n+ 2 neparan, ona je i n neparan broj.Dokaz: Pretpostavimo suprotno, n je paran broj i mozemo ga zapisati u obliku n = 2 k.Onda je 3 n + 2 = 3 (2 k) + 2 = 2 (3dotk + 1). To je paran broj, sto znaci da je q = ptacno, pa je tacno i p = q.

    Prazan dokaz Ako je p netacno, implikacija p = q ce uvek biti tacna.Primer: P (n): ,,Ako je n > 1, onda n2 > n. Dokazati P (0).

    Trivijalan dokaz Ako je q tacno, implikacija p = q ce uvek biti tacna.Primer: P (n): ,,Ako je a, b N, a b, onda an bn. Dokazati P (0).

    Dokaz izvodenjem kontradikcije Tvrdenje p dokazujemo tako sto pretpostavimo suprotno, tj. daje tacno p i iz toga izvedemo kontradikciju.Primer: ,,

    2 je iracionalan broj.

    Dokaz: Pretpostavimo suprotno,

    2 je racionalan broj. To znaci da se moze napisati kao skracen(nesvodljiv) razlomak.2 =

    a

    b/ b

    b

    2 = a/2

    2 b2 = a2 = a2 je paran broj, pa je i a paran i mozemo ga zapisati u obliku a = 2 k!2 b2 = (2 k)22 b2 = 4 k2 / : 2b2 = 2 k2 = b2 je paran broj, pa je i b paran broj.Ako su i a i b parni brojevi znaci da razlomak

    a

    bnije skracen. Dakle, pretpostavka je pogresna!

    Dokaz razmatranjem slucajeva Tvrdenje oblika (p1 . . . pn) = q dokazujemo tako sto pokazu-jemo da vazi: p1 = q . . . pn = q.Primer: ,,Dokazati da vazi nejednakost trougla: |x+ y| |x|+ |y|.Dokaz:

    1. x 0 y 0: |x+ y| = x+ y, |x|+ |y| = x+ y2. x < 0 y < 0: |x+ y| = (x+ y), |x|+ |y| = x y = (x+ y)3. x 0 y < 0: |x|+ |y| = x y

    (a) |x| < |y|: |x+ y| = (x+ y) = x y x y x 0

    (b) |x| > |y|: |x+ y| = x+ y = x+ y x y y 0

    4. x < 0 y 0: |x|+ |y| = x+ y(a) |x| < |y|: |x+ y| = x+ y = x+ y x+ y x 0

    (b) |x| > |y|: |x+ y| = (x+ y) = x y x+ y y 0

    Dokaz ekvivalentnosti Tvrdenje oblika p q dokazujemo tako sto dokazujemo p = q i q = p.Primer: ,,Sledeca tri tvrenja su ekvivalentna:

    P1 : ,,n je paran.

    P2 : ,,n 1 je neparan.P3 : ,,n

    2 je paran.

    2.2 Dokazivanje teorema sa kvantifikatorima

    Prva tri dokaza odnose se na teoreme sa kvatifikatorom , a cetvrta na teoreme sa kvantifikatorom .

    Konstruktivni dokaz Treba pronaci neko a, tako da je P (a) tacno.Primer: ,,Dokazati da postoji n N koji se moze napisati na 2 nacina kao zbir 2 kuba.Dokaz: 1729 = 103 + 93 = 123 + 13

    5

  • Nekonstruktivni dokaz Treba pokazati da postoji a, tako da je P (a) tacno, ali se a ne pronaekonkretno.Primer: ,,Dokazati da postoje x, y I takvi da je xy racionalan broj.Dokaz: Neka je x =

    2, y =

    2, i a = xy =

    22. Ako je a racionalan, onda je to kraj dokaza. Ako

    je a iracionalan, onda uzmemo da je x =

    22, a y =

    2.

    Onda je a =

    (22)2

    = (

    2)22 = (

    2)2 = 2 Q.

    U oba slucaja dobijamo da je a racionalan broj, ali ne znamo koji od ta dva slucaja imamo, nismokonkretno odredili i zato je to nekonstruktivan dokaz.

    Dokaz jedinstvenosti xP (x) y((y 6= x) = P (x)).Primer: ,,Svaki celi broj ima jedinstveni aditivni inverz.Dokaz: x ima inverz x i x. Onda vazi:x + x = 0 i x + x = 0x = x + 0 = x + (x+ x) = (x + x) + x = 0 + x = x

    Kontraprimeri Dovoljno je pronaci jedno a takvo da P (a) bude netacno.Primer: ,,Svaki prirodan broj je zbir 3 kvadrata.Dokaz: 7 = x2 + y2 + z2, x y z. Najveci vrednost koju mogu da uzmu ovi brojevi je 2,jer je 32 = 9. Moramo imati bar jednu 2, jer 12 + 12 + 12 = 3. Ne mozemo imati dve 2, jerje 1+22 + 22 = 9 > 7. Preostaje nam da napravimo kombinaciju od dve 1 i jedne 2, a to je12 + 12 + 23 = 6.

    3 Primeri dokaza matematickom indukcijom; Ojlerova formulaV + F = E + 2

    Primer: Formirajmo trougao

    Slika 1: Trougao neparnih brojeva.

    Koliki je zbir brojeva u i-tom redu?U 1. redu je 1, u 2. redu je 8, u 3. redu je 27, u 4.redu je 64...Pretpostavimo da je zbir elemenata u i-tom redu, Si jednak: Si = i

    3

    Slika 2: Slikoviti prikaz ideje resenja.

    Si+1 = Si + i 2i+ ai+1(i+ 1)3 = i3 + 2i2 + ai+1

    6

  • Ostaje da se dokaze da je

    ai+1 = i3 + 3i2 + 3i+ 1 i3 2i2

    = i2 + 3i+ 1

    = (i+ 1)2 + (i+ 1) 1

    odnosno

    ai = i2 + i 1

    Dokaz (indukcijom po i)

    Baza Indukcije: i = 1; ai = 1 12 + 1 1 = 1 X

    I.H. : Pretpostavimo da je tacno ai = i2 + i 1

    I.K. : Iz konstrukcije se vidi ai = 2(i+ 1) +aiI.H.= 2i+ 2 + i2 + i 1 = i2 + 3i+ 1 = (i+ 2)2 + (i+ 1) 1

    Primer: Dokazati da je1

    2+

    1

    22+ + 1

    2n< 1

    Dokaz (indukcijom po n)

    Baza Indukcije: n = 11

    2< 1 X

    I.H. : vazi za n

    I.K. :1

    2+

    1

    22+ + 1

    2n+

    1

    2n+1=

    1

    2+

    1

    2(1

    2+

    1

    22+ + 1

    2n)I.H.

    0) do

    k = k+1

    b[k] = t mod 2

    t = t/2

    end

    Invarijanta petlje: t 2k + b[1] + b[2] 2 + + b[k] 2k1 = n

    Dokaz korektnosti: (indukcijom po n)

    B.I. : k = 0 n+ nista = nI.H. : t 2k + b[1] + b[2] 2 + + b[k] 2k 1 = nI.K. : U narednom prolasku kroz petlju

    k = k+1

    t = t/2

    b[k+1] = t mod 2

    Zbir je sada

    (t/2) 2k+1 + b[1] + b[2] 2 + + b[k] 2k1 + (tmod2) 2k

    = 2k (2(t2) + tmod2) + b[1] + b[2] 2 + + b[k] 2k1

    = t 2k + b[1] + b[2] 2 + + b[k] 2k1 = n X

    Pri izlazu iz petlje, za t = 0, dobija seb[1] + b[2] 2 + + b[l] 2l = nDobija se ispravan izlaz.

    5 Analiza algoritama, Onotacija, vremenska i prostorna slozenost

    Cilj analize algoritama je da proceni brzinu izvrsavanja algoritma bez obzira na to koji racunar ga koristi.Ideja je da se proceni brzina rada bez realizacije. Tacno ponasanje algoritma je nemoguce predvidetisem u najjednostavnijim slucajevima. Analiza algoritma mora biti priblizna. Ona omogucava poreenjealgoritama koji resavaju isti problem.

    Zanemaruju se konstantni faktori zato sto se i izvrsavanja na razlicitim racunarima razlikuju za kon-stantu. Najinteresantnija je asimptotska analiza algoritama, odnosno kada velicina ulaza tezi jako veli-kim vrednostima. Obicno se velicina ulaza opisuje kao memorijski prostor koji je neophodan za koriscenjealgoritma. Najcesce se koristi analiza najgoreg slucaja. Trajanje algoritma predstavlja funkciju u zavi-snosti od ulazne velicine.

    Analiza asimptotskog ponasanja slozenosti algoritma, i to u najgorem slucaju meu ulazima odreenevelicine to je dakle aproksimacija vremena rada odreenog algoritma na odreenom ulazu, koja ipaknajcesce dobro karakterise osobine algoritma.

    Definicija 1: Neka su f i g pozitivne funkcije od argumenta n iz skupa N prirodnih brojeva. Kazese da je g(n) = O(f(n)) ako postoje pozitivne konstante c iN , takve da za svako n > N vazi g(n) cf(n).

    Oznaka O(f(n)) se ustvari odnosi na klasu funkcija, a jednakost g(n) = O(f(n)) je uobicajena oznakaza inkluziju g(n) O(f(n)). Jasno je da je funkcija f samo neka vrsta gornje granice za funkciju g.Na primer, pored jednakosti 5n2 + 15 = O(n2) (jer je 5n2 + 15 6n2 za n 4) vazi i jednakost

    8

  • 5n2 + 15 = O(n3) (jer je 5n2 + 15 n3 za n 6). Ova notacija omogucuje ignorisanje multiplikativnihi aditivnih konstanti: umesto O(5n+ 4) moze se pisati O(n). Slicno, u izrazu O(log n) osnova logaritmanije bitna, jer se logaritmi za razlicite osnove razlikuju za multiplikativnu konstantu:

    loga n = loga(blogb n) = logb n loga b.

    Specijalno, O(1) je oznaka za klasu ogranicenih funkcija. Lako se pokazuje da se O-izrazi mogu sabiratii mnoziti:

    O(f(n)) +O(g(n)) = O(f(n) + g(n)),

    O(f(n))O(g(n)) = O(f(n)g(n)).

    Drugi problem u vezi sa slozenoscu algoritma je pitanje donje granice za potreban broj racunskih ope-racija. Dok se gornja granica odnosi na konkretan algoritam, donja granica slozenosti odnosi se naproizvoljan algoritam iz neke odreene klase. Zbog toga ocena donje granice zahteva posebne postupkeanalize.

    Definicija 2: Za funkciju g(n) kaze se da je asimptotska donja granica funkcije T (n) i pise se T (n) =(g(n)), ako postoje pozitivni c i N , takvi da za svako n > N vazi T (n) > cg(n).

    Tako je na primer n2 = (n2 100), i n = (n0,9). Vidi se da simbol odgovara relaciji .

    Definicija 3: Ako za dve funkcije f(n) i g(n) istovremeno vazi i f(n) = O(g(n)) i f(n) = (g(n)),onda one imaju iste asimptotske brzine rasta, sto se oznacava sa f(n) = (g(n)).

    Tako je na primer 5n log2 n10 = (n log n), pri cemu je u poslednjem izrazu osnova logaritma nebitna.

    Definicija 4: Cinjenica da je limn

    f(n)

    g(n)= 0 oznacava se sa f(n) = o(g(n)).

    Ocena (vremenske) slozenosti algoritma sastoji se u brojanju racunskih koraka koje treba izvrsiti.Meutim, termin racunski korak moze da podrazumeva razlicite operacije, na primer sabiranje i mnozenje,cije izvrsavanje traje razlicito vreme. Zato se obicno u okviru algoritma izdvaja neki osnovni korak, onajkoji se najcesce ponavlja. Tako, ako se radi o sortiranju, osnovni korak je uporeivanje. Ako je brojuporeivanja O(f(n)), a broj ostalih operacija je proporcionalan broju uporeivanja, onda je O(f(n))granica vremenske slozenosti algoritma.

    Pod prostornom slozenoscu algoritma podrazumeva se velicina memorije potrebne za izvrsavanjealgoritma, pri cemu se prostor za smestanje ulaznih podataka najcesce ne racuna. Kao i kod vremenskeslozenosti, i za prostornu slozenost se najcesce trazi njeno asimptotsko ponasanje u najgorem slucaju,za velike velicine problema. Prostorna slozenost O(n) znaci da je za izvrsavanje algoritma potrebnamemorija proporcionalna onoj za smestanje ulaznih podataka. Ako je pak prostorna slozenost algoritmaO(1), onda to znaci da je potreban memorijski prostor za njegovo izvrsavanje ogranicen konstantom, bezobzira na velicinu ulaza.

    6 Asimptotsko ponasanje resenja rekurentne relacije T (n) =aT (n/b) + cnk.

    Pretpostavimo da nam je cilj analiza algoritma A, pri cemu broj operacija T (n) pri primeni algoritmaA na ulaz velicine n (vremenska slozenost) zadovoljava diferencnu jednacinu tipa

    T (n) = aT(nb

    )+ cnk (1)

    pri cemu je a, b, c, k 0, b 6= 0, i zadata je vrednost T (1). Ovakva jednacina dobija se za algoritam kodkoga se obrada ulaza velicine n svodi na obradu a ulaza velicine n/b, posle cega je potrebno izvrsiti joscnk koraka da bi se od parcijalnih resenja konstruisalo resenje kompletnog ulaza velicine n. Jasno jezasto se za ovakve algoritme kaze da su tipa zavadi pa vladaj , (divide-and-conquer), kako se jos zovualgoritmi zasnovani na dekompoziciji. Obicno je u ovakvim diferencnim jednacinama b prirodan broj.

    9

  • Master teorema: Asimptotsko ponasanje niza T (n), resenja diferencne jednacine (7) dato je jed-nakoscu

    T (n) =

    O(nlogb a) za a > bk

    O(nk log n) za a = bk

    O(nk) za a < bk(2)

    4: Dokaz teoreme bice sproveden samo za podniz n = bm, gde je m celi nenegativni broj. Pomnozivsiobe strane jednakosti (7) sa am/c, dobijamo diferencnu jednacinu tipa (5)

    tm = tm1 + qm, t0 =

    1

    cT (1),

    gde su uvedene oznake tm =1camT (bm) i q = bk/a. Njeno resenje je:

    tm = t0 +

    mi=1

    qi

    Za q 6= 1 jemi=1

    = (1 qm+1)/(1 q) 1, pa se asimptotsko ponasanje niza tm opisuje sledecim

    jednakostima

    tm =

    O(m) za q = 1O(1) za 0 < q < 1O(qm) za q > 1

    (3)

    Posto je T (bm) = camtm, n = bm, odnosno m = logbn, redom se za 0 < q < 1 (b

    k < a), q = 1 (bk = a,odnosno logb a = k) i q > 1 (b

    k > a) dobija

    T (n) =

    O(am) = O(bm logb a) = O(nlogb a) za a > bk

    O(mam) = O(logb n nlogb a) = O(nk log n) za a = bkO((aq)m) = O(bmk) = O(nk) za a < bk

    (4)

    cime je tvrenje teoreme dokazano. 2

    7 Resenje rekurentne relacije T (n) = 2n

    ni=1

    T (i) + n 1, n 2,

    T (1) = 0 (prosecna slozenost algoritma kvik sort)

    Diferencna jednacina najopstijeg oblika Fn = f(Fn1, Fn2, ..., F1, n) zove se potpuna rekurzija ili dife-rencna jednacina sa potpunom istorijom. Razmotriemo jedan primer ovakvih diferencnih jednacina.

    Diferencna jednacina

    T (n) = n 1 + 2n

    n1i=1

    T (i), n 2, T (1) = 0 (5)

    vazna je, jer se do nje dolazi pri analizi prosecne slozenosti sortiranja razdvajanjem, algoritma zaureivanje zadatog skupa brojeva po velicini (sortiranje, videti u knjizi pod 5.3.4). Ideja o ,,elimina-ciji istorije moze se i ovde primeniti zbog toga je zgodno prepisati zadatu jednacinu tako da se u njoj

    uz sumun1i=1

    T (i) ne pojavljuje promenljivi cinilac n:

    nT (n) = n(n 1) + 2n1i=1

    T (i).

    Zatim ovu jednakost treba oduzeti od one koja se od nje dobija zamenom n sa n+ 1:

    (n+ 1)T (n+ 1) nT (n) = (n+ 1)n+ 2n

    i=1

    T (i) n(n 1) 2n1i=1

    T (i) = 2n+ 2T (n),

    10

  • odnosno

    T (n+ 1) =2n

    n+ 1+n+ 2

    n+ 1T (n), n 2

    Ovim je prvi cilj postignut: dobijena diferencna jednacina povezuje samo dva uzastopna clana niza.Resavanje ove diferencne jednacine moze se svesti na poznat problem resavanja F (n+ 1) F (n) = f(n)deljenjem sa n+ 2 i smenom tn = T (n)/(n+ 1):

    T (n+ 1)

    n+ 2 T (n)n+ 1

    =2n

    (n+ 1)(n+ 2),

    odnosno

    tn+1 t(n) =2n

    (n+ 1)(n+ 2).

    Zamenom n sa i i sumiranjem po i u granicama od 1 do n dobija se (t1 = 0)

    tn+1 tn =n

    i=1

    2i

    (i+ 1)(i+ 2). (6)

    Da bi se izracunala suma sa desne strane ove jednakosti, moze se njen opsti clan razloziti na parcijalnerazlomke

    2i

    (i+ 1)(i+ 2)=

    A

    i+ 1+

    B

    i+ 2,

    gde se nepoznati koeficijenti A i B dobijaju tako sto se u identitetu 2i = A(i+ 2) +B(i+ 1) stavi najprei = 1 (dobija se A = 2), a onda i = 2 (odakle je B = 4). Sada je trazena suma jednaka

    ni=1

    = 2n

    i=1

    1

    i+ 1+ 4

    ni=1

    1

    i+ 2= 2

    n+1i=2

    1

    i+ 4

    n+2i=3

    1

    i=

    = 2i=3

    1

    i 2 1

    2+

    4

    n+ 2= 2H(n+ 1) 4 + 4

    n+ 2,

    gde je sa

    H(n) =

    ni=1

    1

    i= lnn+ +O

    (1

    n

    ), (7)

    oznacena parcijalna suma harmonijskog reda; 0, 577 je Ojlerova konstanta. Zamenom vrednostisume u (6) dobija se resenje diferencne jednacine (5)

    T (n+ 1) =

    (2H(n+ 1) 4 + 4

    n+ 2

    )(n+ 2) = 2(n+ 1)H(n+ 1) 4(n+ 1),

    odnosno

    T (n) = 2nH(n) 4n = 2n lnn+ (2 4)n+O(1) = O(n log n). (8)

    U toku izvoenja koriscen je poznati asimptotski razvoj (7). Cesto je korisno znati i asimptotski razvojza n!, Stirlingovu formulu

    n! =2

    2n(ne

    )n(1 +O

    (1

    n

    )),

    odnosno

    log(n!) = O(n log n). (9)

    11

  • 8 Pohlepni (greedy) algoritmi; primer: nalazenje Hofmanovogkoda

    Zadat je tekst sa n razlicitih znakova, tako da su ucestanosti znakova zadate nizom F = f1, f2, ..., fn.Odrediti prefiksni kod E koji minimizira broj bita L(E,F ) upotrebljenih za kodiranje.

    Slika 3: Predstavljanje prefiksnog koda stablom.

    Za prefiksni kod koji minimizira vrednost L(E,F ) kaze se da je optimalni kod; on ocigledno zavisiod niza ucestanosti znakova F . Cilj je za dati niz F odrediti optimalni prefiksni kod (bilo koji; uopstem slucaju postoji vise razlicitih optimalnih kodova). Razmotrimo zbog toga malo detaljnije osobineoptimalnih kodova:

    1. Ako je f1 > f2, onda je l1 l2 (jer bi u protivnom, za l1 > l2 vazilo da je (f1 f2)(l1 l2) > 0,odnosno f1l1 + f2l2 > f1l2 + f2l1 sto znaci da bi broj bitova za prva dva slova bio veci od brojabitova ako zamenimo kodove, sto je suprotno pretpostavci da se radi o optimalnom kodu)

    2. U kodnom stablu, svaki unutrasnji cvor mora da ima oba sina, u protivnom bi se kod mogaopojednostaviti skracivanjem kodnih reci u listovima podstabla ispod cvora sa samo jednim sinom(pogledati sliku 4)

    3. Postoji optimalni kod u kojem su dva najrea slova u poslednjem nivou i sinovi istog oca (pogledatisliku 5)

    Slika 4: Kodno stablo u kome neki cvor ima samo jednog sina sto nije kodno stablo optimalnog koda.

    12

  • Slika 5: Transformacija kodnog stabla, posle koje dva znaka sa najmanjim frekvencijama fi i fj postajusinovi istog oca.

    Realizacija. Operacije koje se izvrsavaju prilikom formiranja Hofmanovog koda su

    umetanje u strukturu podataka,

    brisanje dva znaka sa najmanjim frekvencijama iz strukture, i

    konstrukcija kodnog stabla.

    Hip je pogodna struktura podataka za prve dve operacije, jer se tada te operacije u najgorem slucajuizvrsavaju za O(log n) koraka. Algoritam za formiranje Hofmanovog koda glasi:

    Algoritam Hofman(S, F);

    Ulaz: S (string znakova koji se pojavljuju u tekstu) i F (frekvencije).

    Izlaz: T (kodno stablo Hofmanovog koda za S).

    begin

    ubaciti sve znake u hip H prema njihovim frekvencijama;

    while H neprazan do

    if H sadrzi samo jedan znak X then

    formiraj stablo T koje ima samo koren, cvor X

    else

    skini sa hipa H znakove X, Y sa najmanjim frekvencijama fX, fY;

    zameni X i Y novim znakom Z sa frekvencijom fZ = fX + fY;

    ubaci Z u hip H;

    povezi X i Y tako da budu sinovi Z u T; {Z jos nema oca}

    end

    Primer: Neka je dat fajl u kome se pojavljuju znaci A, B, C, D, E i F sa frekvencijama redom 5, 2,3, 4, 10 i 1. Dva znaka sa najmanjim frekvencijama su F i B; oni se zamenjuju novim znakom BF safrekvencijom 1 + 2 = 3. Dalja zamenjivanja prikazana su u sledecoj tabeli.

    Slika 6: Dobijeno kodno stablo.

    13

  • Slika 7: Stablo Hofmanovog koda iz primera.

    Slozenost. Slozenost dodavanja novog cvora stablu ogranicena je konstantom. Umetanja i brisanja izhipa izvrsavaju se u O(log n) koraka. Slozenost algoritma je dakle O(n log n).

    9 Izracunavanje vrednosti polinoma

    Napomena: U nastavku ce biti prikazan najoptimalniji algoritam za izracunavanje vrednosti polinoma.Konsultovati se sa profesorovom knjigom za ostale (manje efikasne) algoritme.

    Problem. Dati su realni brojevi an, an1, ..., a1, a0 i realni broj x. Izracunati vrednost polinoma

    Pn(x) =n

    i=0

    aixi.

    Induktivna hipoteza. Umemo da izracunamo vrednost polinoma P n1(x) sa koeficijentima an, an1, ..., a1u tacki x.

    Ovakva induktivna hipoteza je pogodna jer se lako prosiruje. Posto je Pn(x) = x P n1(x) + a0, zaizracunavanje Pn(x) polazeci od P

    n1(x) dovoljno je jedno mnozenje i jedno sabiranje. Izracunavanje se

    moze opisati sledecim izrazom:

    anxn + an1x

    n1 + ...+ a1x+ a0 = ((...((anx+ an1)x+ an2)...)x+ a1)x+ a0,

    poznatim kao Hornerova sema.

    Algoritam Vrednost_polinoma(a, x);

    Ulaz: a (niz koeficijenata polinoma) i x (realni broj);

    Izlaz: P (vrednost polinoma u tacki x);

    begin

    P = a[n];

    for i = 1 to n do

    P = x * P + a[n-i];

    end

    Slozenost. Telo for petlje izvrsava se n puta za vreme O(1), pa je stoga slozenost O(n).

    10 Nalazenje maksimalnog indukovanog podgrafa grafa sa ste-penovima cvorova ne manjim od zadatog broja

    Neka je G = (V,E) neusmereni graf. Graf H = (U,F ) je indukovani podgraf grafa G ako U V i Fsadrzi sve grane iz E kojima su oba kraja u U , videti primer na slici 8. Stepen cvora je broj njemususednih cvorova.

    14

  • Slika 8: Primer indukovanog podgrafa. Grane su neureeni parovi cvorova.

    Problem. Za zadati neusmereni graf G = (V,E) i zadati prirodni broj k pronaci maksimalni indukovanipodgraf H = (U,F ) grafa G (tj. indukovani podgraf sa maksimalnim brojem cvorova) uz uslov da svicvorovi podgrafa H imaju stepen bar k, ili ustanoviti da takav indukovani podgraf ne postoji.

    Umesto da algoritam posmatramo kao niz koraka koje treba izvrsiti da bi se doslo do rezultata, mozemoda sebi postavimo za cilj dokazivanje teoreme da algoritam postoji. Potrebno je pronaci maksimalniindukovani podgraf koji zadovoljava zadate uslove.

    4 : (indukcijom po broju cvorova n)

    (B.I.) Prvi netrivijalni slucaj pojavljuje se za n = k + 1, jer ako je n k, onda su stepeni svih cvorovamanji od k. Ako je n = k + 1, onda samo u jednom slucaju postoji indukovani podgraf sa stepenimacvorova k: to je slucaj potpunog grafa (grafa sa svim mogucim granama).(I.H.) Pretpostavimo da umemo da resimo problem sa |v| = n cvorova.(I.K.) Posmatramo graf G = (V,E), gde je sada |V | = n + 1. Ako su stepeni svih cvorova u G veciili jednaki od k, onda graf H = G zadovoljava uslove i dokaz je zavrsen. U protivnom, postoji cvor vstepena < k. Cvor v se moze ukloniti iz G zajedno sa svim njemu susednim granama, ne menjajuciuslove teoreme. Posle uklanjanja v, graf ima n cvorova, pa prema induktivnoj hipotezi mi umemo daresimo problem do kraja.

    11 Nalazenje maksimalnog podskupa S A datog skupa A nakome je zadata funkcija f : A A sa osobinom 1 1

    Problem. Neka je zadat konacan skup A i preslikavanje f : A A. Odrediti podskup S A sanajvecim mogucim brojem elemenata tako da bude f(S) S i da restrikcija f na S bude bijekcija.

    Ako je f bijekcija, onda kompletan skup A zadovoljava uslove problema, pa je maksimalni podskupS = A. Ako je pak f(a) = f(b) za neke a 6= b, onda S ne moze da sadrzi i a i b. Na primer, skup S uproblemu sa slike 9 ne moze da sadrzi oba elementa 2 i 3, jer je f(2) = f(3) = 1.

    Slika 9: Primer preslikavanja skupa u samog sebe.

    15

  • Meutim, nije svejedno koji ce elemenat od ova dva biti eliminisan. Ako na primer eliminisemo 3, ondase zbog f(1) = 3 mora eliminisati i 1. Zatim se na isti nacin zbog f(2) = 1 mora eliminisati i 2. Dobijenipodskup sigurno nije maksimalan, jer je moguce eliminisati samo elemenat 2 umesto 1, 2 i 3. Resenjeproblema na slici 8 je podskup {1, 3, 5}, sto se moze ustanoviti npr. proverom svih mogucih podskupovaS A. Postavlja se pitanje nalazenja opsteg metoda za odlucivanje koje elemente treba ukljuciti u S.

    Algoritam. U svakom koraku pronalazimo elemenat u koga se ni jedan drugi ne preslikava, ukla-njamo ga i nastavljamo rekurzivno. Realizacija algoritma ipak ne mora da bude rekurzivna. Svakomelementu i, 1 i n pridruzuje se brojac c[i], cija je pocetna vrednost jednaka broju elemenata kojise preslikavaju u i. Vrednosti c[i] mogu se izracunati u n koraka prolazeci kroz vektor f i pri tomepovecavajuci za jedan odgovarajuce brojace. Zatim se u listu stavljaju svi elementi kojima je vrednostbrojaca dobila vrednost 0.U svakom koraku se prvi elemenat j iz liste uklanja iz liste i iz skupa, dekrementira se c[f [j]], a akoc[f [j]] dobije vrednost 0, f [j] se stavlja u listu. Resavanje je zavrseno u trenutku kad je lista prazna.

    Slozenost. Za uvodni deo (inicijalizaciju) treba izvrsiti O(n) koraka. Svaki elemenat se u listu moze sta-viti najvise jednom, a operacije potrebne da se elemenat ukloni iz liste izvrsavaju se za vreme ogranicenokonstantom. Prema tome, ukupan broj koraka je O(n).

    12 Algoritam za nalazenje takvog i da su u kvadratnoj 0 1matrici svi elementi ite vrste (sem itog) 1, i svi elementiite kolone (sem itog) 0

    Ovaj problem je poznatiji pod imenom ,,Problem nalazenja zvezde. Meu n osoba zvezda je osobakoja nikoga ne poznaje, a koju svi ostali poznaju. Problem je identifikovati zvezdu (ako ona postoji)postavljajuci pitanja oblika ,,Izvinite, da li poznajete onu osobu? Pretpostavlja se da su svi odgovoritacni, a da ce cak i zvezda odgovarati na pitanja.

    Problem se moze preformulisati u grafovski. Formiramo usmereni graf sa cvorovima koji odgovarajuosobama, u kome grana od osobe A ka osobi B postoji ako A poznaje B. Zvezda odgovara ponoru grafa,cvoru u koji ulazi n 1 grana, a iz koga ne izlazi ni jedna grana. Jasno je da graf moze imati najvisejedan ponor. Ulaz problema se opisuje n x n matricom povezanosti M , ciji elemenat Mij je jednak 1ako osoba i poznaje osobu j, odnosno 0 u protivnom; dijagonalni elementi su jednaki nuli.

    Bazni slucaj sa dve osobe je jednostavan. Posmatrajmo razliku izmeu problema sa n 1 osobom iproblema sa n osoba. Pretpostavljamo da znamo da pronaemo zvezdu meu prvih n 1 osoba induk-cijom. Posto moze da postoji najvise jedna zvezda, postoje tri mogucnosti:

    1. zvezda je jedna od prvih n 1 osoba;

    2. zvezda je n-ta osoba;

    3. zvezda ne postoji.

    Pretpostavimo da osobu A pitamo da li poznaje osobu B. Ako A poznaje B, onda A nije zvezda, a akopak A ne poznaje B, onda B nije zvezda. U oba slucaja se jedna osoba eliminise postavljanjem samojednog pitanja.

    Algoritam. Algoritam se deli u dve faze. U prvoj fazi se eliminisu sve osobe sem jednog kandidata zazvezdu, a druga faza je neophodna da se ustanovi da li kandidat jeste zvezda.

    Algoritam Zvezda(Poznaje);

    Ulaz: Poznaje (n n Bulova matrica sa nulama na dijagonali).Izlaz: Zvezda.

    begin

    i := 1; {osoba A}

    j := 2; {osoba B}

    Naredni := 3; {sledeci koji ce se proveravati}

    16

  • {prva faza: eliminisu se svi kandidati sem jednog}

    while Naredni

  • Lako je proveriti da se slucaj kad nema levog ili desnog podstabla, moze resiti tako da se visina nepo-stojeceg sina zameni sa 1.Karakteristika ovog algoritma je da on resava nesto opstiji problem. Umesto da racunamo samo faktoreravnoteze, mi izracunavamo i visine cvorova. Ispostavlja se da je opstiji problem laksi, jer se visine lakoracunaju. Ako je resenje opstije (jer je problem prosiren), onda induktivni korak moze biti jednostavniji,jer posedujemo snaznija sredstva. Uobicajena greska pri resavanju sireg problema je da se zaboravi napostojanje dva parametra, i da se svaki od ih mora posebno izracunati.

    14 Nalazenje maksimalnog (uzastopnog) podniza datog niza re-alnih brojeva

    Problem. Zadat je niz x1, x2, ..., xn realnih brojeva (ne obavezno pozitivnih). Odrediti podniz xi, xi+1, ..., xjuzastopnih elemenata sa najvecom mogucom sumom.

    Za ovakav podniz reci cemo da je maksimalni podniz. Na primer, u nizu (2,3, 1.5,1, 3,2,3, 3)maksimalni podniz je 1.5,1, 3, sa sumom 3.5. Moze da postoji vise maksimalnih podnizova datog niza.Ako su svi clanovi niza negativni, onda je maksimalni podniz prazan (po definiciji, suma praznog nizaje 0).

    Induktivna hipoteza. Znamo da naemo maksimalni podniz u nizovima duzine < n.Za n = 1 maksimalni podniz je broj x1 ako je x1 0, odnosno prazan podniz ako je x1 < 0. Problem sarazmotrenom induktivnom hipotezom je u tome sto xn moze da produzi podniz koji nije maksimalan uS i tako formira novi maksimalni podniz u S. Prema tome, nije dovoljno samo poznavanje maksimalnogpodniza u S. Meutim, xn moze da produzi samo podniz koji se zavrsava sa xn1, odnosno sufiks nizaS.

    Pojacana induktivna hipoteza. U nizovima duzine < n umemo da pronaemo maksimalni pod-niz, i maksimalni sufiks.Ako za podniz S znamo oba ova podniza, algoritam postaje jasan. Maksimalni sufiks prosirujemobrojem xn. Ako je dobijena suma veca od sume (globalno) maksimalnog podniza, onda imamo novimaksimalni podniz (takoe i novi maksimalni sufiks). U protivnom, zadrzavamo prethodni maksimalnipodniz. Posao time nije zavrsen: potrebno je odrediti i novi maksimalni sufiks. U opstem slucaju novimaksimalni sufiks se ne dobija uvek prosirivanjem starog brojem xn. Moze se dogoditi da je maksimalnisufiks koji se zavrsava sabirkom xn negativan. Tada je novi maksimalni sufiks ustvari prazan podniz, sasumom 0.

    Algoritam Max_uzast_podniz(X, n);

    Ulaz: X (niz duzine n).

    Izlaz: Glob_max (suma maksimalnog podniza).

    begin

    Glob_max := 0; {pocetna vrednost globalno maks. sume}

    Suf_max := 0; {pocetna vrednost sume maks. sufiksa}

    for i := 1 to n do

    if x[i] + Suf_max > Glob_max then

    Suf_max := Suf_max + x[i];

    Glob_max := Suf_max;

    else if x[i] + Suf_max > 0 then

    Suf_max := Suf_max + x[i];

    else Suf_max := 0;

    end

    15 Binarna pretraga, primeri primene; interpolaciona pretraga

    15.1 Binarna pretraga, primeri primene

    Osnovna ideja binarne pretrage je podela prostora na dva priblizno jednaka dela postavljanjem samojednog pitanja.

    18

  • Problem (cista binarna pretraga). Neka je x1, x2, ..., xn niz realnih brojeva takav da je x1 x2 ... xn. Za zadati realni broj z treba ustanoviti da li se z pojavljuje u nizu, a ako je odgovor ,,da,potrebno je pronaci indeks i takav da je xi = z.

    Ideja je prepoloviti prostor koji se pretrazuje tako sto se najpre proveri srednji clan niza. Pretpo-stavimo zbog jednostavnosti da je n paran broj. Ako je z manje od xn/2+1, onda z moze biti samo uprvoj polovini niza; u protivnom, z moze biti samo u drugoj polovini niza. Pronalazenje z u prvoj ilidrugoj polovini niza je problem velicine n/2, koji se resava rekurzivno. Bazni slucaj n = 1 resava seneposrednim uporeivanjem z sa elementom.

    Algoritam Binarna_Pretraga(X, n, z);

    Ulaz: X (niz od n brojeva, uredenih neopadajuce) i z (broj koji se trazi).

    Izlaz: Poz (indeks i takav da je X[i] = z, ili 0 ako takav indeks ne postoji).

    begin

    Poz = Nadji(z, 1, n);

    end

    function Nadji(z; Levi;Desni)

    begin

    if Levi = Desni then

    if X[Levi] = z then Nadji = Levi;

    else Nadji = 0;

    else

    Srednji = (Levi + Desni)/2;

    if z < X[Srednji] then

    Nadji = Nadji(z, Levi, Srednji - 1)

    else

    Nadji = Nadji(z, Srednji, Desni)

    end

    Slozenost. Slozenost binarne pretrage niza od n elemenata moze se opisati rekurentnom relacijomT (n) = T (n/2) + 1, odakle se dobija da je slozenost O(log n) na osnovu Master teoreme.

    Problem. Za zadati rastuce ureeni niz celih brojeva a1, a2, ..., an utvrditi da li postoji indeks i, takavda je ai = i.

    Ovaj problem je moguci svesti na binarnu pretragu. Zaista, niz xi = ai i je neopadajuci (jer jexi+1xi = ai+1ai1 0), a uslov ai = i je ekvivalentan uslovu xi = 0. Prema tome, zadati problemresava se binarnom pretragom niza xi, u kome se trazi broj z = 0.

    Problem (binarna pretraga ciklicki ureenog niza). Za zadati cikliqcki ureeni niz pronaci po-ziciju minimalnog elementa niza (zbog jednostavnosti moze se pretpostaviti da je ta pozicija jedinstvena).

    Za niz x1, x2, ..., xn kaze se da je ciklicki ureen ako vaze nejednakosti

    xi < xi+1 < ... < xn < x1 < ... < xi1,

    gde je xi najmanji elemenat niza.Da bismo pronasli minimalni elemenat xi u nizu, koristimo ideju binarne pretrage da jednim uporeivanjemeliminisemo polovinu niza. Uzmimo proizvoljna dva broja xk i xm takva da je k < m. Ako je xk < xm,onda i ne moze biti u intervalu k < i m, jer je xi najmanji elemenat niza (u tom slucaju bilo bixi < xm < xk suprotno pretpostavci da je xk < xm). U protivnom, ako je xk > xm, onda i mora bitiu intervalu k < i m, jer je tada monotonost niza prekinuta negde u intervalu indeksa [k,m]. Prematome, jednim uporeivanjem moze se eliminisati mnogo elemenata.Odgovarajucim izborom k i m, i se moze odrediti pomocu O(log n) uporeivanja. Invarijanta glavnepetlje algoritma je uslov da se i uvek nalazi u intervalu [Levi,Desni].

    Algoritam Cikl_Binarna_Pretraga(X, n);

    19

  • Ulaz: X (vektor sa ciklicki uredenim nizom od n razlicitih brojeva);

    Izlaz: poz (indeks minimalnog elementa u X);

    begin

    poz = c_Nadji(1, n);

    end

    function c_Nadji(Levi, Desni)

    begin

    if Levi = Desni then

    c_Nadji = Levi;

    else

    Srednji = (Levi + Desni)/2;

    if X[Srednji] < X[Desni] then

    c_Nadji = c_Nadji(Levi, Srednji);

    else

    c_Nadji = c_Nadji(Srednji + 1, Desni);

    end

    Problem (Binarna pretraga niza nepoznate duzine). Posmatrajmo varijantu problema pretragekad se zadati broj z trazi u ureenom nizu nepoznate duzine. Da bi se problem sveo na vec resen,potrebno je pronaci bar jedan indeks i takav da je xi > z: tada se moze preci na binarnu pretragu opsegaindeksa od 1 do i.

    Moze se postupiti na sledeci nacin. Najpre se z uporeuje sa x1. Ako je z x1, onda z moze bitijednako samo broju x1. Pretpostavimo da znamo indeks j takav da je z > xj . Posle uporeivanja zsa x2j postoje dve mogucnosti. Ako je z x2j , onda znamo da je xj < z x2j , pa se z moze pronacipomocu O(log2 j) uporeivanja. Ako je pak z > x2j , onda je prostor za pretrazivanje udvostrucen, itreba nastaviti (indukcijom) tako sto se j zameni sa 2j.Pretpostavimo da je i najmanji indeks takav da je z xi. Tada je dovoljno O(log2 i) uporeivanja dase (udvostrucavanjem) pronae takvo xj koje je vece ili jednako od z, i novih O(log2 i) uporeivanja dase pronae z.Isti algoritam moze se upotrebiti i ako je duzina niza poznata, ali ocekujemo da je indeks i vrlo mali.Da bi ovaj algoritam bio bolji od obicne binarne pretrage, potrebno je da bude priblino 2 log2 i < log2 n,odnosno i n) then print "greska";

    else

    S = Sel(1, n, k);

    end

    function Sel(Levi, Desni, k);

    begin

    if Levi = Desni then

    Sel = Levi;

    else

    S = Razdvajanje(X, Levi, Desni); {videti sliku *}

    if S - Levi + 1 >= k then

    Sel = Sel(Levi, S, k);

    else

    Sel = Sel(S + 1, Desni, k - (S - Levi + 1));

    end

    Slozenost. Kao i kod sortiranja razdvajanjem, los izbor pivota vodi kvadratnom algoritmu. Srednjaslozenost ovog algoritma moze se oceniti na slican nacin kao kod sortiranja razdvajanjem. Rekurentnarelacija koja opisuje prosecnu slozenost ovog algoritam je T (n) = T (n/2) + cn, odakle se iz Masterteoreme dobije slozenost O(n).

    18 Nalazenje dve najblize tacke u datom skupu od n tacaka uravni

    Umesto da razmatramo tacke jednu po jednu, mozemo da skup tacaka podelimo na dva jednaka dela.Induktivna hipoteza je takva da problem svodimo na dva problema sa n/2 tacaka. Zbog jednostavnostipretpostavimo da je n stepen dvojke, tako da je skup uvek moguce podeliti na dva jednaka dela.Postoji vise nacina da se skup podeli na dva jednaka dela. Biramo nacin koji najvise odgovara nasimciljevima. Voleli bismo da dobijemo sto vise korisnih informacija iz resea manjih problema, odnosno dasto veci deo tih informacija vazi i za kompletan problem. Izgleda razumno da se skup podeli na dva delapodelom ravni na dva disjunktna dela, tako da svaki od njih sadrzi polovinu tacaka.Posto se pronae najmanje rastojanje u svakom delu, treba razmotriti samo rastojanja izmeu tacaka bli-skih granici skupova. Najjednostavniji nacin podele je sortirati tacke prema (na primer) x-koordinatamai podeliti ravan pravom paralelnom sa y-osom, koja deli skup na dva jednaka dela, videti sliku 12 (ako visetacaka lezi na pravoj podele, tacke se mogu na proizvoljan nacin razdeliti izmeu skupova). Nacin podeleizabran je tako da se maksimalno pojednostavi objedinjavanje resenja manjih problema. Sortiranje trebaizvrsiti samo jednom.

    23

  • Slika 12: Problem nalazenja dve najblize tacke.

    Zbog jednostavnosti ogranicicemo se na nalazenje vrednosti najmanjeg rastojanja izmeu tacaka (a ne ipara tacaka za koje se ono dostize). Pronalazenje dve najblize tacke izvodi se na sledeci nacin.Neka je P skup tacaka i neka je n stepen dvojke. Najpre se skup P deli na dva istobrojna podskupaP1 i P2 na opisani nacin. Najmanje rastojanje u svakom podskupu pronalazi se na osnovu induktivnehipoteze. Neka je d1 minimalno rastojanje u P1, a d2 minimalno rastojanje u P2. Bez smanjenja opstostimoze se pretpostaviti da je d1 d2. Potrebno je pronaci najmanje rastojanje u celom skupu, odnosnoustanoviti da li u P1 postoji tacka na rastojanju manjem od d1 od neke tacke u P2.Primetimo najpre da je dovoljno razmatrati tacke u traci sirine 2d1, simetricnoj u odnosu na pravupodele (videti sliku 13). Ostale tacke ne mogu biti na rastojanju manjem od d1 od neke tacke iz drugogpodskupa. Na osnovu ovog zapazanja obicno se iz razmatranja eliminise veliki broj tacaka. Meutim,u najgorem slucaju sve tacke mogu biti u traci, pa ne mozemo da sebi priustimo primenu trivijalnogalgoritma na njih.

    Drugo manje ocigledno zapazanje je da za proizvoljnu tacku p u traci postoji samo mali broj tacakau suprotnoj traci cije rastojanje od p moze biti manje od d1. Iskoristicemo cinjenicu da je

    2/2 > 0, 7.

    Neka je sa yp oznacena y-koordinata tacke p. Konstruisimo pravougaonik visine 2, 1d1 = 1 bice izracunati na osnovu P[0, 0]}

    for i := 1 to n do

    for k := 0 to K do {izracunavanje elementa P[i, k]}

    P[i, k].Postoji := false; {polazna vrednost}

    if P[i - 1, k].Postoji then

    P[i, k].Postoji := true;

    P[i, k].Pripada := false;

    else if k - S[i] >= 0 then

    if P[i - 1, k - S[i]].Postoji then

    P[i, k].Postoji := true;

    P[i, k].Pripada := true;

    end

    Slozenost. U tabeli ima nK elemenata. Svaki od njih izracunava se za konstantno vreme na osnovudruga dva elementa, pa je ukupna vremenska slozenost algoritma O(nK). Ako predmeti nisu preveliki,onda K ne moze biti preveliko, pa je nK

  • Problem: Za zadate stringove A = a1a2 . . . an i B = b1b2 . . . bm pronaci niz edit operacija najmaecene koji A transformise u B.

    Na primer, da se string abbc transformise u string babb, moze se prvo obrisati a (dobija se bbc), umetnutia izmedu dva b (dobija se babc), i na kraju zameniti c sa b - ukupno tri promene. Isti rezultat moze sepostici sa samo dve promene: umetanjem novog b na pocetku (dobija se babbc) i brisanjem poslednjeg c.Cilj je pronaci transformaciju koja se sastoji od minimalnog broja edit operacija (takva transformacijau opstem slucaju nije jedinstvena).Najmanji broj edit operacija koji transformise string A u string B zvacemo edit rastojanjem d(A,B)stringova A i B. Funkcija d(A,B) je metrika: ocigledno je d(A,A) = 0 i d(A,B) = d(B,A) , za proi-zvoljne stringove A i B (ako postoji niz edit operacija duzine k koji transformise A u B, onda inverznih koperacija, primenjenih obrnutim redosledom, transformisu B u A). Ako su A, B i C proizvoljni stringovi,tada vazi nejednakost trougla: d(A,B)+d(B,C) > d(A,C). Zaista, postoji niz od d(A,B) edit operacijakoje prevode A u B, i postoji niz od d(B,C) edit operacija koje prevode B u C. Posmatrane zajedno,ovih d(A,B) + d(B,C) edit operacija prevode A u C; iz cinjenice da je d(A,C) najmanji broj edit ope-racija koje A prevode u C sledi trazena nejednakost. Rastojanje d(A,B) poznato je kao Levenstajnovorastojanje (eng: Levenstein).

    Mogucih nizova edit operacija koje A prevode u B, ima mnogo, pa je na prvi pogled tesko medu njimanaci najbolji. Za pocetak, ogranicicemo se na nalazenje edit rastojanja d(A,B), odnosno najmanjegbroja edit operacija koje prevode A u B (a ne i samog niza edit operacija). Kao i obicno, pokusacemoda problem resimo indukcijom. Za zadati string A oznacimo sa A(i) njegov prefiks duzine i. Problemje odrediti rastojanje d(A(n), B(m)). Za n = 0 potrebno je prazan prefiks A(0) transformisati u stringB(m) duzine m. Ocigledno je za to potrebno najmanje m operacija umetanja znakova; prema tome,d(A(0), B(m)) = m za m > 0. Slicno, d(A(n), B(0)) = n za n > 0, jer se najkraci niz edit opera-cija koje string A(n) duzine n prevodi u prazan string B(0) sastoji od n brisanja. Da bismo problemresili indukcijom, potrebno je da izracunavae rastojanja d(A(i), B(j)) izmedu nekih prefiksa svedemo naizracunavanje rastojanja izmedu nekih kracih prefiksa. Ovaj cilj moze se postici ako razmotrimo kojaedit operacija moze biti poslednja u nizu edit operacija koje prevode A(i) u B(j).Postoje tri mogucnosti:

    (a) zamena znaka ai (istim ili razlicitim) znakom bj , posto je prethod- no prefiks A(i1) transformisanu B(j 1),

    (b) umetanje znaka bj , posto je prethodno prefiks A(i) transformisan u B(j 1);

    (c) brisanje znaka ai, posto je prethodno prefiks A(i 1) transformisan u B(j).

    Neka je

    c(i, j) =

    {0 za ai = bj1 za ai 6= bj

    (10)

    Najmanji broj edit operacija koje A(i) prevode u B(j) jednak najmanjem od tri izraza d(A(i 1), B(j1)) + c(i, j), d(A(i), B(j 1)) + 1 i d(A(i 1), B(j)) + 1. Neka je C matrica ciji su elementi rastojanjasvih podstringova A od svih podstringova B, tj. C[i, j] = d(A(i), B(j)), 0 < i < n, 0 < j < m. Elementiove matrice zadovoljavaju diferencnu jednacinu

    C[i, j] = minC[i 1, j 1] + c(i, j);C[i, j 1] + 1;C[i 1, j] + 1; (11)

    koja njen proizvoljan elemenat izrazava preko tri druga: iznad, levo i gore levo:

    28

  • Ova jednakost omogucuje izracunavae svih elemenata matrice C, posto se znaju njena 0 ta kolonai 0 ta vrsta. Time je resen problem izracunavanja edit rastojanja stringova A i B : d(A,B) = C[n,m].Opisani algoritam je primer dinamickog programiranja.

    Realizacija: Za izracunavanja se koristi matrica C dimenzije (n + 1) (m + 1), pri cemu prvi, od-nosno drugi indeks uzimaju vrednosti iz opsega [0, n], odnosno [0,m]. Neka M [i, j] oznacava poslednjuedit operaciju koja dovodi do minimalne vrednosti C[i, j]. Dovoljno je zapamtiti samo tu poslednju editoperaciju (brisanje A[i], umetanje B[j] ili zamena A[i] sa B[j]), jer se do kompletnog niza edit operacijadolazi prolazeci elemente matrice unazad, polazeci od M [n,m]. Za izracunavanje C[i, j], potrebno jeznati C[i 1, j], C[i, j 1] i C[i 1, j 1]. Poslednja promena M [i, j] odredena je time koja od trimogucnosti daje minimalnu vrednost za C[i, j]; izbor nije uvek jednoznacan!

    Algoritam Edit_rastojanje(A,n,B,m);

    Ulaz: A (string duzine n), i B (string duzine m).

    Izlaz: C (matrica rastojanja podstringova A i B).

    begin

    for (i:=0 to n) do

    C[i,0]:=i;

    for (j:=0 to m) do

    C[0,j]:=j;

    for (i:=1 to n) do

    for (j:=1 to m) do

    x:=C[i-1,j]+1;

    y:=C[i,j-1]+1;

    if (a[i]=b[j]) then

    z:=C[i-1,j-1];

    else

    z:=C[i-1,j-1] + 1;

    C[i,j]:=min(x,y,z)

    {izabrana edit operacija pamti se u M[i,j]}

    end

    Slozenost: Svaki elemenat matrice C izracunava se za konstantno vreme, pa je vremenska slozenostalgoritma O(n m). Problem sa ovom verzijom algoritma je u tome sto je i njegova prostorna slozenostO(n m). Ako se matrica C popunjava vrstu po vrstu, posto vrsta zavisi samo od prethodne, ovajalgoritam moze se preraditi tako da mu prostorna slozenost bude O(m).

    21 KMP algoritam za nalazenje jednog stringa u drugom.

    Preporucuje se ucenje kodova.

    Neka su S = s1s2...sn i P = p1p2...pm dva stringa (niza znakova iz konacnog alfabeta). Za prvi od njihreci cemo da je tekst, a za drugi da je uzorak. Podstring stringa S je string sisi+1...sj od uzastopnihznakova S.

    Problem. Za dati tekst S = s1s2...sn i uzorak P = p1p2...pm ustanoviti da li postoji podstring Sjednak P , a ako postoji, pronaci prvu pojavu uzorka u tekstu, odnosno najmanji indeks k takav da jesk+i1 = pi za i = 1, 2, ...,m.

    Naivni algoritam. Na prvi pogled problem izgleda jednostavno. Dovoljno je uporediti uzorak Psa svim mogucim podstringovima S oblika sksk+1...sk+m1 duzine m, pri cemu k uzima vrednosti redom1, 2, ..., n m + 1. Uporeivanje uzorka sa podstringom vrsi se znak po znak sleva udesno, sve dokse ne ustanovi da su svi znaci uzorka jednaki odgovarajucim znacima podstringa (u tom trenutku pre-kida se dalje pregledanje podstringova), ili dok se ne naie na neslaganje pi 6= sk+i1 za neko i, 1 i m.

    Slozenost. Broj uporeivanja znakova manji je od mn, pa je slozenost ovog algoritma O(mn) u najgo-rem slucaju.

    29

  • Algoritam Nadji_uzorak(S, n, P, m);

    Ulaz: S (string duzine n) i P (uzorak duzine m).

    Izlaz: Start (indeks pocetka prvog podstringa S jednakog P, ako takav postoji,

    odnosno 0 u protivnom).

    begin

    Start = 0;

    i = 1; {pokazivac na uzorak}

    j = 1; {pokazivac na string}

    while i

  • 21.1 Izracunavanje pomocnog niza za algoritam KMP

    Razmotrimo sada kako se efektivno mogu izracunati elementi vektora h. Kao sto je receno, ako je pi 6= sj, onda je l = h[i] indeks znaka uzorka koga sledeceg treba uporediti sa znakom teksta sj . Drugim recima,l je najveci indeks za koji je p1p2...pl1 = pil+1p + i l + 2pi1 i pl 6= pi. Uz uslov h[1] = 0 ovim suodreeni svi clanovi vektora h.

    Slika 15: Ilustracija ideje na kojoj se zasniva algoritam za trazenje tabele h.

    Ukoliko je A najduzi prefiks p1p2...pk jednak sufiksu pupu+1...pi1, onda ce h[i] biti jednak duzini togprefiksa + 1, odnosno h[i] = |A| + 1. Ukoliko imamo izracunat h[i], i vazi jednakost j = |A| + 1, tadacemo h[i+ 1] potraziti na sledeci nacin:

    Ako je pi = pj , onda je h[i+ 1] = j + 1

    Ako je pi 6= pj , onda je j = h[j] i vracamo se nazad.

    Algoritam Pomaci(P, m);

    Ulaz: P (uzorak, string duzine m);

    Izlaz: h (niz duzine m);

    begin

    i = 1; {indeks elementa h koji se izracunava}

    j = 0; {pokazivac na smaknuti uzorak; uskakae u petlju}

    h[1] = 0; g[1] = 0; {neslagae na prvom znaku u KMP: pomeranje udesno}

    while i < m do

    {na ovom mestu je P[i - j + k] = P[k] za k = 1, 2, ..., j - 1] invarijanta petlje}

    while j > 0 cand P[i] != P[j] do

    j = h[j]; {smanjivanje indeksa j; moze i j = g[j];, ali je ovako bolje!}

    i = i + 1; j = j + 1; {paralelno napredovanje pokazivaca}

    g[i] = j;

    {neka je s simbol u tekstu, sa kojim se P[i] uporeduje u algoritmu KMP}

    if P[i] = P[j] then

    h[i] = h[j] {ako P[i] != s, onda je i P[j] != s; udesno na h[j]}

    else

    h[i] = j {ako P[i] != s, onda proveriti da li je P[j] != s; udesno na j}

    end

    22 Hes tablice.

    Hes tabele spadaju meu najkorisnije strukture podataka. Ideja je da, ako imamo vektor duzine n ivrednosti od 1 do n da stavimo u tabelu, onda cemo vrednost i da stavimo na i-tu poziciju. Ova idejafunkcionise samo za manje vrednosti n-a. Ukoliko je opseg iz koga su vrednosti od 1 do M , gde je M nekijako veliki broj, onda ne mozemo da koristimo vektor duzine M . Primer je upis na osnovu maticnog broja.

    Pretpostavimo da nam je dato n kljuceva iz skupa U velicine |U | = M >> m. Potrebno je nacifunkciju koja bi vrsila preslikavanja {0, 1, 2, ...,M 1} {0, 1, 2, ...,m 1} koja se naziva hes funkcijai koja odreuje odgovarajucu poziciju elementa na osnovu njegovog kljuca. Ako velicina m nije dovoljnovelika, onda moze doci do deljenja odgovarajucih pozicija razlicitih podataka i to se naziva kolizija.Uniformnost i slucajnost su bitne osobine hes funkcija.

    31

  • Postoje dva problema:

    Nalazenje hes funkcija koje minimiziraju verovatnocu da doe do kolizija i

    Nalazenje nacina da se obrade kolizije ako do njih ipak doe

    Hes funkcije: Ako je velicina tabele m prost broj, onda je dobra hes funkcija:

    h(x) = x mod m

    Ukoliko m nije prost broj, onda se moze koristiti hes funkcija tipa:

    h(x) = (x mod p) mod m,

    gde je p prost broj takav da je m

  • Moguc je i drugi pristup ovom problemu, zasnovan na indirektnom adresiranju, pri cemu je nalazenjeunije jednostavno. Svaki elemenat vektora X je dvoclani slog. Prvi elemenat sloga je ime podskupakome elemenat pripada, a drugi - pokazivac ka nekom drugom slogu. U svakom podskupu treba dapostoji tacno jedan elemenat, ciji slog sadrzi prazan pokazivac nil; ime tog elementa je po definiciji imepodskupa; za pokazivac tog elementa kazemo da je pokazivac podskupa. Ako je pokazivac elementaX[i] usmeren ka elementu X[j], onda je ime podskupa koji sadrzi X[i] jednako imenu podskupa kojisadrzi X[j]. Prethodni uslov obezbeduje da ova definicija bude ispravna: nemoguce je da se podskupsastoji od elemenata sa indeksima i1, i2, . . . , ik,i da pored toga pokazivac X[ij ] bude usmeren ka X[ij+1],j = 1, 2, . . . , k 1, a da je pokazivac X[ik] usmeren ka X[i1] - tada ni jedan elemenat podskupa ne biimao pokazivac nil. Na pocetku su svi pokazivaci nil, tj. vektor X zadaje n jednoclanih podskupova.Operacija unija(A,B) izvodi se tako sto se pokazivac podskupa A usmeri ka elementu, ciji je pokazivacistovremeno i pokazivac podskupa B (ili obrnuto). Posle nekoliko formiranja unija, vektor X zadajenekoliko stabala. Svako stablo odgovara podskupu, a svaki cvor elementu. Elemenat u korenu stablasluzi kao ime podskupa. Da bi se pronaslo ime podskupa kome pripada elemenat G, treba pratiti lanacpokazivaca do korena stabla, sloga sa pokazivacem nil. Ovo podseca na situaciju kad neko promeniadresu: umesto da svima javlja da je promenio adresu, on na staroj adresi ostavlja svoju novu adresu(sa molbom da mu dostavljaju prispelu postu) - sto je jednostavnije. Naravno, nalazenje prave adreseje sada nesto slozenije, odnosno operacija nalazenja podskupa kome elemenat pripada je manje efikasna(narocito ako su izduzena stabla koja predstavljaju podskupove).

    Slika 16: Struktura podataka za formiranje unija skupova

    Ideja na kojoj se zasniva efikasna struktura za nalazenje unija je da se stabla uravnoteze, odnosnoskrate. Unija podskupova A i B na slici moze se formirati usmeravanjem pokazivaca A ka B, ili usmera-vanjem pokazivaca B ka A. Ocigledno je da se u drugom slucaju dobija uravnotezenije stablo. Zakljucakse lako uopstava: pokazivac korena stabla sa manje elemenata (odnosno proizvoljnog od dva stabla akoim je broj elemenata jednak) treba usmeriti ka korenu stabla sa vecim brojem elemenata. Jasno je da priformiranju svake nove unije usput treba izracunavati i broj elemenata novog podskupa. Taj podatak sesmesta kao deo sloga u korenu stabla. Primenom ovog pravila se pri formirau unija postize da je visinastabla sa m elemenata uvek manja ili jednaka od log2m, sto pokazuje sledeca teorema.

    Teorema: Ako se pri formiranju unija koristi uravnotezavanje, svako stablo visine h sadrzi bar 2h

    elemenata.

    Dokaz: Dokaz se izvodi indukcijom po broju formiranja unija. Tvrdenje je ocigledno tacno za prvuuniju: dobija se stablo visine jedan sa dva elementa. Posmatrajmo uniju podskupova A i B. Neka suvisine odgovarajucih stabala h(A),h(B), i neka je broj elemenata u A veci ili jednak od broja elemenatau B. Visina kombinovanog stabla jednaka je vecem od brojeva h(A) i h(B) + 1. Ako je veci h(A), ondanovo stablo ima visinu kao A, i vise elmenata nego stablo A, pa je tvrdenje teoreme tacno. U protivnom,novo stablo ima bar dva puta vise elemenata od stabla B (jer A ima bar toliko elemenata koliko B), avisina mu je za jedan veca od visine B, pa je tvrdenje teoreme takode tacno.

    33

  • 24 Predstavljanje grafova: matrica povezanosti, lista povezano-sti.

    Graf G = (V,E) sastoji se od skupa V cvorova i skupa E grana. Grana odgovara paru cvorova. Drugimrecima, grane predstavljaju relaciju izmeu cvorova. Na primer, graf moze da predstavlja skup ljudi, ada grana povezuje dva coveka ako se oni poznaju.

    Graf je usmeren, odnosno neusmeren ako su mu grane ureeni, odnosno neureeni parovi. Ako seusmereni graf predstavlja crtezom, granama se dodaju strelice koje vode ka drugom cvoru iz ureenogpara. Jednostavan primer grafa je stablo.

    Uobicajena su dva nacina predstavljanja grafova:

    Prvi je matrica povezanosti grafa. Neka je |V | = n i V = {v1, v2, ..., vn}. Matrica povezanostigrafa G je kvadratna matrica A = (aij) reda n, sa elementima aij = 1 akko (vi, vj) E, a ostali elementimatrice A su nule. Ako je graf neusmeren, matrica A je simetricna. Vrsta i ove matrice je dakle vektorduzine n cija je j-ta koordinata jednaka 1 ako iz cvora vi vodi grana u cvor vj , odnosno 0 u protivnom.Nedostatak matrice povezanosti je to sto ona uvek zauzima prostor velicine n2, nezavisno od toga kolikograna ima graf. Svakom cvoru grafa pridruzuje se vektor duzine n. Ako je broj grana u grafu mali,vecina elemenata matrice povezanosti bice nule.

    Umesto da se i sve nepostojece grane eksplicitno predstavljaju u matrici povezanosti, mogu se formiratipovezane liste od jedinica iz i-te vrste, i = 1, 2, ..., n. Ovaj drugi nacin predstavljanja grafa zove se listapovezanosti. Svakom cvoru pridruzuje se povezana lista, koja sadrzi sve grane susedne cvoru (odnosnograne ka susednim cvorovima). Lista moze biti ureena prema rednim brojevima cvorova na krajevimanjenih grana. Graf je predstavljen vektorom lista. Svaki elemenat vektora sadrzi ime (indeks) cvora ipokazivac na njegovu listu cvorova. Ako je graf staticki, odnosno nisu dozvoljena umetanja i brisanja,onda se liste mogu predstaviti vektorima na sledeci nacin. Koristi se vektor duizne |V | + |E|. Prvih|V | clanova vektora su pridruzeni cvorovima. Komponenta vektora pridruzena cvoru vi sadrzi indekspocetka spiska cvorova susednih cvoru vi, i = 1, 2, ..., n. Na slici 17 prikazana su na jednom primeru obanacina predstavljanja grafa.

    Slika 17: Predstavljanje grafa matricom povezanosti (a), odnosno listom povezanosti (b)

    Sa matricama povezanosti je jednostavnije raditi. S druge strane, liste povezanosti su efikasnije zagrafove sa malim brojem grana. U praksi se cesto radi sa grafovima koji imaju znatno manje grana odmaksimalnog moguceg broja (n(n 1)/2 neusmerenih, odnosno n(n 1) usmerenih grana), i tada jeobicno bolje koristiti liste povezanosti.

    34

  • 25 Nalazenje Ojlerovog ciklusa u povezanom neusmerenom grafu.

    Da li je moguce u povezanom grafu pronaci ciklus, koji svaku granu sadzri tacno jednom. Ili: da lije moguce nacrtati graf ne dizuci olovku sa papira, tako da olovka svoj put zavrsi na mestu sa koga je ikrenula.Ovakav obilazak je moguc ako i samo ako je graf povezan i svi njegovi cvorovi imaju paran stepen. Takvigrafovi zovu se Ojlerovi grafovi.Dokaz teoreme indukcijom, koji sledi, daje efikasan algoritam za nalazenje Ojlerovog ciklusa u grafu.

    Problem: U zadatom neusmerenom povezanom grafu G = (V,E) ciji svi cvorovi imaju paran ste-pen, pronaci zatvoreni put P, takav da se u njemu svaka grana iz E pojavljuje tacno jednom.

    Dokaz: Lako je pokazati da ako u grafu postoji Ojlerov ciklus, onda svi cvorovi grafa moraju imatiparan stepen. Za vreme obilaska zatvorenog ciklusa, u svaki cvor se ulazi isto toliko puta koliko puta seiz njega izlazi. Posto se svaka grana prolazi tacno jednom, broj grana susednih proizvoljnom cvoru morabiti paran. Da bismo indukcijom dokazali da je uslov dovoljan, moramo najpre da izaberemo parametarpo kome ce biti izvedena indukcija. Taj izbor treba da omoguci smanjivanje problema, bez njegovepromene. Ako uklonimo cvor iz grafa, stepeni cvorova u dobijenom grafu nisu vise svi parni. Trebalo bida uklonimo takav skup grana S, da za svaki cvor v, broj grana iz S susednih sa v bude paran (makar i0). Proizvoljan ciklus zadovoljava ovaj uslov, pa se postavlja pitanje da li Ojlerov graf uvek sadrzi ciklus.Pretpostavimo da smo zapoceli obilazak grafa iz proizvoljnog cvora v proizvoljnim redosledom. Sigurnoje da ce se obilazak ranije ili kasnije zavrsiti u cvoru v, jer kad god udemo u neki cvor, smanjujemonjegov stepen za jedan, cinimo ga neparnim, pa ga uvek mozemo i napustiti. Naravno, ovakav obilazakne mora da sadrzi sve grane grafa.Sada mozemo da formulisemo induktivnu hipotezu.

    Induktivna hipoteza: Povezani graf sa < m grana ciji svi cvorovi imaju paran stepen, sadrzi Oj-lerov ciklus, koji se moze pronaci.

    Posmatrajmo graf G = (V,E) sa m grana. Neka je P neki ciklus u G, i neka je G graf dobijenuklanjanjem grana koje cine P iz grafa G. Stepeni svih cvorova u G su parni, jer je broj uklonjenihgrana susednih bilo kom cvoru paran. Ipak se induktivna hipoteza ne moze primeniti na graf G, jer onne mora biti povezan. Neka su G1, G

    2, ..., G

    k komponente povezanosti grafa G

    . U svakoj komponentistepeni svih cvorova su parni. Pored toga, broj grana u svakoj komponenti je manji od m (njihov ukupanbroj grana manji je od m). Prema tome, induktivna hipoteza moze se primeniti na sve komponente: usvakoj komponenti Gi postoji Ojlerov ciklus P

    i , i mi znamo da ga pronademo. Potrebno je sada sve ove

    cikluse objediniti u jedan Ojlerov ciklus za graf G. Polazimo iz bilo kog cvora ciklusa P (magistralnogputa) sve dok ne dodemo do nekog cvora vj koji pripada komponenti G

    j . Tada obilazimo komponentu

    Gj ciklusom Pj (lokalnim putem) i vracamo se u cvor vj . Nastavljajuci na taj nacin, obilazeci ciklusekomponenti u trenutku nailaska na njih, na kraju cemo se vratiti u polaznu tacku.U tom trenuku sve grane grafa G prodene su tacno jednom, sto znaci da je konstruisan Ojlerov ci-klus. Algoritam ipak nije sasvim kompletan: potreban nam je efikasan metod za izdvajanje komponentipovezanosti grafa, odnosno za obilazak grafa. Oba ova problema bie razmatrana u sledecem odeljku

    26 Pretraga u dubinu neusmerenog grafa.

    Preporucuje se ucenje kodova.

    Neusmereni grafovi: Opis pretrage grafa u dubinu (DFS) odgovara polasku kroz galeriju. Uvek se tru-dimo da proemo kroz neposeceni hodnik i kada se naemo na raskrsnici, ostavimo kamencic. Kadanaiemo na hodnik koji ne vodi nikud, ili na vec posecenu raskrsnicu, mi se vracamo nazad do prethodneraskrsnice i pokusavamo da uemo u novi hodnik. Ako nema neposecenog, idemo nazad itd. Osnovnirazlog upotrebljivosti DFS pretrage je jednostavna implementacija koriscenjem rekurzije.

    Za neusmereni graf predstavljen listom povezanosti algoritam pocinje od zadatog cvora v koji predstavljakoren pretrage u dubinu. On se oznacava kao posecen i onda se vrsi rekurzivni poziv za proizvoljan cvorw koji je sused cvora v. Iz rekurzivnog poziva nekog cvora se izlazi tek ako ne postoji susedan cvor zakoji se moze pozvati dalja pretraga u dubinu.

    35

  • Kako bi imao sto vecu upotrebljivost, DFS algoritam razlikuje ulaznu i izlaznu obradu pri poseti cvora.Ulazna obrada se vrsi u trenutku ulaska u novi rekurzivni poziv, dok se izlazna vrsi kada se rekurzivnipoziv zavrsava. Oni zavise od same primene DFS algoritma.

    Pseudo kod uopstenog algoritma DFS:

    DFS(G, v)

    begin

    oznaciti v;

    preWork na v;

    for sve grane (v, w) do

    if w nije oznacen then DFS(G, w);

    postWork na (v, w);

    end

    Sledecom lemom je obezbeena ispravnost DFS algoritma:

    Lema: Ako je graf G povezan, onda ce algoritmom pretrage u dubinu svi njegovi cvorovi biti oznaceni, asve njegove grane bice u toku izvrsavanja algoritma pregledane bar po jednom.4: Pretpostavimo suprotno, i oznacimo sa U skup neoznacenih cvorova zaostalih posle izvrsavanja algo-ritma. Posto je G povezan, bar jedan cvor iz U mora biti povezan granom sa nekim oznacenim cvorom.Meutim, ovako nesto je nemoguce, jer kad god se poseti cvor, moraju biti poseceni (pa dakle i oznaceni)svi njegovi neoznaceni susedi. Posto su svi cvorovi poseceni, a kad se cvor poseti, onda se pregledaju svegrane koje vode iz njega, zakljucujemo da su i sve grane grafa pregledane. 2

    Pseudo kod za pravljenje DFS stabla:

    T = prazan_graf();

    DFS_stablo(G, v)

    begin

    oznaciti v;

    for sve grane (v, w) do

    if w nije oznacen then

    dodati (v, w) u T;

    DFS(G, w);

    end

    Numeracija i DFS stablo imaju bitnu ulogu u mnogim algoritmima cak iako graf nije eksplicitno zadat.

    DFS Numeracija moze biti dolazna ili odlazna koje odgovaraju ulaznoj i izlaznoj obradi. Pretposta-vimo da cvorovi imaju polja num1 i num2 koji treba da oznacavaju njihovu dolaznu, odnosno odlaznunumeraciju. Za preorder (dolaznu) numeraciju, potrebno je u preWork delu DFS algoritma staviti kod{c1 = c1 + 1; v.Pre = c1}, dok je za postorder (odlaznu) numeraciju potrebno u postWork delu sta-viti kod {if w je poslednji u petlji then {c2 = c2 + 1; v.Post = c2}}, pri cemu su c1 i c2inicijalizovani na 0 pre prvog poziva.

    36

  • Slika 18: Primer pretrage u dubinu. Dva broja uz cvor jednaka su njegovim rednim brojevima pridolaznoj, odnosno odlaznoj DFS numeraciji.

    Algoritam za nalazenje komponenti grafa:

    Algoritam Komponente_povezanosti(G);

    Ulaz: G = (V, E) (neusmereni graf);

    Izlaz: v.Komp za svaki cvor v dobija vrednost jednaku rednom broju komponente povezanosti

    koja sadrzi v;

    begin

    Rb.komp := 1;

    while postoji neoznacen cvor v do

    DFS(G, v);

    {u preWork DFS algoritma treba staviti: v.Komp := Rb.komp;}

    Rb.komp := Rb.komp + 1;

    end

    27 Pretraga grafa u sirinu.

    Preporucuje se ucenje kodova.

    Pretraga u sirinu (BFS) obilazak je grafa na sistematican nacin, nivo po nivo. Ako polazimo od cvorav, onda se najpre posecuju svi susedi v (deca u stablu pretrage, nivo jedan). Zatim se dolazi do svihunuka (nivo dva), i tako dalje. Obilazak se realizuje listom FIFO.

    Prilikom obilaska cvorovi se mogu numerisati BFS brojevima, slicno kao pri DFS. Preciznije, cvor w imaBFS broj k ako je on k-ti cvor oznacen u toku BFS. BFS stablo grafa moze se formirati ukljucivanjemsamo grana ka novooznacenim cvorovima. Izlazna obrada ovde nema smisla.

    Pseudo kod algoritma BFS (i pravljenja stabla T)

    BFS(G, v);

    begin

    oznaci v;

    upisi v u red; {red = FIFO lista}

    while red je neprazan do

    skini prvi cvor w sa reda;

    preWork na w; {ulazna obrada zavisi od primene BFS}

    for sve grane (w, x) za koje x nije oznacen do

    oznaci x;

    dodaj (w, x) u stablo T;

    upisi x u red;

    end

    37

  • Lema: Ako grana (u,w) pripada BFS stablu i cvor u je otac cvora w, onda cvor u ima minimalni BFSbroj meu cvorovima iz kojih postoji grana ka w.4 : Ako bi u grafu postojala grana (v, w), pri cemu v ima manji BFS broj od u, onda bi u trenutkuobrade v na listu morao biti stavljen cvor w, pa bi grana (v, w) morala biti ukljucena u stablo, suprotnopretpostavci. 2

    Lema: Put od korena r BFS stabla do proizvoljnog cvora w kroz BFS stablo najkraci je put od r dow u grafu G.4 : Indukcijom po d dokazacemo da do svakog cvora w na rastojanju d od korena r (jedinstveni) putkroz stablo od r do v ima duzinu d. Za d = 1 tvrenje je tacno: grana (r, w) je obavezno deo stabla,pa izmeu r i w postoji put kroz stablo duzine 1. Pretpostavimo da je tvrenje tacno za cvorove kojisu na rastojanju manjem od d od korena, i neka je w neki cvor na rastojanju d od korena, tj. postojiniz cvorova w0 = r, w1, w2, ..., wd = w koji cine put duzine d od r do w. Prema induktivnoj hipoteziput od r do wd1 kroz stablo ima duzinu d 1. U trenutku obrade cvora wd1 , posto u G postoji grana(wd1, wd), ta grana se ukljucuje u BFS stablo, pa do cvora wd postoji put duzine d kroz stablo. 2

    Nivo cvora w je duzina puta u stablu od korena do w. Pretraga u sirinu obilazi graf nivo po nivo.

    Lema: Ako je (v, w) grana iz E koja ne pripada T , onda ona spaja dva cvora ciji se nivoi razlikujunajvise za jedan.4 : Neka je npr. cvor v prvi dostignut pretragom i neka je njegov nivo d. Tada je nivo cvora w veci ilijednak od d. Taj nivo jednak je rastojanju w od korena, pa je manji ili jednak od d+ 1, jer do w postojiput duzine d+ 1 (put od korena do v produzen granom (v, w)). 2

    28 Topolosko sortiranje aciklickog grafa

    Pretpostavimo da je zadat skup poslova na ciji redosled izvrsavanja su zadata neka ogranicenja. Nekiposlovi zavise od drugih, odnosno ne mogu se zapoceti pre nego sto se ti drugi poslovi zavrse. Svezavisnosti su poznate, a cilj je napraviti takav redosled izvrsavanja poslova koji zadovoljava sva zadataogranicenja; drugim recima, trazi se takav raspored, da se po njemu svaki posao zapocie tek kad buduzavrseni svi poslovi od kojih on zavisi. Potrebno je konstruisati efikasni algoritam za formiranje takvograsporeda. Problem se zove topolosko sortiranje. Zadatim poslovima i njihovim meduzavisnostima mozese na prirodan nacin pridruziti graf. Svakom poslu pridruzuje se cvor, a usmerena grana od posla xdo posla y postoji ako se posao y ne moze zapoceti pre zavrsetka posla x. Jasno je da graf mora bitiaciklicki, (bez usmerenih ciklusa), jer se u protivnom neki poslovi nikada ne bi mogli zapoceti.

    Problem: U zadatom usmerenom acikliqkom grafu G = (V;E) sa n cvorova numerisati cvorove od1 do n, tako da ako je proizvoljan cvor v numerisan sa k, onda svi cvorovi do kojih postoji usmereni putiz v imaju broj veci od k.

    Induktivna hipoteza: Umemo da numerisemo na zahtevani nacin cvorove svih usmerenih aciklickihgrafova sa manje od n cvorova. Bazni slucaj jednog cvora, odnosno posla, je trivijalan. Kao i obicno,posmatrajmo proizvojni graf sa n cvorova, uklonimo jedan cvor, primenimo induktivnu hipotezu ipokusajmo da prosirimo numeraciju na polazni graf. Imamo slobodu izbora n-tog cvora. Trebalo biga izabrati tako da ostatak posla bude sto jednostavniji. Potrebno je numerisati cvorove. Najlakse jenumerisati cvor koji ne zavisi od drugih poslova, odnosno cvor sa ulaznim stepenom nula; njemu se mozedodeliti broj 1. Uvek moze pronaci cvor sa ulaznim stepenom nula jer se sa oznacavanjem negde morazapoceti. Sledeca lema potvrduje ovu cinjenicu.

    Lema: Usmereni aciklicki graf uvek ima cvor sa ulaznim stepenom nula.

    4 :Ako bi svi cvorovi grafa imali pozitivne ulazne stepene, mogli bismo da krenemo iz nekog cvora una-zadprolazeci grane u suprotnom smeru. Medutim, broj cvorova u grafu je konacan, pa se u tom obilaskumora u nekom trenutku naici na neki cvor po drugi put, sto znaci da u grafu postoji ciklus. Ovo jemedutim suprotno pretpostavci da se radi o aciklickom grafu.Na slican nacin zakljucuje se da u grafu mora postojati i cvor sa izlaznim stepenom nula.

    38

  • Pretpostavimo da smo pronasli cvor sa ulaznim stepenom nula. Numerisimo ga sa 1, uklonimo svegrane koje vode iz njega, i numerisimo ostatak grafa (koji je takode aciklicki) brojevima od 2 do n(prema induktivnoj hipotezi oni se mogu numerisati od 1 do n-1, a zatim se svaki redni broj moze pove-zati za jedan). Vidi se da je posle izbora cvora sa ulaznim stepenom nula, ostatak posla jednostavan.

    Realizacija: Jedini problem pri realizaciji je kako pronaci cvor sa ulaznim stepenom nula i kako popra-viti ulazne stepene cvorova posle uklanjanja grane. Svakom cvoru moze se pridruziti promenljiva (polje)UlStepen, tako da je na pocetku v:UlStepen jednako ulaznom stepenu cvora v. Pocetne vrednosti pro-menljivih UlStepen mogu se dobiti prolaskom kroz skup svih grana proizvoljnim redosledom (korisecemDFS, na primer) i povecavanjem za jedan w:UlStepen svaki put kad se naide na granu (v;w). Cvorovi saulaznim stepenom nula stavljaju se u listu (ili stek, sto je jednako dobro). Prema lemi u grafu postojibar jedan cvor v sa ulaznim stepenom nula. Cvor v se kao prvi u listi lako pronalazi; on se uklanja izliste. Zatim se za svaku granu (v;w) koja izlazi iz v brojac w:UlStepen smanjuje za jedan. Ako brojacpri tome dobije vrednost nula, cvor w stavlja se u listu. Posle uklanjanja cvora v graf ostaje aciklicki, pau njemu prema lemi ponovo postoji cvor sa ulaznim stepenom nula. Algoritam zavrsava sa radom kadlista sa cvorovima stepena nula postane prazna, jer su u tom trenutku svi cvorovi numerisani.

    Algoritam Top sort(G);

    Ulaz: G = (V;E) (usmereni aciklicki graf).

    Izlaz: v:Rb za svaki qvor v dobija vrednost u skladu sa topoloskim sortiranjem G.

    begin

    Inicijalizovati v:UlStepen za sve cvorove; {npr. pomocu DFS}

    G rb := 0;

    for i := 1 to n do

    if v_i:UlStepen = 0 then stavi v_i u listu;

    while lista nije prazna

    skini cvor v iz liste;

    G rb := G rb + 1;

    v:Rb := G rb;

    for sve grane (v;w) do

    w:UlStepen := w:UlStepen - 1;

    if w:UlStepen = 0 then stavi w u listu;

    end

    Slozenost: Slozenost zracunavanja pocetnih vrednosti promenljivih UlStepen je O(V + E). Zanalazenje cvora sa ulaznim stepenom nula potrebno je konstantno vreme (pristup listi). Svaka grana(v;w) razmatra se tacno jednom, u trenutku kad se v uklanja iz liste. Prema tome, broj promena vrednostiUlStepen jednak je broju grana u grafu. Vremenska slozenost algoritma je dakle O(V +E), odnosnolinearna je funkcija od velicine ulaza.

    29 Nalazenje svih najkracih puteva iz zadatog cvora grafa aciklicki slucaj.

    Pokusacemo indukcijom po broju cvorova.Bazni slucaj je trivijalan. Neka je |V | = n. Mozemo da iskoristimo topolosko sortiranje grafa iz pret-hodnog pitanja. Ako je redni broj cvora v jednak k, onda se cvorovi sa rednim brojevima manjim od kne moraju razmatrati: ne postoji nacin da se do ih dode iz v. Pored toga, redosled dobijen topoloskimsortiranjem je pogodan za primenu indukcije. Posmatrajmo poslednji cvor, odnosno cvor z sa rednimbrojem n.

    Pretpostavimo (induktivna hipoteza) da znamo najkrace puteve od v do svih ostalih cvorova, sem do z.Oznacimo duzinu najkraceg puta od v do w sa w.SP . Da bismo odredili z.SP , dovoljno je da proverimosamo one cvorove w iz kojih postoji grana do z. Posto se najkraci putevi do ostalih cvorova vec znaju,z.SP jednako je minimumu zbira w.SP + duzina(w, z), po svim cvorovima w iz kojih vodi grana do z.

    Da li je time problem resen? Pitanje je da li dodavanje cvora z moze da skrati put do nekog dru-gog cvora. Medutim, posto je z poslednji cvor u topoloskom redosledu, ni jedan drugi cvor nije dostizan

    39

  • iz z, pa se duzine ostalih najkracih puteva ne menjaju. Dakle, uklanjanje z, nalazenje najkracih putevabez njega, i vracanje z nazad su osnovni delovi algoritma. Drugim recima, sledeca induktivna hipotezaresava problem.

    Induktivna hipoteza: Ako se zna topoloski redosled cvorova, umemo da izracunamo duzine naj-kracih puteva od v do prvih n 1 cvorova. Kad je dat aciklicki graf sa n cvorova (topoloski uredenih),uklanjamo n-ti cvor, indukcijom resavamo smanjeni problem, nalazimo najmanju medu vrednostimaw.SP + duzina(w, z), za sve cvorove w takve da (w, z) 2|E|.

    Algoritam Acikl najkr putevi(G, v, n)Ulaz: G = (V,E) (tezinski aciklicki graf), v (cvor) i n (broj cvorova).Izlaz: za svaki cvor w V , w.SP je duzina najkraceg puta od v do w.{Pretpostavljamo da je vec izvrseno topolosko sortiranje.}{Pre poziva ove procedure stavlja se z.SP := za sve cvorove z 6= v.}

    begin

    neka je z cvor sa rednim brojem n u topoloskom redosledu;

    if z != v then

    Acikl_najkr_putevi(G-z, v, n-1);

    {G-z dobija se uklanjanjem z sa svim susednim granama iz G}

    for sve cvorove w takve da je (w, z) iz E do

    if w.SP + duzina(w, z) < z:SP then

    z.SP := w.SP + duzina(w, z);

    else

    v.SP := 0;

    end

    Sada cemo pokusati da usavrsimo algoritam tako da se topolosko sortiranje obavlja istovremeno sanalazenjem najkracih puteva. Drugim recima, cilj je objediniti dva prolaza (za topolosko sortiranje inalazenje najkracih puteva) u jedan.

    Razmotrimo nacin na koji se algoritam rekurzivno izvrsava (posle nalazenja topoloskog redosleda). Pret-postavimo, zbog jednostavnosti, da je redni broj cvora v u topoloskom redosledu 1 (cvorovi sa rednimbrojem manjim od rednog broja v ionako nisu dostizni iz v).Prvi korak je poziv rekurzivne procedure. Procedura zatim poziva rekurzivno samu sebe, sve dok se nedode do cvora v. U tom trenutku se duzina najkraceg puta do v postavnja na 0, i rekurzija pocinje da serazmotava. Zatim se razmatra cvor u sa rednim brojem 2; duzina najkraceg puta do njega izjednacujese sa duzinom grane (v, u), ako ona postoji; u protivnom, ne postoji put od v do u.Sledeci korak je provera cvora x sa rednim brojem 3. U ovom slucaju u x ulaze najvise dve grane (od vili u), pa se uporeduju duzine odgovarajucih puteva.

    Umesto ovakvog izvrsavanja rekurzije unazad, pokusacemo da iste korake izvrsimo preko niza cvorovasa rastucim rednim brojevima. Indukcija se primenjuje prema rastucim rednim brojevima pocevsi odv. Ovaj redosled oslobada nas potrebe da redne brojeve unapred znamo, pa cemo biti u stanju daizvrsavamo istovremeno oba algoritma. Pretpostavimo da su duzine najkracih puteva do cvorova sarednim brojevima od 1 do m poznati, i razmotrimo cvor sa rednim brojem m+ 1, koji cemo oznacavatisa z. Da bismo pronasli najkraci put do z, moramo da proverimo sve grane koje vode u z. Topoloskiredosled garantuje da sve takve grane polaze iz cvorova sa manjim rednim brojevima.Prema induktivnoj hipotezi ti cvorovi su vec razmatrani, pa se duzine najkracih puteva do ih znaju. Zasvaku granu (w, z) znamo duzinu w.SP najkraceg puta do w, pa je duzina najkraceg puta do z prekow jednaka w.SP + duzina(w, z). Pored toga, kao i ranije, ne moramo da vodimo racuna o eventualnimpromenama najkracih puteva ka cvorovima sa manjim rednim brojevima, jer se do njih ne moze doci iz z.

    Algoritam Acikl najkr putevi2(G, v)Ulaz: G = (V;E) (tezinski aciklicki graf), v (cvor G).Izlaz: za svaki cvor w V , w.SP je duina najkraceg puta od v do w.{Nerekurzivna verzija prethodnog algoritma koja obavlja i topolosko sortiranje.}

    begin

    for sve cvorove w do

    40

  • w.SP := 1;

    Inicijalizuj v.UlStepen za sve cvorove; {ulazni stepeni qvorova; npr. DFS}

    for i := 1 to n do

    if v_i.UlStepen = 0 then stavi v_i u listu;

    v.SP := 0;

    while lista nije prazna

    skini cvor w iz liste;

    for sve grane (w, z) do

    if w.SP + duzina(w, z) < z.SP then

    z.SP := w.SP + duzina(w, z);

    z.UlStepen := z.UlStepen - 1;

    if z.UlStepen = 0 then

    stavi z u listu;

    end

    Slozenost: Svaka grana se po jednom razmatra u toku inicijalizacije ulaznih stepenova, i po jednom utrenutku kad se njen polazni cvor uklanja iz liste. Pristup listi zahteva konstantno vreme. Svaki cvor serazmatra tacno jednom. Prema tome, vremenska slozenost algoritma u najgorem slucaju je O(|V |+ |E|).

    30 Nalazenje svih najkracih puteva iz zadatog cvora grafa

    Kad graf nije aciklicki, ne postoji topoloski redosled, pa se razmatrani algoritmi ne mogu direktnoprimeniti. Jednostavnost razmotrenih algoritama posledica je sledece osobine topoloskog redosleda:

    Ako je z cvor sa rednim brojem k, onda (1) ne postoje putevi od z do cvorova sa rednim brojevimamanjim od k, i (2) ne postoje putevi od cvorova sa rednim brojevima vecim od k do z.

    Ova osobina omogucuje nam da nacemo najkraci put od v do z, ne vodeci racuna o cvorovima kojisu posle z u topoloskom redosledu. Moze li se nekako definisati redosled cvorova proizvoljnog grafa kojibi omogucio nesto slicno? Ideja je razmatrati cvorove grafa redom prema duzinama najkracih puteva donjih od v. Te duzine se na pocetku, naravno, ne znaju; one se izracunavaju u toku izvrsavanja algoritma.

    Najpre proveravamo sve grane koje izlaze iz v. Neka je (v, x) najkraca medu njima. Posto su popretpostavci sve duzine grana pozitivne, najkraci put od v do x je grana (v, x). Duzine svih drugihputeva do x su vece ili jednake od duzine ove grane. Prema tome, znamo najkraci put do x, i to mozeda posluzi kao baza indukcije. Pokusajmo da napravimo sledeci korak. Kako mozemo da pronademonajkraci put do nekog drugog cvora? Biramo cvor koji je drugi najblizi do v (x je prvi najblizi). Jediniputevi koje treba uzeti u obzir su druge grane iz v ili putevi koji se sastoje od dve grane: prva je (v, x),a druga je grana iz cvora x. Neka je sa duzina(u, w) oznacena duzina grane (u, w). Biramo najmanji odizraza duzina(v, y) (y 6= x) ili duzina(v, x) + duzina(x, z) (z 6= v). Jos jednom zakljucujemo da se drugiputevi ne moraju razmatrati, jer je ovo najkraci put za odlazak iz v (izuzev do x). Moze se formulisatisledeca induktivna hipoteza.

    Induktivna hipoteza: Za zadati graf i njegov cvor v, umemo da pronademo k cvorova najblizih cvoruv, kao i duzine najkracih puteva do njih. Zapazimo da je indukcija po broju cvorova do kojih su duzinenajkracih puteva vec izracunate, a ne po velicini grafa. Pored toga, pretpostavlja se da su to cvorovinajblizi cvoru v, i da umemo da ih pronademo. Mi umemo da pronademo prvi najblizi cvor, pa je baza(slucaj k = 1) resena. Kad k dobije vrednost |V | 1, resen je kompletan problem. Oznacimo sa Vk skupkoji se sastoji od v i k njemu najblizih cvorova.

    Problem je pronaci cvor w koji je najblizi cvoru v medu cvorovima van Vk, i pronadi najkraci putod v do w. Najkraci put od v do w moze da sadrzi samo cvorove iz Vk. On ne moze da sadrzi neki cvor yvan Vk, jer bi y bio blizi cvoru v od w. Prema tome, da bismo pronasli cvor w, dovoljno je da proverimograne koje spajaju cvorove iz Vk sa cvorovima koji nisu u Vk; sve druge grane se za sada mogu ignorisati.Neka je (u, z) grana takva da je u Vk i z / Vk. Takva grana odreduje put od v do z koji se sastoji odnajkraceg puta od v do u (prema induktivnoj hipotezi vec poznat) i grane (u, z). Dovoljno je uporeditisve takve puteve i izabrati najkraci medu njima.

    41

  • Algoritam odreden ovom induktivnom hipotezom izvrsava se na sledeci nacin. U svakoj iteraciji do-daje se novi cvor. To je cvor w za koji je najmanja duzina

    min{u.SP + duzina(u,w)|u Vk} (6.1)

    medu svim cvorovima w / Vk. Iz vec iznetih razloga, w je zaista (k + 1)-vi (sledeci) najblizi cvor cvoruv. Prema tome, njegovo dodavanje produzuje induktivnu hipotezu.

    Algoritam je sada kompletno specificiran, ali mu se efikasnost moze poboljsati. Osnovni korak algo-ritma je pronalazenje sledeceg najblizeg cvora. To se ostvaruje izracunavanjem najkraceg puta prema(6.1). Medutim, nije neophodno u svakom koraku proveravati sve vrednosti u.SP + duzina(u,w).

    Vecina tih vrednosti ne menja se pri dodavanju novog cvora: mogu se promeniti samo one vrednostikoje odgovaraju putevima kroz novododati cvor. Mi mozemo da pamtimo duzine poznatih najkracihputeva do svih cvorova van Vk, i da im popravljamo vrednosti samo pri prosirivanju Vk. Jedini nacinda se dobije novi najkraci put posle dodavanja w u Vk je da taj put prolazi kroz w. Prema tome,treba proveriti sve grane od w ka cvorovima van Vk. Za svaku takvu granu (w, z) uporedujemo duzinuw.SP + duzina(w, z) sa vrednoscu z.SP , i po potrebi popravljamo z.SP . Svaka iteracija obuhvatanalazenje cvora sa najmanjom vrednoscu SP, i popravku vrednosti SP za neke od preostalih cvorova.Ovaj algoritam poznat je kao Dijkstrin algoritam (Dijkstra ).

    Realizacija: Potrebno je da pronalazimo najmanju vrednost u skupu duzina puteva i da cesto po-pravljamo duzine puteva. Dobra struktura podataka za nalazenje minimalnih elemenata i za popravkeduzina elemenata je hip. Posto je potrebno da pronademo cvor sa najmaom duzinom puta do njega, svecvorove van skupa Vk cuvamo u hipu, sa kljucevima jednakim duzinama trenutno najkracih puteva od vdo ih. Na pocetku su sve duzine puteva sem jedne jednake 1, pa redosled elemenata u hipu nije bitan, semsto v mora biti na vrhu. Nalazenje cvora w je jednostavno: on se uzima sa vrha hipa. Mogu se proveritisve grane (w, u), i zatim bez teckoca popraviti duzine puteva. Medutim, kad se promeni duzina putado nekog cvora z, moze se promeniti polozaj z u hipu. Prema tome, potrebno je na odgovarajuci nacinpopravljati hip (problem je u tome sto hip kao struktura podataka ne omogucuje efikasno pronalazenjezadatog elementa). Lociranje cvora z u hipu moze se izvesti pomocu druge strukture podataka povezanesa hipom. Podaci o svim cvorovima mogu se smestiti u vektor sa pokazivacima na njihove pozicije u hipu.Nalazenje cvora u hipu je zbog toga ekvivalentno pristupanju elementu vektora. Posto su elementi hipacvorovi grafa, prostorna slozenost je O(|V |), sto je prihvatljivo. Duzine puteva mogu samo da opadaju.Ako neki elemenat hipa postane manji od oca, on se moze zamenjivanjem pomerati navise dok mu sene pronade odgovarajuci polozaj. To je isti postupak kao i pri obicnom postupku popravke hipa (priumetanju elementa u hip, na primer).

    Algoritam Najkr putevi(G, v)Ulaz: G = (V, E) (teinski usmereni graf), v (polazni cvor).Izlaz: za svaki cvor w, w.SP je duzina najkraceg puta od v do w.{Pretpostavka je da su sve duzina grana nenegativne.}

    begin

    for sve cvorove w do

    w.Oznaka := false; oznaceni cvorovi su u V_k

    w.SP := ;v.SP := 0;

    while postoji neoznacen cvor do

    neka je w neoznaceni cvor sa najmanjom vrednoscu w.SP;

    w.Oznaka := true; ukljucivanje w u V_k

    for sve grane (w, z) takve da je z neoznacen do

    if w.SP + duzina(w, z) < z.SP then

    z.SP := w.SP + duzina(w, z);

    end

    Slozenost: Popravka duzine puta zahteva O(logm) uporedivanja, gde je m velicina hipa. Ukupno ima|V | iteracija, i zbog toga |V | brisanja iz hipa. Popravke treba izvrsiti najvise |E| puta (jer svaka granamoze da prouzrokuje najvise jednu popravku), pa je potrebno izvrsiti najvise O(|E|log|V |) uporedivanjau hipu. Prema tome, vremenska slozenost algoritma je O((|E|+ |V |) log |V |). Zapaza se da je algoritam

    42

  • sporiji nego algoritam koji isti problem resava za aciklicke grafove: u drugom slucaju sledeci cvor seuzima iz (proizvoljno uredene) liste, i nikakve popravke nisu potrebne.

    31 Minimalno povezujuce stablo grafa.

    Razmotrimo sistem racunara koje treba povezati optickim kablovima. Potrebno je obezbediti da po-stoji veza izmedu svaka dva racunara. Poznati su troskovi postavljanja kabla izmedu svaka dva racunara.Cilj je projektovati mrezu optickih kablova tako da cena mreze bude minimalna.

    Problem: Za zadati neusmereni povezani tezinski graf G = (V, E) konstruisati povezuje stablo Tminimalne cene. U ovom kontekstu tezine grana tezinskog grafa G su ustvari njihove cene. Prirodno jekoristiti sledecu induktivnu hipotezu.

    Induktivna hipoteza (1): Umemo da konstruisemo MCST za povezani graf sa manje od m grana.Bazni slucaj je trivijalan. Ako je zadat problem MCST sa m grana, kako se on moze svesti na problemsa manje od m grana? Tvrdimo da grana najmanje tezine mora biti ukljucena u MCST. Ako ona nebi bila ukljucena, onda bi njeno dodavanje stablu MCST zatvorilo neki ciklus; uklanjanjem proizvoljnedruge grane iz tog ciklusa ponovo se dobija stablo, ali manje tezine xto je u suprotnosti sa pretpo-stavkom o minimalnosti MCST. Dakle, mi znamo jednu granu koja mora da pripada MCST. Mozemoda je uklonimo iz grafa i primenimo induktivnu hipotezu na ostatak grafa, koji sada ima manje od mgrana. Da li je ovo regularna primena indukcije? Problem je u tome sto posle uklanjanja grane, preostaliproblem vise nije ekvivalentan polaznom. Prvo, izbor jedne grane ogranicava mogunosti izbora drugihgrana. Drugo, posle uklanjanja grane graf ne mora da ostane povezan. Resenje nastalog problema je uprecizirau induktivne hipoteze. Mi znamo kako da izaberemo prvu granu, ali ne mozemo da je uklonimoi prosto zaboravimo na nju, jer ostali izbori zavise od nje. Dakle, umesto da granu uklonimo, treba daje oznacimo, i da tu cinjenicu, njen izbor, koristimo dalje u algoritmu. Algoritam se izvrsava tako stose jedna po jedna grana bira i dodaje u MCST. Prema tome, indukcija je ne prema velicini grafa, negoprema broju izabranih grana u zadatom (fiksiranom) grafu.

    Induktivna hipoteza (2): Za zadati povezan graf G = (V, E) umemo da pronademo podgraf Tsa k grana (k < |V | 1), tako da je stablo T podgraf MCST grafa G.Bazni slucaj za ovu hipotezu smo vec razmotrili - on se odnosi na izbor prve grane. Pretpostavimo dasmo pronasli stablo T koje zadovoljava induktivnu hipotezu i da je potrebno da T prosirimo narednomgranom. Kako da pronademo novu granu za koju cemo biti sigurni da pripada MCST? Primenicemoslican pristup kao i pri izboru prve grane. Za T se vec zna da je deo konacnog MCST. Zbog toga uMCST mora da postoji bar jedna grana koja povezuje neki cvor iz T sa nekim cvorom u ostatku grafa.Pokusacemo da pronademo takvu granu. Neka je Ek skup svih grana koje povezuju T sa cvorovima vanT. Tvrdimo da grana sa najmanjom cenom iz Ek pripada MCST. Oznacimo tu granu sa (u, v) (videtisliku 22; grane stabla T su podebljane). Posto je MCST povezujue stablo, ono sadrzi tacno jedan put odu do v (izmedu svaka dva cvora u stablu postoji tacno jedan put).