Professional Documents
Culture Documents
US - Uvod U Algoritme I Strukture Podataka
US - Uvod U Algoritme I Strukture Podataka
Dejan ivkovi
U VOD U ALGOR IT ME I
S T RUKT URE P ODATAK A
Prvo izdanje
Beograd, 2010.
Autor:
Prof. dr Dejan ivkovi
Recenzent:
Prof. dr Dragan Cvetkovi
Izdava:
UNIVERZITET SINGIDUNUM
Beograd, Danijelova 32
www.singidunum.ac.rs
Za izdavaa:
Prof. dr Milovan Stanii
Tehnika obrada:
Dejan ivkovi
Dizajn korica:
Dragan Cvetkovi
Godina izdanja:
2010.
Tira:
240 primeraka
tampa:
Mladost Grup
Loznica
ISBN: 978-86-7912-239-1
Predgovor
ii
Predgovor
D EJAN IVKOVI C
Beograd, Srbija
januar 2010.
Sadraj
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
2
4
8
10
15
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
17
18
21
28
40
43
43
54
66
Uvod
1.1 Podaci . . . . . . .
1.2 Algoritmi . . . . .
1.3 Ra unarski model
c
1.4 Zapis algoritama .
Zadaci . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
71
. 71
. 73
. 88
. 96
. 98
. 101
Rekurzivni algoritmi
5.1 Iterativni i rekurzivni algoritmi
5.2 Analiza rekurzivnih algoritama .
5.3 Rekurentne jedna ine . . . . . . .
c
Zadaci . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
107
108
116
128
140
iv
6
Sadraj
Stabla
6.1 Korenska stabla . . . . .
6.2 Binarna stabla . . . . . .
6.3 Binarna stabla pretrage
6.4 Binarni hipovi . . . . . .
6.5 Primene stabala . . . . .
Zadaci . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
145
145
151
155
165
174
181
Grafovi
7.1 Osnovni pojmovi i denicije
7.2 Predstavljanje grafova . . .
7.3 Obilazak grafa . . . . . . . .
7.4 Obilazak usmerenog grafa .
Zadaci . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
185
186
191
194
209
218
Teinski grafovi
8.1 Osnovni pojmovi . . . . . . . . . . . .
8.2 Minimalno povezuju e stablo . . . .
c
Zadaci . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
223
224
225
236
243
247
.
.
.
.
.
.
Literatura
251
Indeks
253
G LAVA
1
Uvod
posmatra se iz vrlo opteg ugla, uglavnom bez neke konkretne interpretacije podataka na umu. U najoptijem smislu, termin struktura podataka
koristi se za na in organizacije odredenih podataka u programu, a termin
c
Uvod
1.1 Podaci
Manipulisanje podacima je glavna svrha rada softverskih sistema i zato
je neophodno na samom po etku razjasniti sam pojam podataka. U stvari,
c
u ovom kontekstu se cesto koriste termini tip podataka (ili samo kratko
tip), apstraktni tip podataka i struktura podataka, koji sli no zvu e i
c
c
zato je korisno ukazati na njihove speci nosti.
c
Pod tipom podataka se podrazumeva skup nekih vrednosti zajedno sa
skupom operacija koje su dozvoljene nad tim vrednostima. Tako logi ki tip
c
true i false, a dozvoljene operacije
podataka sadri samo dve vrednosti
nad njima su uobi ajene logi ke operacije negacije, konjunkcije, disjunkcije
c
c
i tako dalje. Sli no, tip podataka pod imenom string sadri vrednosti koje
c
predstavljaju niske znakova, a dozvoljene operacije nad njima su spajanje
dve niske, odredivanje duina jedne niske, poredenje dve niske i tako dalje.
jezika.
Apstraktni tipovi podataka su generalizacije primitivnih tipova podataka i rezultat su primene vanog nau nog principa apstrakcije u ra uc
c
narstvu. Naime, iskustvo je pokazalo da se uspena i ekasna realizacija
svakog softverskog sistema kojim se reava sloeni problem ne moe sprovesti bez podele takvog problema na manje celine koje se mogu nezavisno
reavati. Ali ni ova dekompozicija sloenog problema nije dovoljna, ve
c
se za reavanje manjih problema moraju zanemariti mnogobrojni nevani
detalji koji ne uti u na celokupno reenje. Ovim pristupom apstrakcije
c
problema se znatno smanjuje sloenost razvoja i odravanja velikih softverskih sistema.
Apstrakcija problema obi no ima dva aspekta: proceduralnu apstrakc
ciju i apstrakciju podataka. Proceduralnom apstrakcijom se obezbeduje
1.1. Podaci
Uvod
u steku se mogu dobiti i skinuti samo sa vrha steka. Ako komade mesa
apstrahujemo kao podatke i icu ranji a kao stek, primetimo da postupak
c
rada sa podacima u steku ta no odgovara na inu na koji se postupa sa
c
c
komadima mesa na ici ranji a: dodaju se na vrh ice i odatle se skidaju.
c
Naravno, stek kao logi ki model podataka nije karakteristi an samo za
c
c
banalan primer ranji a, pa vanost steka proizilazi iz toga to se moe
c
prepoznati u mnogim drugim primenama.
S druge strane, stek kao struktura podataka posmatra se sa stanovita
programske realizacije njegove apstraktne organizacije podataka. Pitanja
na koja treba odgovoriti u tom slu aju su, recimo, da li je stek bolje realizoc
vati pomo u niza ili povezane liste, kolika je ekasnost operacija dodavanja
c
i uklanjanja podataka iz steka u pojedinim slu ajevima i tako dalje.
c
Apstraktni tip podataka denie interfejs izmedu programera i poda
taka i zaokruuje neki model podataka u smislu da je implementacija tog
modela lokalizovana u jednom delu programa. To je od velike prakti ne
c
vanosti, jer ako elimo da promenimo realizaciju odgovaraju e strukture
c
podataka, najpre znamo gde to treba u initi. Takode znamo da ako promec
nimo jedan mali deo programa, time ne emo izazvati teko uo ljive greke
c
c
u nekom drugom delu koji nema veze sa odgovaraju im tipom podataka.
c
Na kraju, sa podacima apstraktnog tipa moemo raditi kao da su primitivnog tipa i ne obra ati panju na njihovu konkretnu realizaciju.
c
Apstraktni tipovi podataka imaju dva poeljna svojstva, generalizaciju
i enkapsulaciju, koje nam omogu avaju da ispunimo vaan cilj softverskog
c
inenjerstva viekratnu upotrebljivost. Naime, poto implementiramo
apstraktni tip podataka, moemo ga koristiti u razli itim programima.
c
Moemo dakle zaklju iti da podaci u ra unarstvu imaju dva pojavna
c
c
oblika: logi ki i zi ki. Njihov logi ki oblik se odreduje denicijom apc
c
c
1.2 Algoritmi
Spomenuli smo da su algoritmi u tesnoj vezi sa strukturama podataka
i da se koriste za programsku realizaciju dozvoljenih operacija nekog apstraktnog tipa podataka. To je ipak samo jedna speci na primena alc
goritama, a da bismo ih posmatrali optije, moramo po i od ra unarskih
c
c
problema koje algoritmi reavaju.
1.2. Algoritmi
Tip podataka
ATP:
skup podataka
skup operacija
Struktura podataka:
logi ka forma
c
memorijska reprezentacija
algoritamska reprezentacija
zi ka forma
c
c
c
S LIKA 1.1: Logi ka i zi ka forma podataka.
do najve eg. Jo jedan primer je problem vra anja kusura: ulaz je neki
c
c
nov ani iznos i apoeni metalnih nov i a, a izlaz je najmanji broj tih nov i a
c
cc
cc
kojima se dati iznos moe potpuno usitniti.
Kod mnogih problema nije dovoljno na ovaj neformalan na in denisati
c
njihov ulazno-izlazni odnos koji se trai. Na primer, kod problema sortiranja kako smo ga naveli, nije jasno da li neki brojevi u ulaznom nizu mogu
biti jednaki i kako onda jednaki brojevi treba da budu poredani u izlaznom
Uvod
cije i tako dalje, pri cemu ulazni deo predstavlja generi ku instancu proc
blema i izlazni deo predstavlja generi ko reenje ove generi ke instance
c
c
problema. Na primer, problem vra anja kusura moemo formalno denic
sati u obliku u kojem se trai da bude zadovoljen ovaj ulazno-izlazni odnos:
Ulaz: Pozitivan ceo broj k (broj metalnih nov i a), niz od k pozitivnih
cc
c
cc
celih brojeva [c 1, . . ., c k ] (pojednina ni apoeni nov i a) i pozitivan
ceo broj a (nov ani iznos).
c
c
Izlaz: Niz od k nenegativnih celih brojeva [b 1 , . . ., b k ] (pojednina ni brojevi nov i a sitnine) tako da su zadovoljena dva uslova:
cc
1. a =
2.
k
i =1 b i c i
k
i =1 b i
ove instance problema vra anja kusura je niz [2, 1, 1, 0] od cetiri elementa,
c
jer je 17 = 2 1 + 1 5 + 1 10 + 0 25 i zbir 2 + 1 + 1 + 0 = 4 odreduje najmanji
1.2. Algoritmi
Algoritam
ulaz
algoritamski
koraci
izlaz
S LIKA 1.2: Pojednostavljena slika algoritma.
Drugo, algoritam reava neki problem ukoliko se na ulazu algoritma
pretpostavlja ulaz tog problema i na izlazu algoritma se dobija reenje tog
problema za svaku instancu problema. Na primer, algoritam koji reava
problem sortiranja na ulazu dobija neureden niz brojeva i kao rezultat na
Uvod
ra unarske instrukcije (ili koraci) koje cine algoritam. Iako je to, nadamo
c
kojim radimo. To je dovoljno za nau svrhu, jer ce nas interesovati asimptotske performanse algoritama, odnosno njihova ekasnost za veliki broj
1.3. Racunarski model
10
Uvod
11
U stvari, u ovoj knjizi se cesto obi nim jezikom najpre opisuje glavna ideja
c
algoritma, a zatim se prelazi na pseudo jezik da bi se pojasnili neki klju ni
c
detalji algoritma.
Pseudo jezik koji koristimo u ovoj knjizi za zapis algoritama sadri
elemente programskih jezika C, Pascal i Java, tako da citalac koji je programirao na ovim jezicima ne e imati nikakvih problema da razume napisane
c
algoritme. U tom pseudo jeziku se koriste uobi ajeni koncepti programskih
c
jezika kao to su promenljive, izrazi, uslovi, naredbe i procedure. Ovde ne
cemo pokuavati da damo precizne denicije sintakse i semantike pseudo
jezika koji se koristi u knjizi, poto to nije potrebno za nau svrhu i svakako
prevazilazi namenu ove knjige. Umesto toga, u nastavku navodimo samo
kratak spisak konvencija u kori enom pseudo jeziku:
c
12
Uvod
c
c
(a[i] == 0) cak i u slu aju kada indeks i premauje veli inu n niza a.
10. Blokovska struktura sloenih naredbi nazna ava se jedino uvla enjem.
c
c
Ovaj na in isticanja logi ke strukture kratkih algoritama umesto uoc
c
bi ajenih simbola za ograni avanje bloka naredbi (na primer, { i } ili
c
c
13
11. Neformalne naredbe sa elementima obi nog jezika koriste se svuda gde
c
takve naredbe cine algoritam razumljivijim od ekvivalentnog niza programskih naredbi. Na primer, naredba
for (svaki vor v grafa G ) do
c
14
Uvod
Algoritam swap slui prvenstveno za ilustraciju zapisa na pseudo jeziku, jer je njegov postupak za reenje problema zamene vrednosti dve
promenljive o igledan.
c
ment postaje najve i od onih ispitanih do sada; u suprotnom slu aju, nije
c
c
potrebno nita dodatno uraditi.
// Ulaz: niz a, broj elemenata n niza a
// Izlaz: indeks najveeg elementa niza a
c
algorithm max(a, n)
m = a[1];
j = 1;
i = 2;
// proveriti ostale elemente niza
while (i <= n) do
if (m < a[i]) then // naen vei element od privremeno najveeg
d
c
c
m = a[i];
// zapamtiti vei element
c
j = i;
// ... i njegov indeks
i = i + 1; // prei na sledei element niza
c
c
return j;
15
Zadaci
1. Problem pretrage niza je:
Ulaz: Broj n, niz a od n neuredenih brojeva a 1 , a 2, . . ., a n , broj x.
G LAVA
2
Dizajn i analiza algoritama
Prilikom pisanja algoritama se mora obratiti posebna panja na njihova dva aspekta: ispravnost i ekasnost. Kod dizajna algoritama se
obra a posebna panja na prvo pitanje ispravnosti (korektnosti) algoric
tama. To je naro ito vano za sloene algoritme kod kojih njihova ispravc
nost nije o igledna, ve zahteva paljiv matemati ki dokaz. Cilj analize
c
c
c
algoritama su kvantitativne ocene ekasnosti algoritama. To je takode
18
2.1
Dizajn algoritama
19
mora da zadovolji jeste da ispravno reava dati problem. Na putu dokazivanja ispravnosti algoritma postoje mnoge prepreke, kako prakti ne tako i
c
Onaj ko pie algoritam bi bar trebao da ima u vidu te odlike, iako je moda
neprakti no da se one dokazuju u svim detaljima. Te odlike treba da slue
c
i kao odreden vodi u kreativnom procesu pisanja nekog algoritma.
c
min{ x, y}.
Ovo zapaanje moemo iskoristiti za postupak kojim se trai nzd(x, y)
tako to se redom proveravaju svi potencijalni kandidati za najve i zac
jedni ki delilac brojeva x i y. Ovi kandidati su uzastopni celi brojevi od
c
broja jedan do minimuma brojeva x i y. Pri tome se ti brojevi proveravaju
obrnutim redom da li je neki od njih zajedni ki delilac za x i y, sve dok se ne
c
otkrije prvi zajedni ki delilac. Poto se provera obavlja obrnutim redom od
c
1 U ovoj knjizi sa N ozna avamo skup {0,1,2,... } nenegativnih celih brojeva.
c
20
i najve i.
c
// Ulaz: pozitivni celi brojevi x i y
// Izlaz: nzd(x, y)
algorithm gcd(x, y)
d = min{x,y};
while ((x % d != 0) || (y % d != 0)) do
d = d - 1;
return d;
uslove. Neophodan uslov za svaku petlju je da njen izlazni uslov bude zadovoljen u jednom trenutku kako bi se izvravanje petlje sigurno zavrilo.
iteracije), odnosno ona ce biti ta na nakon zavretka rada cele petlje. Prec
poznati pravu invarijantu petlje je vana vetina, jer znaju i invarijantu
c
petlje i izlazni uslov petlje obi no moemo zaklju iti neto korisno o ispravc
c
nosti samog algoritma.
Da bismo pokazali da se invarijanta petlje ne menja izvravanjem pe
tlje, moramo pokazati dve cinjenice o invarijanti petlje:
1. Invarijanta petlje je ta na pre prve iteracije petlje.
c
2. Ako je invarijanta petlje ta na pre neke iteracije petlje, ona ostaje
c
ta na i nakon izvravanja te iteracije petlje (to jest, pre izvravanja
c
slede e iteracije).
c
Prema tome, u konkretnom slu aju algoritma gcd pokaimo najpre da
c
c
se while petlja sigurno zavrava, odnosno da nije beskona na. Primetimo
da se izlaznim uslovom te petlje proverava da li d nije delilac broja x ili
broja y bez ostatka. Ako je to slu aj, telo petlje se ponavlja; u suprotnom
c
21
slu aju, petlja se zavrava. Da bismo videli zato ce izlazni uslov napoc
sletku postati neta an, primetimo da je po etno d = min{ x, y}, a da se d
c
c
najgorem slu aju postati jednako 1, izlazni uslov ce onda biti neta an poto
c
c
da je ovaj uslov zadovoljen pre prve iteracije te petlje, jer d po etno dobija
c
vrednost min{ x, y} i uvek je min{ x, y} nzd(x, y). Dalje, treba pokazati da
ako ovaj uslov vai pre neke iteracije, on ce vaiti i posle izvravanja te
iteracije. Zato pretpostavimo da je vrednost promenljive d ve a ili jednaka
c
vrednosti nzd(x, y) pre neke iteracije, i pretpostavimo da je ta iteracija
while petlje izvrena. To zna i da je izlazni uslov petlje bio ta an i da se
c
c
vrednost promenljive d smanjila za 1. Poto je izlazni uslov bio ta an, stara
c
vrednost promeljive d nije bila delilac oba broja x i y, pa zato stara vrednost
promeljive d nije jednaka nzd(x, y) nego je striktno ve a od nzd(x, y). Poto
c
je nova vrednost promenljive d za jedan manja od njene stare vrednosti,
moemo zaklju iti da je nova vrednost promenljive d opet ve a ili jednaka
c
c
vrednosti nzd(x, y) pre slede e iteracije. Ovim je dokazano da d nzd(x, y)
c
predstavlja invarijantni uslov while petlje u algoritmu gcd.
Na kraju, ispitajmo koji uslov vai kada se while petlja zavri. Iz
uslova prekida te petlje vidimo da se ona zavrava kada je vrednost promenljive d delilac oba broja x i y. Poto je nzd(x, y) najve i delilac oba broja
c
x i y, sledi da nakon zavretka while petlje vai d nzd(x, y). Ali poto
nakon zavretka while petlje vai i invarijanta petlje d nzd(x, y), sledi
c
da mora biti d = nzd(x, y). Poto se ova vrednost promeljive d vra a kao
c
rezultat algoritma gcd, to pokazuje da ovaj algoritam ispravno izra unava
nzd(x, y).
2.2
Analiza algoritama
koje taj algoritam koristi tokom izvravanja. Ovaj zadatak ocene ekasnosti nekog algoritma se naziva analiza algoritma. To ne treba shvatiti
kao nezavisan i odvojen proces od dizajna algoritma, ve se oni medusobno
c
proimaju i podjednako doprinose krajnjem cilju dobijanja ispravnih, ekasnih i elegantnih algoritama.
22
razli ite ulazne podatke, niti o tome kakvo ce vreme izvravanja biti na
c
nekom drugom ra unaru koji radi pod druga ijim okruenjem.
c
c
Osnovna ideja analiti kog pristupa je jednostavna: analizirati kako
c
radi algoritam korak po korak i na osnovu toga zaklju iti koliko ce biti
c
vreme njegovog izvravanja. Ovo je lako re i, ali postoje mnoge prepreke
c
na putu teorijske analize algoritama. O tome vie govorimo odmah u na
stavku, a za sada samo skre emo panju na cinjenicu koju treba stalno
c
imati na umu: sloenost analize se savladuje pojednostavljivanjem glavnih
ciljeva. Zbog toga se, naravno, ne dobija apsolutno precizna ocena vremena
izvravanja, ali je ona dovoljno dobra da steknemo optu sliku o ekasnosti
algoritama.
Vreme izvravanja nekog algoritma skoro uvek zavisi od broja ulac
znih podataka koje treba obraditi. Tako, prirodno je o ekivati da sortiranje 10 000 brojeva zahteva vie vremena nego sortiranje samo 10 brojeva.
23
cine ulaza. Na primer, za problem sortiranja niza brojeva, veli ina ulaza je
c
broj clanova niza koje treba sortirati; za mnoenje dva velika cela broja x i
y, veli ina ulaza je broj cifara broja x plus broj cifara broja y; za grafovske
c
probleme, veli ina ulaza je broj cvorova ili broj grana grafa. Sre om, forma
c
c
veli ine ulaza za konkretan problem je obi no o igledna iz same prirode
c
c
c
problema.
Kako bi se veli ina ulaza obuhvatila analizom algoritma, najpre se
c
ulazni podaci algoritma grupiu prema njihovom broju koji se predstavlja
pozitivnim celim brojem n. Zatim se vreme izvravanja algoritma za ulaz
veli ine n izraava pomo u neke funkcije T(n). Drugim re ima, za svaki
c
c
c
pozitivan ceo broj n, vrednost T(n) daje broj vremenskih jedinica koliko
traje izvravanje algoritma za svaki njegov ulaz veli ine n. Na slici 2.1 je
c
ilustrovan ovaj pristup.
ulaz
T(n)
izlaz
pored njegove veli ine n, zavisi i od drugih faktora kao to su brzina proc
cesora ra unara ili struktura samih ulaznih podataka. Zato da bismo poc
jednostavili analizu i da bi denicija funkcije T(n) imala smisla, pretpostavljamo da se sve osnovne instrukcije algoritma izvravaju za jednu vremensku jedinicu i uzimamo najgori slu aj ulaznih podataka. Onda da bismo
c
dobili funkciju vremena izvravanja T(n) nekog algoritma treba da prosto
24
slu aju. Preciznije, funkciju T(n) za vreme izvravanja u najgorem slu aju
c
c
nekog algoritma deniemo da bude maksimalno vreme izvravanja tog
algoritma za sve ulaze veli ine n. Ova funkcija se naziva i vremenska
c
sloenost u najgorem slu aju. Potuju i tradiciju da se najgori slu aj podc
c
c
razumeva, ako nije druga ije naglaeno skoro uvek cemo koristiti kra e
c
c
termine vreme izvravanja i vremenska sloenost algoritma.
aritmeti ke operacije;
c
logi ke operacije;
c
ulazno/izlazne operacije.
Jedno upozorenje: ove instrukcije se ponekad ne mogu smatrati jedini nim instrukcijama u algoritmu. Na primer, neka aritmeti ka operac
c
cija koja izgleda naivno kao to je to na primer sabiranje, nije jedini na
c
instrukcija ukoliko je veli ina operanada aritmeti ke operacije velika. U
c
c
c
c
tom slu aju, vreme potrebno za njeno izvravanje se pove ava sa veli inom
c
njenih operanada, pa se ne moe ograni iti nekom konstantom nezavisnom
c
od veli ine podataka. Imaju i ovo na umu, ipak cemo prethodne instrukcije
c
c
smatrati jedini nim sem ako to nije realisti no za dati problem.
c
c
Prethodnu diskusiju o analizi algoritama moemo preto iti u prakti ni
c
c
postupak za odredivanje vremenske sloenosti algoritama ukoliko prime
timo da je najgori slu aj izvravanja algoritma onaj u kojem se izvrava
c
najve i broj jedini nih instrukcija. Kao jednostavan primer, razmotrimo
c
c
25
A1:
1
2
3
4
5
n = 5;
repeat
read(m);
n = n - 1;
until ((m == 0) || (n == 0));
A2:
1
2
3
4
5
read(n);
repeat
read(m);
n = n - 1;
until ((m == 0) || (n == 0));
skup ulaznih podataka date veli ine. Drugo, najgori slu aj je mnogo laki
c
c
za analizu ( esto i jedino mogu i) nego drugi kriterijumi ekasnosti algoric
c
tama.
Prebrojavanje broja jedini nih instrukcija u najgorem slu aju izvrac
c
vanja algoritma kako bi se dobilo vreme izvravanja tog algoritma moe
se umnogome pojednostaviti ako znamo vremenske relacije tipi nih algoc
ritamskih konstrukcija. Naime, vreme izvravanja sloenijih konstrukcija moemo izvesti na osnovu vremena izvravanja njihovih sastavnih
delova. U tabeli 2.1 su sumirana vremena izvravanja osnovnih algori
c
tamskih konstrukcija, pri cemu je sa T B ozna eno vreme izvravanja (u
najgorem slu aju) bloka naredbi B. Tom tabelom nije obuhva ena rekurc
c
26
Konstrukcija
Naredba serije S:
P; Q;
Naredba grananja S:
if C then P; else Q;
Vreme izvravanja
T S = T P + TQ
T S = T C + max{T P , TQ }
Naredba petlje S:
(1) while C do P;
(2) repeat P; until C;
TS = n TP
n najve i broj iteracija petlje
c
(3) for i = j to k do P;
T ABELA 2.1: Vremenska sloenost osnovnih algoritamskih konstrukcija.
naredbi u telu najunutranjije petlje pomnoeno sa proizvodom broja iteracija svih petlji. Na primer, posmatrajmo ovaj algoritamski fragment:
1
2
3
4
for i = 1 to n do
for j = 1 to n do
if (i < j) then
swap(a[i,j], a[j,i]);
// jedinina instrukcija
c
27
algoritma u praksi, ali je cesto to mnogo tee odrediti nego vreme izvravanja u najgorem slu aju. Razlog za to je da moramo znati raspodelu
c
verovatno e slu ajnih ulaznih podataka, to je teko zamislivo u praksi.
c
c
Ali da bismo ipak mogli lake izvesti matemati ka izra unavanja, obi no
c
c
c
pretpostavljamo da su svi ulazi veli ine n jednako verovatni, to u nekom
c
konkretnom slu aju moda i nije pravo stanje stvari.
c
Probabilisti ku analizu deterministi kih algoritama treba razlikovati
c
c
od analize takozvanih randomiziranih algoritama. Randomizirani algoritmi su po svojoj prirodi slu ajni jer se u toku njihovog izvravanja doc
nose slu ajne odluke. Njihovo vreme izvravanja zavisi od slu ajnih ishoda
c
c
tih odluka i zato predstavlja slu ajnu vrednost. Za randomizirane algoc
zentativnim za sve ulazne podatke, odnosno podrazumeva se da ce algoritam koji ima dobre performanse za ben mark podatke imati isto tako
c
dobre performanse za sve ulazne podatke. Kako je na cilj analiti ka ocena
c
c
ekasnosti algoritama, a ben mark analiza je u sutini empirijski metod,
o tome vie ne emo govoriti u ovoj knjizi.
c
Na osnovu nadenog vremena izvravanja nekog algoritma moemo po
kuati da odgovorimo i na tri dodatna pitanja:
1. Kako moemo re i da li je neki algoritam dobar?
c
2. Kako znamo da li je neki algoritam optimalan?
3. Zato nam je uopte potreban ekasan algoritam zar ne moemo
prosto kupiti bri ra unar?
c
Da bismo odgovorili na prvo pitanje, lako moemo uporediti vreme izvravanja posmatranog algoritma sa vremenima izvravanja postoje ih algoc
ritama koji reavaju isti problem. Ako to poredenje ide u prilog posmatra
nom algoritmu, moemo kvantitativno zaklju iti da je on dobar algoritam
c
za neki problem.
28
m = a[1];
j = 1;
29
i = 2;
// proveriti ostale elemente niza
while (i <= n) do
if (m > a[i]) then // naen manji element od privremeno najmanjeg
d
m = a[i];
// zapamtiti manji element
j = i;
// ... i njegov indeks
i = i + 1; // prei na sledei element niza
c
c
return j;
Analizu jednostavnog algoritma min nije teko izvriti. Poto broj iteracija tela while petlje iznosi n 1, a telo te pelje se sastoji od if naredbe
i naredbe dodele, vreme izvravanja algoritma min je:
T(n) = 1 + 1 + 1 + (n 1)(3 + 1) + 1
= 4 + 4(n 1)
= 4n .
U ovom izrazu za funkciju T(n) u prvom redu, prve tri jedinice u zbiru su
vremena izvravanja prve tri naredbe dodele u algoritmu min, faktor (3 + 1)
predstavlja vreme jednog izvravanja tela while petlje (provera uslova i
dve naredbe dodele u if naredbi, kao i naredba dodela na kraju tela petlje),
a poslednjom jedinicom je obuhva eno vreme izvravanja return naredbe.
c
U izrazu 4n za funkciju T(n) vremena izvravanja algoritma min se
veli ina ulaza n (tj. broj elemenata ulaznog niza) pojavljuje na prvi stepen.
c
Zato za taj algoritam kaemo da je linearni algoritam. Primetimo jo da
je vreme izvravanja algoritma max iz odeljka 1.4 takode T(n) = 4n, jer su
c
algoritmi min i max prakti no isti.
30
S i, j = a i + a i+1 + + a j =
ak .
k= i
primer, citaoci mogu proveriti da reenje problema maksimalne sume podniza za prethodni niz
a = [2, 1, 1, 3, 4, 6, 7, 2, 3, 5] ,
iznosi 8, to je zbir elemenata podniza [7, 2, 3].
Elementi datog niza mogu biti pozitivni, negativni i nule. Ako dati niz
sadri samo pozitivne brojeve, reenje problema maksimalne sume podniza
takvog niza je o igledno zbir svih elemenata niza. Ako niz sadri samo
c
negativne brojeve, neprekidni podniz koji ima najve u sumu je prazan
c
podniz i reenje u ovom slu aju je zato uvek nula. Interesantan slu aj
c
c
je dakle kada imamo zajedno pozitivne i negativne brojeve u datom nizu.
Za dati niz a od n brojeva, neka je M suma njegovog neprekidnog
podniza koji ima najve u sumu. Formalno,
c
M = max 0, max S i, j .
1 i j n
31
Nula na desnoj strani ove jednakosti je potrebna zato to bez ove nule
jednakost ne bi bila ta na kada se dati niz sastoji samo od negativnih elec
menata. Ali radi jednostavnijeg pisanja, u daljem tekstu pretpostavljamo
da implicitno uvek uzimamo 0 kao maksimalnu sumu u tom specijalnom
slu aju. Tako, prethodnu jednakost piemo saetije:
c
M = max S i, j .
1 i j n
32
for j = i to n do
s = s + a[j];
if (m < s) then
m = s;
return m;
// S i, j = S i, j 1 + a j
// naena vea suma
d
c
// aurirati maksimalnu sumu
// vratiti b i
c
m < s, odnosno da li je pronaden podniz od pozicije i cija je suma ve a od
petlja cije se telo ponavlja n i + 1 puta, jer se broja j ove petlje menja od
c
i do n. Prema tome, vreme izvravanja algoritma B je:
T(n, i) = 1 + 1 + (n i + 1)(1 + 2) + 1
= 3 + 3(n i + 1)
= 3(n i + 2) .
Sada je lako napisati algoritam kojim se nalazi maksimalna suma podniza datog niza: algoritmom B treba najpre redom izra unati sve elemente
c
33
n
i =1
n
=3
3(n i + 2) + 1 + (4n + 1) + 1
i =1
(n i) + 7n + 4n + 2
(n 1)n
+ 11n + 2
2
= 1.5n2 + 9.5n + 2 .
=3
Podsetimo se da funkcija T(n) predstavlja vreme izvravanja (u najgorem slu aju) nekog algoritma za sve ulazne podatke tog algoritma veli ine
c
c
n. Poto se promenljiva n u prethodnom izrazu za funkciju T(n) vremena
izvravanja algoritma mcss pojavljuje na drugi stepen, za taj algoritam
kaemo da je kvadratni algoritam.
Primetimo da je mogu e poboljati ovaj algoritam ukoliko eljeni makc
c
simum M elemenata b i izra unavamo u hodu. Naime, umesto da maksic
mum elemenata b i traimo nakon to sve te elemente izra unamo, moemo
da odredujemo njihov privremeni maksimum kako ih redom izra unavamo.
c
34
c
Preciznije, za dati niz a od n elemenata a 1 , a 2, . . ., a n treba na i permutaciju svih indeksa elemenata niza i 1 , i 2 , . . ., i n tako da novi prvi element a i 1 ,
novi drugi element a i 2 i tako dalje, novi n-ti element a i n u nizu zadovoljavaju uslov a i 1 a i 2 a i n .
35
i=2
i=3
i=4
i=5
17
23
17
23
17
11
23
17
11
11
11
23
17
17
11
11
23
23
36
(n 1)n
2 + 1 = n2 n + 1 .
2
pa je to najdue vreme koje ce taj algoritam raditi za datu veli inu ulaznih
c
podataka. Primetimo da najgori slu aj algoritma bubble-sort (kada je
c
ulazni niz a po etno sortiran u opadaju em redosledu) nije mnogo gori od
c
c
najboljeg slu aja (kada je ulazni niz a po etno ve sortiran u rastu em
c
c
c
c
redosledu). U najboljem slu aju se nikad ne izvrava operacija swap u
c
c
unutranjoj for petlji, ali je vreme izvravanja u tom slu aju ipak jednako
(n 1)n
1 + 1 = 0.5n2 0.5n + 1 ,
2
to je i dalje kvadratna funkcija od n.
c
Ovo svojstvo algoritma bubble-sort ne vai u optem slu aju, jer se
vremena izvravanja nekih algoritama u najgorem i najboljem slu aju mogu
c
drasti no razlikovati. To je na neki na in dobra osobina algoritma, jer je
c
c
prirodno o ekivati da u najboljem slu aju ulaznih podataka algoritam radi
c
c
mnogo bre.
Prethodno opisani algoritam bubble-sort moemo lako modikovati
kako bi za dobre ulazne podatke taj algoritam radio mnogo bre. Primetimo da dodatni prolazi du datog niza nisu vie potrebni ukoliko se
4 Ovo je jedan od na ina za pojednostavljivanje analize algoritama: svaki algoritam koji
c
se izvrava za konstantno vreme smatramo jedini nom instrukcijom, jer ta na vrednost tog
c
c
konstantnog vremena nije bitna.
37
(engl. insert-sort). Ovaj metod se sastoji od n iteracija, pri cemu se u itoj iteraciji ume e element a i na njegovo pravo mesto izmedu prvih i 1
c
38
i 1
// Ulaz:
niz a, broj elemenata n niza a
// Izlaz: niz a sortiran u rastuem redosledu
c
algorithm insert-sort(a, n)
a[0] = -;
for i = 1 to n do
j = i
while (a[j] < a[j-1]) do
swap(a[j], a[j-1]);
j = j - 1;
return a;
petlje nije odmah o igledan, ali moemo primetiti da taj broj nije ve i od
c
c
c
i 1. To je zato to promenljiva j dobija po etnu vrednost jednaku vrednosti promenljive i pre po etka while petlje, a j se smanjuje za jedan u
c
svakoj iteraciji te petlje do zavretka rada petlje. A while petlja se sigurno
n
i =1
n
i =1
1 + 2(i 1) + 1
1+2
= 1+n+2
n
i =1
(i 1) + 1
(n 1)n
+1
2
39
= n2 + 2 .
nad datim nizom. Taj postupak u ovom metodu je da se u i-toj iteraciji uzima najmanji element medu elementima a i , a i+1 , . . ., a n i zamenjuje
c
sa elementom a i . Ovaj na in sortiranja u i-toj iteraciji je ilustrovan na
slici 2.4.
a j = min{a i , a i+1 ,... , a n }
i 1
posle prve iteracije ce najmanji element niza biti na prvom mestu, posle
tako dalje, posle i-te iteracije ce i najmanjih elemenata niza biti poredano
40
j = minr(a, i, n);
swap(a[i], a[j]);
return a;
Algoritam minr, koji se u algoritmu select-sort koristi kao potprogram, kao rezultat daje indeks najmanjeg elementa desnog podniza a i ,
a i+1 , . . ., a n datog niza a. Taj algoritam je mala modikacija algoritma min
n 1
i =1
n 1
i =1
4(n i + 2) + 2 + 1
4(n i) + 10 + 1
(n 1)n
+ 10(n 1) + 1
2
= 2n2 + 8n 9 .
=4
Zadaci
1. Koriste i odgovaraju u invarijantu petlje, pokaite ispravnost algoritma
c
c
za problem pretrage niza u 1. zadatku prethodnog poglavlja. Pored toga,
odredite vreme izvravanja tog algoritma.
2. Koriste i odgovaraju u invarijantu petlje, pokaite ispravnost algoritma
c
c
za problem preostalog dela kredita u 2. zadatku prethodnog poglavlja.
(Savet: Iznos kredita koji preostaje nakon i-te iteracija petlje je p i .)
Pored toga, odredite vreme izvravanja tog algoritma.
3. Odredite vreme izvravanja slede ih algoritamskih fragmenata:
c
41
a)
if (x == 0) then
for i = 1 to n do
a[i] = i;
b)
i = 1;
repeat
a[i] = b[i] + c[i];
i = i + 1;
until (i == n);
c)
if (x == 0) then
for i = 1 to n do
for j = 1 to n do
a[i,j] = 0;
else
for i = 1 to n do
a[i,i] = 1;
d)
for i = 1 to n do
for j = 1 to n do
for k = 1 to j do
if (i == j) then
a[k,k] = 0;
4. Ako niz brojeva predstavimo u prirodnom horizontalnom poloaju, postupak sortiranja zamenjivanjem (bubble-sort) na strani 34 sastoji se od
ponavljanja prolaza du datog niza od najve eg potrebnog indeksa niza
c
do najmanjeg, odnosno ti prolazi uvek idu u smeru zdesna na levo.
a) Napiite algoritam za sortiranja zamenjivanjem u kojem se du datog niza uvek prolazi u smeru sleva na desno.
b) Napiite algoritam za sortiranja zamenjivanjem u kojem se du datog niza naizmeni no prolazi u oba smera.
c
G LAVA
3
Vreme izvravanja algoritma
U ovom poglavlju cemo blie razraditi ovu ideju daju i njenu motivaciju
c
i formalizaciju.
3.1
44
jednostavnijeg asimptotskog vremena izvravanja, opravdano je iz tri ra1 U ra unarstvu se logaritam skoro uvek uzima za osnovu 2, a ne za osnovu 10 ili e. U
c
45
zloga. Prvo, brzina algoritama je naro ito bitna kada je broj ulaznih poc
dataka veliki, jer se vreme izvravanja (skoro) svakog algoritma pove ava
c
sa brojem ulaznih podataka. Ako za isti problem imamo vie algoritama i
treba da odlu imo koji od njih da primenimo za njegovo reavanje, onda je
c
vano za koje vreme oni reavaju taj problem kada je broj ulaznih podataka
vrlo veliki. Naime, obi no je svaki algoritam dovoljno ekasan za mali broj
c
ulaznih podataka. To jest, uglavnom je irelevantno da li neki algoritam
radi, recimo, jednu milisekundu ili pet mikrosekundi za desetak ulaznih
podataka. Ta dva vremena su ionako neprimetna za ljude, ali to da li
algoritam radi pet minuta ili tri meseca za milion ulaznih podataka jeste
n3
T2 (n)
n log n
46
2n
5n2
100n
A1
100
1 s
10
1024
500
1000
10
100
100
50000
10000
100
21000
5 106
100000
1000
1000
A2
5 s 100 s
1 ms 0,5 ms
70
A3
1 ms
0,05 s
0,01 s
2970 g
5s
0,1 s
47
for i = 1 to n do
for j = 1 to n do
a[i,j] = 0;
for i = 1 to n do
a[i,i] = 1;
Vreme izvravanja T(n) ovog fragmenta jednako je zbiru vremena izvravanja dve petlje: prve for petlje u prvom redu i druge for petlje
u cetvrtom redu. Kako prva for petlja sadri ugnjedenu for petlju u
drugom redu, isto kao ranije moramo najpre odrediti broj iteracija ovih
petlji i vreme jednog izvravanja tela unutranje petlje, a zatim pomnoiti
ove tri vrednosti.
Poto se telo unutranje petlje u tre em redu izvrava za konstantno
c
vreme, a broj iteracija spoljanje i unutranje petlje jednak je n, ukupno
vreme izvravanja for petlje u prvom redu je neka konstanta pomnoena
sa n2 . Ovu konstantu moemo medutim zanemariti kada je n veliko, pa
Sli no, vreme izvravanja druge for petlje u cetvrtom redu je reda n,
c
jer je broj njenih iteracija jednak n i njeno telo u petom redu se izvrava
za konstantno vreme. Prema tome, ukupno vreme izvravanja T(n) datog
fragmenta je reda n2 + n, ali to moemo dalje uprostiti i zaklju iti da je T(n)
c
reda veli ine n2 , poto funkcija n2 dominira funkcijom n za veliko n.
c
Kao drugi primer razmotrimo algoritamski fragment koji ima istu funkcionalnost kao prethodni primer (tj. matrica a dimenzije n n se inicijalizuje da bude jedini na matrica):
c
1
2
3
4
5
6
for i = 1 to n do
for j = 1 to n
if (i == j)
a[i,j] =
else
a[i,j] =
do
then
1;
0;
48
Vreme izvravanja T(n) ovog fragmenta jednako je vremenu izvravanja dve ugnjedene for petlje u prvom i drugom redu. Kako se telo
da je jedna funkcija reda veli ine druge funkcije. O ovome cemo mnogo
c
detaljnije govoriti u odeljku 3.2 u nastavku.
49
prezime traene osobe uporedili sa prezimenima osoba na toj srednjoj stranici. Ukoliko je prvo slovo prezimena traene osobe po azbu nom redu iza
c
prvog slova prezimena osoba na srednjoj stranici imenika, pretragu bismo
usmerili na drugu polovinu imenika. Naime, traena osoba se sigurno ne
moe nalaziti u prvoj polovini imenika poto su osobe u imeniku poredane
50
a
oblast pretrage
ako je x < a k
x = ak ?
oblast pretrage
ako je x > a k
Da bismo odredili (asimptotsko) vreme izvravanja T(n) algoritma binarne pretrage bin-search, primetimo da je dovoljno samo odrediti vreme
izvravanja njegove while petlje. Ostali delovi tog algoritma (inicijalizacija
oblasti pretrage na po etku i return naredba na kraju) izvravaju se za
c
konstantno vreme, koje je zanemarljivo u odnosu na vreme izvravanja
while petlje kada je duina niza n dovoljno velika.
Sa druge strane, vreme izvravanja while petlje je proporcionalno broju
iteracija te petlje, jer se telo te petlje izvrava za konstantno vreme. U to se
lako moemo uveriti ukoliko primetimo da se telo while petlje sastoji samo
od jedini nih instrukcija, pa je o igledno njihovo ukupno vreme izvravac
c
nja u najgorem slu aju konstantno. Pojednostavljena analiza algoritma
c
bin-search se svodi dakle na odredivanje najve eg broja iteracija while
c
se petlja zavrava kada uslov i j nije ispunjen ili je traeni broj x naden,
51
nademo odmah u prvom koraku ili u nekom koraku posle toga, ali se nije
teko uveriti da se najve i broj iteracija while petlje izvrava kada se broj x
c
ne nalazi u nizu a. Onda se naime prolazi kroz ceo ciklus suavanja oblasti
pretrage od celog niza, zatim jedne polovine niza, pa jedne cetvrtine niza,
pa jedne osmine niza i tako dalje, na kraju do oblasti pretrage od samo
jednog elementa niza, posle cega vie ne vai uslov i j i petlja se zavrava.
c
Koliki je onda najve i broj iteracija while petlje u tom slu aju kada se
c
broj x ne nalazi u nizu a? Obratite panju na to da na ovo pitanje moemo
ne razmiljaju i mnogo odgovoriti da je taj broj najvie n, jer se nikad neki
c
element niza ne ispituje vie od jednom. To je ta no, ali onda bismo mogli
c
c
c
re i i da je taj broj najvie n2 ili n3 ili neto sli no. Ovde se sre emo sa jo
c
jednim svojstvom asimptotskog vremena izvravanja algoritma: iako se
njegova analiza umnogome pojednostavljuje, ipak se trudimo da dobijemo
to ta niju ocenu pravog vremena izvravanja algoritma.
c
Da bismo ta nije odredili najve i broj iteracija while petlje, moramo na
c
c
neki na in na i dobru meru onoga to se zaista deava prilikom izvravanja
c
c
te petlje u algoritmu bin-search. U postupku binarne pretrage sutina je
da duina oblasti pretrage po etno iznosi n, a na po etku svake iteracije
c
c
osim prve, duina oblasti pretrage jednaka je otprilike polovini duine
oblasti pretrage na po etku prethodne iteracije. Drugim re ima, ako m
c
c
ozna ava ukupan broj iteracija while petlje kada se broj x ne nalazi u nizu
c
a, onda:
na po etku prve iteracije, duina oblasti pretrage iznosi n;
c
na po etku druge iteracije, duina oblasti pretrage iznosi otprilike
c
n/2 = n/21;
na po etku tre e iteracije, duina oblasti pretrage iznosi otprilike
c
c
(n/2)/2 = n/4 = n/22;
= 1,
52
odnosno
n = 2 m 1 .
Neformalno ime
konstantna funkcija
log n
logaritamska funkcija
linearna funkcija
n log n
linearno-logaritamska funkcija
n3
2
kvadratna funkcija
kubna funkcija
eksponencijalna funkcija
53
2n
n3 n2
n log n n
log n
c
primer, funkcija 7n + 120 je ve a od n2 kada je n manje od 15. Ali, za mali
broj ulaznih podataka se vreme izvravanja obi no meri deli em sekunde,
c
c
pa oko toga ne moramo ni da brinemo.
Na slici 3.4 se vidi da je logaritamska funkcija od neke ta ke uvek ispod
c
ostalih funkcija. To zna i da su logaritamski algoritmi u praksi uvek bri
c
od algoritama ostalih vremenskih sloenosti (osim, naravno, konstantne
funkcije). Obratite ipak panju na to da stvarna vremenska razlika zavisi od konstanti koje u estvuju u izrazima za vremena izvravanja, pa je
c
54
3.2
Asimptotska notacija
prema njihovim funkcijama asimptotskog vremena izvravanja: to je takva funkcija manja, to je algoritam bolji (bri). Obi no je jasno da li
c
je neka funkcija manja od druge, ali za sloenije slu ajeve je potrebno
c
imati precizniju deniciju toga to se podrazumeva kada se tvrdi da je neka
funkcija manja od druge. Asimptotska notacija omogu ava upravo da se
c
na precizan na in uvede relativni poredak za funkcije.
c
Asimptotska notacija ima cetiri oblika: O-zapis (veliko o), -zapis (veliko omega), -zapis (veliko teta) i o-zapis (malo o). S obzirom na to da
O-zapis
O-zapis se koristi za precizno denisanje svojstva da je neka funkcija
manja od druge. Na po etku napomenimo da za sve funkcije o kojima goc
vorimo, podrazumevamo da su to pozitivne (ili ta nije, nenegativne) funkc
cije, a nenegativnost se podrazumeva i za njihove argumente. Preciznije
55
g(n)
f (n)
n0
56
ponekad danima pokuavaju da jedan algoritam ubrzaju za neki vrlo mali faktor. Ovde
je re samo o tome da elimo dobru optu sliku o algoritmima, koja bez jednostavnosti
c
asimptotske notacije ne bi bila mogu a.
c
57
vani, moemo bez kraja navoditi blie granice, recimo T(n) = O(0.01n2 ) ili
T(n) = O(0.0001n2 ) i tako dalje.
Da bismo razreili ovaj naizgled kontradiktoran problem, uvek kada je
to mogu e koristimo O-zapis koji je najprostiji. To zna i da je on izraen
c
c
jednim termom i da je konstantni faktor uz taj term jednak broju 1. Treba
ipak imati na umu da su jednostavnost i najbolja ocena u nekim slu ajec
vima suprostavljeni ciljevi, ali ti slu ajevi su sre om retki u praksi.
c
c
Na kraju, primetimo da u radu zloupotrebljavamo simbol =, jer znak
jednakosti nije zapravo simetri an (reeksivan) kada se koristi O-zapis.
c
To zna i da ako je f 1 (n) = O(g(n)) i f 2 (n) = O(g(n)), onda to ne implicira
c
c
da je f 1 (n) = f 2 (n). Striktno govore i, za nenegativnu funkciju g : N R+ ,
O(g(n)) treba denisati kao klasu nenegativnih funkcija:
O(g(n)) = f : N R+ | ( c > 0)( n 0 N)( n n 0 ) f (n) c g(n) .
58
f (n)
= 0.
g(n)
59
Intuitivno znacenje
f (n) = O(g(n))
f g
f (n) = (g(n))
f g
f (n) = (g(n))
f g
f (n) = o(g(n))
1
1
+
c.
n n2
LIMESA )
f (n)
= c > 0 f (n) = (g(n))
n g(n)
f (n)
lim
= c 0 f (n) = O(g(n))
n g(n)
lim
60
gde je c neka konstanta, a u slu aju -zapisa limes moe biti beskona an.
c
c
Pravilo limesa je skoro uvek lake primeniti nego formalne denicije.
Pored toga, mada naizgled to pravilo zahteva da se pokau da vae stroiji
uslovi, ono se moe primeniti u skoro svim prakti nim primerima funkcija
c
vremena izvravanja. Jedini izuzeci su slu ajevi kada grani na vrednost
c
c
c
ne postoji (recimo, f (n) = n sin n ), ali poto su vremena izvravanja obi no
dobre funkcije, to retko predstavlja problem.
c
Na primer, ako treba uporediti funkcije log2 n i n/ log n, moemo izra unati limes njihovog koli nika (pomo u, recimo, Lopitalovog pravila):
c
c
log2 n
= 0.
n n/ log n
lim
recimo, O-zapisom. To jest, postoje funkcije f (n) i g(n) takve da niti je f (n)
jednaka O(g(n)) niti je g(n) jednaka O( f (n)). Na primer,
f (n) =
n3 , ako je n parno
n,
ako je n neparno
g(n) =
n,
ako je n parno
n , ako je n neparno
koji reava taj problem, a ovde cemo predstaviti drugi, Euklidov algoritam
za isti problem koji je mnogo bri.
Ali poto algoritam gcd nismo analizirali u odeljku 2.1, ovde cemo ga
najpre ponoviti da bismo mogli lake da ocenimo njegovo vreme izvravanja
i uporedimo to sa Euklidovim algoritmom.
61
62
ska sloenost aritmeti kih operacija u zavisnosti od veli ine brojeva koji u
c
c
njima u estvuju.
c
Primenimo ovaj pristup u analizi algoritma gcd. Neka je n 1 broj bitova
binarnog zapisa ulaznog broja x i n 2 broj bitova binarnog zapisa ulaznog
broja y. Mera veli ine ulaza tog algoritma n je dakle zbir brojeva bitova
c
binarnog zapisa ulaznih brojeva: n = n 1 + n 2 . Sada dakle treba, zavisno
od ove prave mere veli ine ulaza za algoritam gcd, oceniti njegovo vreme
c
izvravanja u najgorem slu aju.
c
ceg zajedni kog delioca velikih brojeva cesto pojavljuje jeste kriptograja.
c
Bez preterivanja moemo re i da mnoge vane oblasti ljudske delatnosti
c
(vojska, nansije, Internet, . . . ) ne bi mogle da funkcioniu bez ekasnog
algoritma za njegovo reavanje. Sre om, takav algoritam je bio poznat jo
c
u anti kim vremenima i naziva se Euklidov algoritam. Ovaj algoritam se
c
c
r, odnosno najve i ceo broj manji ili jednak r. Prema tome, 7.51 = 7 i 7 = 7. Sli no, r
c
(engl. ceiling) ozna ava najmanji ceo broj ve i ili jednak r. Prema tome, 7.51 = 8 i 7 = 7.
c
c
63
zajedni ki delioci jednaki. U tom cilju, svaki ceo broj koji deli oba broja x
c
i y bez ostatka, mora deliti bez ostatka i brojeve y i x%y = x k y, (k N).
Obrnuto, svaki ceo broj koji deli bez ostatka i y i x%y = x k y, (k N), mora
deliti bez ostatka kako x = x%y + k y, (k N), tako i y.
Uz primedbu da svaki pozitivan ceo broj x deli broj 0 bez ostatka i da
c
c
zato nzd(x, 0) = x, najve i zajedni ki delilac dva broja moemo lako izra
cunati uzastopnim ponavljanjem jednakosti iz Euklidove teoreme. Neki
primeri tog izra unavanja za razne parove brojeva su:
c
nzd(1055, 15) = nzd(15, 5) = nzd(5, 0) = 5
nzd(400, 24) = nzd(24, 16) = nzd(16, 8) = nzd(8, 0) = 8
nzd(101, 100) = nzd(100, 1) = nzd(1, 0) = 1
nzd(34, 17) = nzd(17, 0) = 17
nzd(89, 55) = nzd(55, 34) = nzd(34, 21) = nzd(21, 13) =
= nzd(13, 8) = nzd(8, 5) = nzd(5, 3) =
= nzd(3, 2) = nzd(2, 1) = nzd(1, 0) = 1
u niz parova, pri cemu je prvi broj narednog para jednak drugom broju
prethodnog para, a drugi broj narednog para jednak je ostatku celobrojnog
deljenja prvog broja sa drugim brojem prethodnog para. Poslednji par u
nizu je onaj kod koga je drugi broj jednak nuli, a onda je najve i zajedni ki
c
c
delilac po etnog para jednak prvom broju tog poslednjeg para.
c
Ispravnost ovog postupka je o igledna na osnovu Euklidove teoreme, ali
c
se postavlja pitanje da li ce se niz parova jedne transformacije sigurno zavriti za svaki po etni par pozitivnih celih brojeva (x, y) takvih da x y. Da
c
je to slu aj nije se teko uveriti ukoliko primetimo da je drugi broj narednog
c
para uvek striktno manji od drugog broja prethodnog para. To sledi prosto
zato to je uvek x%y < y. Prema tome, ovo smanjivanje drugih brojeva u
parovima niza jedne transformacije ne moe se beskona no produiti, jer
c
najgori slu aj tih brojeva u nizu je y, y 1, y 2, . . . , 1, 0.
c
Precizniji opis Euklidovog algoritma na pseudo jeziku je:
// Ulaz: celi brojevi x i y takvi da x y > 0
// Izlaz: nzd(x, y)
algorithm euclid(x, y)
while (y > 0) do
z = x % y;
64
x = y;
y = z;
return x;
Kako bismo sada ocenili broj iteracija while petlje m, najpre cemo
c
oceniti proizvod parova brojeva x i yi primenjuju i prethodnu lemu vie
puta:
65
66
Zadaci
1. Odredite (asimptotsko) vreme izvravanja slede ih algoritamskih fragc
menata:
a)
if (x == 0) then
for i = 1 to n do
a[i] = i;
b)
i = 1;
repeat
a[i] = b[i] + c[i];
i = i + 1;
until (i == n);
c)
if (x == 0) then
for i = 1 to n do
for j = 1 to n do
a[i,j] = 0;
else
for i = 1 to n do
a[i,i] = 1;
d)
for i = 1 to n do
for j = 1 to n do
for k = 1 to j do
if (i == j) then
a[k,k] = 0;
e)
i = 0; k
while (k
k = 2
i = i
= 1;
<= n) do
* k;
+ 1;
f)
for i = 1 to n/2 do
for j = i downto 1 do
if (j % 2 == 0) then
a[i,j] = b[i] + c[j];
c
a k . U slu aju kada nisu jednaki, postupamo tako to ukoliko je x <
a k , pretragu nastavljamo u oblasti od i do k 1. A ukoliko je x > a k ,
67
crveno
belo
S LIKA 3.6.
Navedite bar dva algoritma za reenje ovog problema i odredite vreme
izvravanja svakog od njih.
5. Srpska zastava. Posmatrajmo niz a veli ine n koji sadri crvene, plave i
c
bele elemente u proizvoljnom redosledu. Pretpostavljaju i da je proverac
vanje boje nekog elementa jedini na instrukcija, cilj je da se niz preuredi
c
tako da se svi crveni elementi nalaze na po etku, svi plavi elementi da
c
se nalaze u sredini, a svi beli elementi da se nalaze na kraju niza a. Na
slici 3.7 je ilustrovan zavrni rezultat.
a
crveno
plavo
belo
S LIKA 3.7.
Navedite bar dva algoritma za reenje ovog problema i odredite vreme
izvravanja svakog od njih.
6. Dokaite pravilo limesa na strani 59.
68
g(n) = n + 200
g(n) = n2/3
g(n) = n + log2 n
d) f (n) = n log n,
g(n) = log 3n
g(n) = n log2 n
f) f (n) = n / log n,
g) f (n) = (log n)log n ,
log n
h) f (n) = (log n)
i) f (n) =
g(n) = 2n
j) f (n) = nlog n ,
l) f (n) = 2n ,
g(n) = 2log
g(n) = log3 n
n,
k) f (n) = n2n ,
g(n) = n
g(n) = 3n
g(n) = 2n/2
m) f (n) = n!,
g(n) = 2n
n) f (n) = n!,
g(n) = n n
o) f (n) =
n
k
i =1 i ,
g(n) = n k+1
argumenta n:
n, log n, loglog n, log2 n,
n
, n! , n log2 n,
log n
log n
, (1/3)n , (3/2)n , 17
69
70
zbir dva proizvoda: jedan sabirak je proizvod broja x i nekog celog broja,
a drugi sabirak je proizvod broja y i nekog drugog celog broja. Koriste i
c
ovo zapaanje dokaite slede u cinjenicu:
c
T EOREMA nzd(x, y) se moe predstaviti kao linearna kombinacija brojeva x i y u obliku nzd(x, y) = ax + b y, gde su a i b celi brojevi (koji ne
moraju biti pozitivni).
Napiite proireni Euklidov algoritam koji izra unava ne samo nzd(x, y),
c
nego i cele brojeve a i b iz prethodne teoreme za koje vai nzd(x, y) =
ax + b y.
G LAVA
4
Osnovne strukture podataka
4.1
Opte napomene
1
za strukturiranje podataka u ve ini viih programskih jezika je niz.
c
Realizacija apstraktnog tipa podataka u ra unaru zahteva prevodenje
c
72
Pod elementom se ovde podrazumeva podatak kome tip nije preciziran zato
to nije bitan.
Operacije koje su denisane nad strukturama podataka se veoma razlikuju od strukture do strukture, ali sve strukture imaju bar dve zajedni ke operacije: jednu za dodavanje novih elemenata kolekciji postoje ih
c
c
elemenata koji sa injavaju odgovaraju u strukturu podataka, kao i onu za
c
c
uklanjanje starih elemenata iz kolekcije elemenata. Ovde bi mogli dodati i
operaciju za konstruisanje potpuno nove, prazne strukture podataka. Medutim, ona umnogome zavisi od konkretnog programskog jezika, a poto su
vanje da li se dati element nalazi u nekoj strukturi podataka, preuredivanje elemenata strukture podataka u nekom redosledu, odredivanje
broja elemenata strukture podataka (tj. njene veli ine) i tako dalje. Uopc
teno govore i, operacije nad strukturama podataka se mogu podeliti u dve
c
kategorije: (a) upite, koji kao rezultat daju neku informaciju o strukturi
podataka ne menjaju i je, i (b) modikuju e operacije, koje menjaju sadraj
c
c
strukture podataka.
Vreme za izvravanje neke operacije nad strukturom podataka izraava se u funkciji od veli ine strukture podataka. To ima smisla, jer je pric
rodno pretpostaviti da vreme za neku operaciju zavisi od broja elemenata
u strukturi podataka nad kojima se primenjuje. Na primer, ako niz ima
n elemenata, vreme za operaciju kojom se odreduje da li se dati element
c
pokaziva ki tip podataka i mogu nost rada sa nizovima.
c
4.2. Nizovi
73
U prezentaciji neke strukture podataka uglavnom primenjujemo proceduralni pristup, mada koristimo i neke rudimentarne koncepte objektno
orijentisanog programiranja. Naime, poto se elementi struktura podataka
obi no sastoje od vie delova, pogodno ih je smatrati objektima koji sadre
c
unutranja polja za razli ite podatke. (Medutim, mogu nost da objekti
c
c
4.2 Nizovi
Niz (engl. array) je osnovni na in strukturiranja podataka u programic
ranju i zato se koristi u skoro svim programskim jezicima. Pretpostavljamo
intezivno koristili u prethodnom poglavlju i nadamo se da citaoci bez predznanja o nizovima nisu imali problema da razumeju njihovu jednostavnu
prirodu. Ipak, s obzirom na to da su primene nizova brojne i raznovrsne,
74
duina ili veli ina niza. Na primer, niz a duine 100 se sastoji od 100
c
a[1]
a[2]
a[3]
a[100]
pojedina nih elemenata niza moe biti bilo koji, ma kako sloen.
c
2. Duina niza mora biti unapred zadata i ne moe se menjati.
Upravo ove osobine nizova omogu avaju njihovu jednostavnu zi ku rec
c
prezentaciju u memoriji ra unara. Naime, ta memorijska reprezentacija je
c
isklju ivo neka vrsta sekvencijalne alokacije, odnosno elementi niza zauzic
maju neprekidni niz susednih memorijskih lokacija. Zato se prakti no i ne
c
razdvaja logi ki koncept niza od njegove zi ke memorijske reprezentacije.
c
c
Primetimo da se ukupna veli ina potrebne memorije za neki niz lako
c
odreduje kao proizvod broja elemenata i veli ine jednog elementa tog niza.
c
Ove dve vrednosti su unapred poznate, jer se duina niza mora unapred
nazna iti, a veli ina jednog elementa je poznata na osnovu tipa elemenata
c
c
niza. Ali ono to je jo vanije, lokacija svakog elementa niza se lako
izra unava, nezavisno od indeksa elementa: ako je prvi element na lokaciji
c
a i veli ina jednog elementa je b bajtova, onda se i-ti element niza nalazi
c
c
na lokaciji a + (i 1)b. Ovo zna i da je vreme pristupa svim elementima
4.2. Nizovi
75
Zbog toga struktura niza nije pogodna ni u slu ajevima kada su ovakve
c
operacije dominantne.
Podsetimo se da se kvadratni algoritam za reenje ovog problema sastoji od dva koraka. U prvom koraku se odreduje drugi niz b od n eleme
M = max { b 1 , b 2 , . . ., b n } = max b i .
i=1,...,n
ljavaju jedan od ova dva uslova: ili su one sve nenegativne ili su neke od
76
njih negativne. Prvo zapaanje je da u oba slu aja moemo izbe i mnoga
c
c
naredna izra unavanja elemenata niza b.
c
L EMA 1 Za svako i {1, 2, . . ., n},
1) Ako su sve sume S i,i ,S i,i+1 , . . ., S i,n nenegativne, odnosno S i, j 0 za
svako j = i, i + 1, . . ., n, onda je
M = max{ b 1 , . . ., b i } .
2) Ako su neke od suma S i,i , S i,i+1 , . . ., S i,n negativne, neka je j najmanji
(prvi) indeks tako da je S i, j < 0. Onda je
M = max{ b 1 , . . ., b i , b j +1, . . ., b n } .
k1 k
a
S i,k1 0
S k,r
Onda je
b k = S k,r
S i,k1 + S k,r , jer S i,k1 0 po pretpostavci
= S i,r
bi,
to je trebalo pokazati.
jer b i = max S i, j ,
j = i,...,n
4.2. Nizovi
77
j j+1
a
S i, j < 0
S j +1,r
78
b j +1 ,
to je trebalo pokazati.
Ova lema implicira da, tokom izra unavanja bilo kog elementa b i , prvi
c
c
put kada otkrijemo S i, j < 0 moemo bezbedno prekinuti to izra unavanje
i nastaviti sa izra unavanjem elemenata b j +1 , . . . , b n . Naime, ukoliko je
c
element b i jednak jednoj od suma S i,i , S i,i+1 , . . ., S i, j 1 , onda svakako ne
c
moramo ispitivati dalje sume S i, j +1 , S i, j +2 , . . ., S i,n . U suprotnom slu aju,
ukoliko je element b i jednak nekoj daljoj sumi od pozicije j, onda je prema
c
c
prethodnoj lemi b i b j +1. To zna i da je element b i nevaan za izra unavanje maksimuma niza b, pa zato izra unavanje elementa b i moemo
c
potpuno zanemariti i nastaviti sa izra unavanjem elemenata b j +1, . . ., b n .
c
Postupak koji se zasniva na prethodnim zapaanjima na pseudo jeziku
je:
// Ulaz: niz a, broj elemenata n niza a
// Izlaz: maksimalna suma podniza M
algorithm mcss(a, n)
M = 0;
// maksimalna suma podniza
i = 1;
while i < n do
// izraunati b i
c
s = 0;
for j = i to n do
// izraunati S i, j
c
s = s + a[j];
// S i, j = S i, j 1 + a j
if (s < 0) then
// da li je S i, j < 0?
return M;
Mada i ova verzija algoritma mcss sadri dve ugnjedene petlje, njegovo
4.2. Nizovi
79
Matrice
Do sada smo govorili, u stvari, o naj e e kori enom obliku niza koji se
c c
c
optije naziva jednodimenzionalni niz (ili ponekad i vektor). Generalizacija
tog oblika se moe dobiti ukoliko se uzme da su sami elementi jednodimenzionalnog niza opet jednodimenzionalni nizovi. (Podsetimo se da za
tip elemenata nizova ne postoji nikakvo ograni enje u vezi sa njihovom
c
sloeno u.) Tako se dobija dvodimenzionalni niz ili matrica elemenata.
c
Matrica elemenata predstavlja koncepcijski tabelu tih elemenata koja
ima odreden broj vrsta i kolona. Elementi matrice imaju zato dvostruke in
dekse: prvi indeks ukazuje na vrstu i drugi na kolonu u kojima se element
nalazi u matrici. Pored toga, za matricu elemenata se unapred moraju
zadati brojevi njenih vrsta i njenih kolona koji se nazivaju veli ina mac
trice. Veli ina matrice ne moe se menjati, to proizilazi iz nepromenljivoc
sti veli ine jednodimenzionalnog niza. Na primer, na slici 4.2 je prikazana
c
matrica elemenata veli ine 34 koja ima tri vrste i cetiri kolone.
c
a
a[1,1]
a[1,2]
a[1,3]
a[1,4]
a[2,1]
a[2,2]
a[2,3]
a[2,4]
a[3,1]
a[3,2]
a[3,3]
a[3,4]
80
M i D, oba veli ine n, ciji se elementi poistove uju sa mladi ima i devojc
c
c
kama. Prosto re eno, skup M se sastoji od n mladi a i skup D se sastoji od
c
c
n devojaka. Pretpostavimo dalje da mladi i i devojke iz ova dva skupa trae
c
svoje ivotne partnere u socijalnom okruenju koje predstavlja monogamno
i heteroseksualno drutvo, to zna i da svaka osoba za supranika eli
c
ta no jednu osobu suprotnog pola. Vezivanje kojim se svakom mladi u iz
c
c
skupa M dodeljuje razli ita devojka iz skupa D naziva se savreno vezivac
nje. Slikovito re eno, jedno savreno vezivanje predstavlja jedno mogu e
c
c
kolektivno ven anje svih mladi a i devojaka iz dva data skupa. Radi dalje
c
c
analogije, ako mladi u m M u savrenom vezivanju odgovara devojka
c
d D, to se ozna ava kao (bra ni) par (m, d).
c
c
Jasno je da za date skupove M i D veli ine n postoji veliki broj (n!) moc
gu ih savrenih vezivanja, pa bez ikakvih ograni enja to nije mnogo intec
c
resantno. Ograni enje koje savreno vezivanje mora zadovoljiti za problem
c
stabilnih brakova se denie u duhu toga da sve veze mladi a i devojaka
c
budu dugotrajne, odnosno da njihovi brakovi budu stabilni bez razvoda.
Zato pretpostavljamo da svaka osoba ima listu naklonosti svih osoba
suprotnog pola koja odraava prvenstvo po kojem bi data osoba elela da
stupi u brak sa drugom osobom. Drugim re ima, svaki mladi rangira sve
c
c
devojke od one koja mu se najvie svida pa do one koja mu se najmanje
4.2. Nizovi
81
Y : y, x, z, u
Z : x, u, z, y
U : u, z, x, y
x : X , Y , Z,U
y : U, Z, Y , X
z : Y , Z, X ,U
u : Z,U, X , Y
1
z
y
x
u
2
y
x
u
z
3
x
z
z
x
4
u
u
y
y
devojke
x
y
z
u
1
X
U
Y
Z
2
Y
Z
Z
U
3
Z
Y
X
X
4
U
X
U
Y
osoba q od osobe r suprotnog pola ukoliko se q nalazi pre r na listi naklonosti osobe p. Tako u prethodnom primeru, devojci z se vie svida Y od U
c
bra ni parovi (m, ) i (, d) za neke druge D i M, ali se mladi u
c
m vie svida d od njegove ene i devojci d se vie svida m od njenog mua
82
Ako pokuamo da uklonimo ovu nestabilnost vezivanjem ovog nezadovoljnog para (zamislimo da su se bra ni parovi (Z, z) i (U, u) razveli), i zatim
c
veemo U i z poto je to jedini izbor za njih, dobijamo novo vezivanje (X , x),
(Y , y), (Z, u), (U, z). Medutim, ovo vezivanje je takode nestabilno zbog X
4.2. Nizovi
83
84
petlje imamo slobodnog mladi a koji moe ostati slobodan ukoliko ga odbije
c
njegova najpoeljnija zauzeta devojka koju prosi. Cak i ako ga ona prihvati,
njen stari verenik postaje slobodan, tako da se broj slobodnih mladi a ne e
c
c
paljivije pokazati njegova svojstva. U nastavku cemo zato kroz niz formalnih zapaanja odgovoriti na sve prethodne dileme.
L EMA 1 Za n mladi a i n devojaka, algoritam smp se zavrava u najvie
c
2
n iteracija.
Dokaz: Primetimo da ovde tvrdimo vie od toga da algoritam smp ne
radi beskona no on se zavrava i to u najvie n2 iteracija. Da bismo
c
ovo pokazali, moramo na i dobru meru napredovanja while petlje. (Videli
c
smo da to nije broj slobodnih mladi a.) Pokaza emo da je to broj prosidbi
c
c
koje mladi i izvedu.
c
Zaista, nijedan mladi ne prosi istu devojku dvaput, jer neki mladi
c
c
uvek prosi devojku koju nikad ranije nije zaprosio. To zna i da svaki
c
mladi izvede najvie n prosidbi tokom rada algoritma smp, odnosno svih
c
n mladi a zajedno izvedu najvie n2 prosidbi ukupno. U svakoj iteraciji
c
while petlje se izvodi ta no jedna nova prosidba, pa zato moe biti najvie
c
n2 iteracija.
Pre nego to pokaemo da u algoritmu smp svaki slobodan mladi ima
c
devojku na svojoj listi koju jo nije zaprosio, primetimo jedno interesantno
svojstvo tog algoritma. Svaki put kada mladi prosi neku devojku, on to
c
4.2. Nizovi
85
radi na svoju ve u alost: prvi put prosi svoju najve u ljubav, zatim prosi
c
c
devojku koja je njegov drugi izbor, pa tre i izbor i tako dalje. Devojke sa
c
druge strane svaki put kada promene verenike, rade to na svoju ve u sre u.
c
c
Slobodna devojka od trenutka kada prihvati ponudu nekog mladi a koji
c
ju je zaprosio, nikad vie ne postaje slobodna ona moe samo promeniti
svog verenika ako dobije bolju ponudu iz njenog ugla gledanja, odnosno ako
je zaprosi mladi koji joj se vie svida od aktuelnog verenika.
c
c
c
L EMA 2 Svaki slobodan mladi na po etku while petlje u algoritmu smp
ima devojku koju jo nije zaprosio.
Dokaz: Primetimo najpre da je na po etku izvravanja svake iteracije
c
while petlje u algoritmu smp broj slobodnih mladi a jednak broju slobodnih
c
devojaka. To je, u stvari, invarijanta te petlje, odnosno uslov koji ostaje
nepromenjen nakon izvravanja svake iteracije petlje. (Citaoci se o invarijantama petlji mogu podsetiti na strani 20.)
U to se moemo uveriti na slede i na in. Jasno je da je taj uslov zadovoc
c
ljen na po etku prve iteracije, poto su onda svi mladi i i devojke slobodni.
c
c
Pod pretpostavkom da je taj uslov ta an na po etku neke iteracije, izvrac
c
vanjem te iteracije se broj slobodnih mladi a i broj slobodnih devojaka ili ne
c
menjaju ili oba smanjuju za jedan (kada slobodna devojka prihvati ponudu
slobodnog mladi a), pa je taj uslov ta an i na po etku slede e iteracije.
c
c
c
c
Sada moemo pokazati da vai tvrdenje leme. Neka je m slobodan
Dokaz: Neka su broj mladi a i broj devojaka jednaki n. Prvo cemo poc
c
kazati da algoritam smp proizvodi savreno vezivanje, odnosno ta no n
bra nih parova u kojima se svaki mladi i devojka pojavljuju ta no jednom.
c
c
c
c
c
Kada se while petlja zavri, ne postoji slobodan mladi . To zna i da su
svi mladi i vereni bar sa jednom devojkom. O igledno je da neki mladi
c
c
c
moe biti veren sa najvie jednom devojkom, jer mladi moe biti veren
c
c
samo kada je slobodan. Stoga, kada se while petlja zavri, svaki mladi je
veren sa ta no jednom devojkom. Sa druge strane, na osnovu invarijante
c
86
c
svida m od njenog mua . Poto je (m, ) bra ni par, m je morao da zaprosi
, jer neki mladi moe biti veren samo ako zaprosi devojku. Ali tada je
c
m morao da zaprosi i sve devojke koje su pre njegove ene na njegovoj
listi naklonosti, jer mladi i prose devojke po redu u kojem se one nalaze
c
na njihovoj listi naklonosti. Speci no, tokom rada algoritma m je morao
c
zaprositi i devojku d, jer mu se ona vie svida od njegove ene (i pri tome
4.2. Nizovi
87
takode dodaje na kraj tog niza. (Citaoci koji bolje poznaju strukture
c
j 1 od mladi a j 2 .
88
4.3 Liste
Lista (ta nije povezana lista) je struktura podataka koja je sli na nizu
c
c
jer predstavlja sekvencu elemenata istog tipa. Medutim, za razliku od
x2
xn
duina pove ava ili smanjuje dodavanjem novih ili uklanjanjem postoje ih
c
c
elemenata. Zato lista kao apstraktni tip podataka ima prednost nad nizom
u primenama kod kojih ukupan broj nekih istorodnih elemenata nije poznat, ili operacije dodavanja i uklanjanja tih elemenata ne slede unapred
poznat obrazac.
Sa druge strane, nizovi imaju prednost kada je potreban ekasan pristup proizvoljnom elementu pristup svakom elementu kod liste mora
po eti od prvog elementa i slede i njegovog sledbenika do i do drugog elec
c
c
menta, zatim slede i njegovog sledbenika do tre eg i tako dalje, dok se ne
c
c
stigne do eljenog elementa. Prema tome, pristup proizvoljnom elementu
4.3. Liste
89
tura podataka liste realizuje se na prirodan na in: svaki element liste predc
stavlja se jednim objektom sa dva polja. Ovaj objekat se obi no naziva cvor
c
liste, dok drugo polje cvora sadri pokazava na slede i cvor liste.
c
c
Poto sadraj elemenata liste mogu biti podaci bilo kog (istog) tipa,
prvo polje mora biti odgovaraju eg tipa tih podataka koji zavisi od konc
kretne primene liste. Medutim, na optem nivou se sadraj elemenata
c
c
tome, prvo polje u svakom cvoru liste (oznaka klju) poistove uje se sa
pravim sadrajem odgovaraju eg elementa liste, dok drugo pokaziva ko
c
c
polje (oznaka sled) ukazuje na sledbenika elementa liste.
Listi l se grupno pristupa preko posebnog spoljanjeg pokaziva a (ozc
naka l) koji nije deo liste i koji pokazuje na prvi cvor liste. Pogodno je
pretpostaviti i postojanje specijalne vrednosti pokaziva a null koja nikad
c
klju sled
c
klju sled
c
klju sled
c
90
Ako je dat (pokaziva na) novi cvor x i (pokaziva na) cvor p liste iza
c
c
koga se dodaje novi cvor, veza izmedu cvora p i njegovog sledbenika u listi
cvora p.
p
a
b
x
U posebnom slu aju kada novi cvor treba dodati na po etak liste, poto
c
c
to mesto nema prethodnika pretpostavljamo da je p jednako null. Algori
4.3. Liste
91
return l;
uklanjanje cvora iz liste mora se znati cvor liste iza koga se uklanja postoje i cvor kako bi se lokalne veze mogle preurediti i zadrati sekvencijalna
c
uredenost liste.
Ako je dat (pokaziva na) cvor p liste cijeg sledbenika treba ukloniti,
c
p
a
Mada za uklanjanje nekog cvora iza datog cvora logi ki ne treba nita
c
dodatno uraditi od onog to je prikazano na slici 4.6, prakti no je potrebno i
c
92
slu aj, algoritam za ovu operaciju u nastavku kao rezultat vra a (pokaziva
c
c
c
na) prvi pronadeni cvor sa datim klju em. U suprotnom slu aju, ako cvor
c
c
null.
// Ulaz: lista l , klju k
c
// Izlaz: vor x u listi sa kljuem k ili vrednost null
c
c
algorithm list-search(l, k)
x = l;
while ((x != null) && (x.klju != k)) do
c
x = x.sled;
return x;
Obratite panju na to da smo kod dodavanja ili uklanjanja cvora pret vora, na kojem
postavljali da ta no znamo mesto u listi, naime iza datog c
c
uklonimo cvor iza nekog cvora u listi sa datim klju em. U takvom slu aju
c
c
4.3. Liste
93
ili ukloniti cvor iza pronadenog cvora. Prema tome, vreme izvravanja ovih
svaki cvor ima jedno pokaziva ko polje koje ukazuje na sledbenika cvora.
c
Jednostruko povezane liste se mogu prelaziti samo u jednom smeru sleva
na desno, to smo mogli primetiti u algoritmu list-search. Medutim, u
joj svaki cvor ima polje klju a i dva pokaziva ka polja sa oznakama sled
c
c
i pret: polje sled kao i ranije ukazuje na sledbenika cvora, dok polje
u polju pret i poslednji cvor u polju sled imaju vrednost null. Kao kod
jednostruko povezane liste, dvostruko povezanoj listi se pristupa preko
posebnog spoljanjeg pokaziva a koji pokazuje na prvi cvor liste, a koji nije
c
deo liste. Na slici 4.7 je prikazan primer dvostruko povezane liste l.
l
c
pret klju sled
moemo izvoditi iza ili ispred datog cvora. Pored toga, za uklanjanje cvora
94
return l;
cima, pa cemo u ovom odeljku kratko opisati kako se liste mogu predstaviti
pomo u nizova i kako se pokaziva i mogu simulirati pomo u indeksa elec
c
c
menata nizova.4
Cvorovi liste (ili optije bilo koji objekti) sa istim poljima mogu se najjednostavnije predstaviti pomo u posebnog niza za svako polje. Speci no,
c
c
jednostruko povezana lista se predstavlja pomo u dva niza, a dvostruko
c
povezana lista pomo u tri niza. Kod dvostruko povezane liste na primer,
c
jedan niz, recimo k, sadri vrednosti polja klju a cvorova liste, a preostala
c
dva niza, recimo s i p, simuliraju polja pokaziva a na sledbenika i pretc
hodnika. Na slici 4.9 je prikazano mogu e stanje ovih nizova za dvostruku
c
4 Re simulirati treba shvatiti uslovno, poto se u ra unarima pokaziva i zaista realic
c
c
zuju pomo u indeksa (memorijskih adresa) elemenata jednog velikog niza (glavne memoc
rije).
4.3. Liste
95
povezanu listu sa slike 4.7. U optem slu aju, element dvostruko povezane
c
liste se grupno predstavlja elementima tri niza k i , s i i p i na i-toj poziciji.
Pri tome, vrednost pokaziva a x se predstavlja zajedni kim indeksom elec
c
menata tri niza k x , s x i p x . Indeksi nizova u ovoj interpretaciji se ponekad
nazivaju kursori.
l
2
2
0
a
5
c
c
c
s 2 = 5 i p 5 = 2. Drugi elementi liste su na sli an na in povezani kursorima
c
umesto pokaziva ima. Pokaziva null se obi no predstavlja brojem (na
c
c
c
primer, 0 ili 1) koji sigurno ne moe biti stvarni indeks nizova. Pokaziva
preko koga se pristupa listi predstavlja se obi nom promenljivom l koja
c
sadri indeks prvog elementa liste.
Povezane liste moemo predstaviti i pomo u samo jednog niza, ukoc
liko primenimo metod sli an onom koji se koristi za smetanje objekata
c
u glavnoj memoriji stvarnih ra unara. Naime, jedan objekat zauzima suc
sedne lokacije u glavnoj memoriji ra unara. Pokaziva na neki objekat
c
c
predstavlja adresu prve memorijske lokacije tog objekta, a polja unutar
tog objekta mogu se indeksirati dodavanjem njihove relativne pozicije na
po etni pokaziva .
c
c
Isti princip moemo primeniti za predstavljanje objekata u programskim jezicima koji nemaju ugradeni pokaziva ki tip podataka. Na slici 4.10
c
dvostruko povezane liste sa slike 4.7. Jedan cvor liste zauzima mesto
c
neprekidnog podniza m i , . . ., m j niza m. Pokaziva na ovaj cvor je odre
den po etnim indeksom i podniza, a svako polje ovog cvora je odredeno
c
96
10
a 13 0 d 0 19
11
12
13
14
15
b 19 4
16
17
18
19
20
21
7 13
4.4
Stekovi
Stek (engl. stack) je specijalna vrsta liste kod koje se dodavanja i uklanjanja elemenata obavljaju samo na jednom kraju koji se naziva vrh steka.
Intuitivni model strukture podataka steka su naslagani posluavnici u restoranu ili komadi i mesa poredani na ranji u. U oba primera je pogodno
c
c
ukloniti samo onaj element (posluavnik ili komadi mesa) koji se nalazi na
c
vrhu steka, kao i dodati novi element samo na vrh steka. Drugim re ima,
c
poredak elemenata po kojem se oni uklanjaju sa steka je obrnut onom po
kojem su oni dodati na stek. Operacija dodavanja elemenata na stek se
tradicionalno zove push, a operacija uklanjanja elemenata iz steka zove se
pop.
Sve implementacije liste o kojima smo govorili u prethodnom odeljku
mogu se iskoristiti i za stek, poto je stek sa svojim operacijama specijalni slu aj liste sa svojim operacijama. U programskom okruenju koje
c
obezbeduje rad sa pokaziva ima, implementacija liste prakti no ne mora
c
c
4.4. Stekovi
97
23
17
20
10
8
20
17
23
// Ulaz: stek s
// Izlaz: tano ako je s prazan, inae netano
c
c
c
algorithm stack-empty(s)
98
if (s.v == 0)
return true;
else
return false;
// Ulaz: stek s
// Izlaz: tano ako je s pun, inae netano
c
c
c
algorithm stack-full(s)
if (s.v == n)
return true;
else
return false;
// Ulaz: stek s
// Izlaz: element x uklonjen sa vrha steka s
algorithm pop(s)
// Pretpostavlja se da stek nije prazan
x = s.a[s.v];
s.v = s.v - 1;
return x;
4.5
Redovi za cekanje
Red za cekanje (engl. queue) je druga specijalna vrsta povezane liste kod
4.5. Redovi za cekanje
99
se novi element dodaje u red za cekanje, taj element se uvek priklju uje na
c
taka reda za cekanje je red ljudi koji ceka ispred bioskopa da kupi karte,
pri cemu ljudi na po etku reda odlaze iz reda poto kupe karte, a novi ljudi
c
1
2
a
r
100
// Ulaz: red q
// Izlaz: tano ako je q prazan, inae netano
c
c
c
algorithm queue-empty(q)
if (q.l == 0)
return true;
else
4.5. Redovi za cekanje
101
return false;
// Ulaz: red q
// Izlaz: tano ako je q pun, inae netano
c
c
c
algorithm queue-full(q)
if (q.l == n)
return true;
else
return false;
// Ulaz: novi element x, red q
// Izlaz: red q sa elementom x na kraju
algorithm enqueue(x, q)
// Pretpostavlja se da red nije pun
q.r = q.r % n + 1;
q.a[q.r] = x;
q.l = q.l + 1;
return;
// Ulaz: red q
// Izlaz: element x uklonjen iz reda q na poetku
c
algorithm dequeue(q)
// Pretpostavlja se da red nije prazan
x = q.a[q.g];
q.g = q.g % n + 1;
q.l = q.l - 1;
return x;
Zadaci
1. Virtuelna inicijalizacija niza. Ako je dat niz a 1 , . . ., a n duine n, naivni
na in za inicijalizaciju svih elemenata niza nekom vredno u x je:
c
c
algorithm array-init(a, n, x)
for i = 1 to n do
a[i] = x;
return a;
102
algorithm array-write(a, i, x)
return a[i];
a[i] = x;
return a;
U nekim primenama je linearno vreme za inicijalizaciju niza neprihvatljivo dugo, pa je potrebno virtuelno inicijalizovati niz za konstantno
vreme. To je posebno zna ajno u slu ajevima kada se tokom rada proc
c
grama koristi zapravo samo mali deo nekog velikog niza. Napiite algoritme array-init(a,n,x), array-read(a,i) i array-write(a,i,x)
koji rade ta no ono to treba, ali svaki od njih se izvrava za konstantno
c
vreme. (Savet: Koristite dva dodatna niza veli ine n, pri cemu jedan od
c
njih simulira stek.)
4.5. Redovi za cekanje
mladi i
c
X
Y
Z
U
V
1
x
y
z
u
v
2
y
z
u
v
x
3
z
u
v
x
y
103
4
u
v
x
y
z
5
v
x
y
z
u
devojke
x
y
z
u
v
1
Y
Z
U
V
X
2
Z
U
V
X
Y
3
U
V
X
Y
Z
4
V
X
Y
Z
U
5
X
Y
Z
U
V
104
cvora p u dvostruko povezanu listu l. Pretpostavite da su liste implementirane pomo u pokaziva a i analizirajte vreme izvravanja svog
c
c
algoritma.
12. Jedan niz se moe iskoristiti za predstavljanje dva steka, jedan koji
raste udesno od po etka niza i drugi koji raste ulevo od kraja niza.
c
Implementirajte operacije nad stekom koriste i ovu reprezentaciju dva
c
steka pomo u jednog niza. Analizirajte vreme izvravanja tih operacija.
c
15. Skup kao struktura podataka je kona na kolekcija elemenata (ili clac
4.5. Redovi za cekanje
x1
105
x2
xn
G LAVA
5
Rekurzivni algoritmi
koraka i dobiti trivijalni potproblemi cija se reenja mogu neposredno dobiti bez daljeg deljenja. U suprotnom slu aju dolazi do programske greke,
c
jer bi rekurzivni algoritam nastavio proces deljenja potproblema u beskona nost i ne bi doao do reenja.
c
Rekurzivni na in reavanja problema u programiranju je vrlo vaan i
c
108
Rekurzivni algoritmi
5.1
Pored ovog klasi nog iterativnog na ina, za izra unavanje stepena moc
c
c
emo primeniti druga iji, rekurzivni pristup ukoliko uo imo da je x0 = 1 za
c
c
c
c
stepen n = 0 i x n = x x n1 za stepen n ve i od nule. Drugim re ima, ako je
stepen n = 0, rezultat je uvek 1, dok za stepen n > 0 rezultat dobijamo ako
x pomnoimo sa (n 1)-im stepenom broja x. Naredni rekurzivni algoritam
power2 koristi ovaj na in za izra unavanje n-tog stepena broja x:
c
c
// Ulaz: realan broj x, ceo broj n 0
// Izlaz: broj x n
algorithm power2(x, n)
109
if (n == 0)
return 1;
else
return x * power2(x,n-1);
power2(1.5,2)
power2(1.5,1)
return 1.5*power2(1.5,2)
return 1.5*power2(1.5,1)
return 1.5*power2(1.5,0)
3.75
2.25
1.5
power2(1.5,0)
return 1
1
110
Rekurzivni algoritmi
se u telu algoritma power2 izvrava deo else naredbe if, odnosno naredba
return u kojoj se argument za broj x mnoi sa odgovaraju im rezultatom
c
poziva algoritma. Tek u poslednjem pozivu je argument za stepen jednak nuli, pa se izvravanjem dela then naredbe if kao rezultat dobija
broj 1. Nakon toga se lanac rekurzivnih poziva odmotava u obrnutom
smeru, kako to pokazuju donje strelice na slici 5.1. Pri tome se izvravanje
aktuelnog poziva sastoji od mnoenja rezultata odgovaraju eg zavrenog
c
poziva sa vredno u parametra x i dobijena vrednost se kao rezultat vra a
c
c
prethodnom pozivu.
Generalno, rekurzivni algoritmi reavaju neki zadatak svodenjem tog
njem na problem izra unavanja (n 1)-og stepena istog broja, koji je prostiji
c
u smislu da je stepen broja koji se izra unava za jedan manji. Prostiji
c
zadatak se zatim reava rekurzivnim pozivom algoritma koji se denie.
To sa svoje strane dovodi do svodenja tog prostijeg zadatka na jo prostiji
111
y,
ako je x % y = 0
nzd(y, x % y),
ako je x % y = 0 .
Na osnovu ove rekurzivne denicije sada je lako napisati rekurzivni Euklidov algoritam za izra unavanje nzd(x, y):
c
// Ulaz: celi brojevi x i y takvi da x y > 0
// Izlaz: nzd(x, y)
algorithm euclid(x, y)
if (x % y == 0) then // bazni sluaj
c
return y;
else
// opti sluaj
c
return nzd(y,x % y);
U ovom algoritmu u drugoj naredbi return primetimo da su u rekurzivnom pozivu nzd(y, x % y) oba argumenta manja od polaznih brojeva x
i y. To zna i da se tim pozivom zaista reava prostiji zadatak izra unac
c
vanja najve eg zajedni kog delioca za par manjih brojeva. Ostatak pri
c
c
celobrojnom deljenju u lancu rekurzivnih poziva se dakle stalno smanjuje
tre i broj niza je zbir drugog i prvog, odnosno 1 + 1 = 2; cetvrti broj niza je
c
c
zbir tre eg i drugog, odnosno 2 + 1 = 3; peti broj niza je zbir cetvrtog i tre eg,
c
c
c
odnosno 3 + 2 = 5; i tako dalje. Prema tome, po etni deo Fibona ijevog niza
brojeva je:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, . . .
Za izra unavanje n-tog broja Fibona ijevog niza moe se po eti od prva
c
c
c
dva broja tog niza i zatim primeniti iterativni postupak u kojem se u svakom koraku redom izra unava naredni broj u nizu dok se ne dobije traeni
c
112
Rekurzivni algoritmi
n-ti broj. U nastavku je predstavljen iterativni algoritam u kojem se koriste tri promenljive koje u svakom koraku sadre prethodna dva broja niza
(promenljive x i y) i naredni broj niza (promenljiva z):
// Ulaz: n 1
// Izlaz: n-ti broj Fibonaijevog niza
c
algorithm fib1(n)
x = 1; y = 1; z = 1;
for i = 3 to n do
z = x + y;
x = y;
y = z;
return z;
n > 2.
113
redosledu svoje veli ine od podnoja tog stuba ka vrhu. Na slici 5.2 je pric
kazana po etna konguracija ove igre za n = 5 diskova ukoliko zamislimo
c
da su tri stuba trougaono rasporedeni.
veli ine od podnoja stuba A, odnosno disk najve eg pre nika d n se nalazi
c
c
c
na dnu i disk najmanjeg pre nika d 1 se nalazi na vrhu stuba A. Cilj igre je
c
premestiti sve diskove na stub C koriste i stub B kao pomo ni i potuju i
c
c
c
dva pravila:
Samo se disk sa vrha jednog stuba moe premestiti na vrh drugog
stuba.
Nikad se ve i disk ne moe nalaziti iznad manjeg diska.
c
Primetimo da ova pravila impliciraju da se samo po jedan disk moe
premetati, kao i da se svi diskovi u svakom trenutku moraju nalaziti samo
na stubovima.
114
Rekurzivni algoritmi
Ovaj postupak je ispravan, kao to se u to paljivi citaoci mogu sami uveriti, ali je teko razumeti zato je to tako i jo je tee do i do njega.
c
115
2.
3.
4.
1 Ime algoritma toh je skra enica od engleskog naziva za igru Hanojskih kula: the
c
Towers of Hanoi.
116
Rekurzivni algoritmi
5.2
1,
ako je n = 1
(5.1)
117
dobijanje reenja neke rekurentne jedna ine je primena tzv. postupka viec
struke zamene u kojem se sukcesivno zamenjuje opti izraz za T(n) umesto
c
vrednosti T(m) za neko m < n na desnoj strani rekurentne jedna ine, sve
dok se ne eliminiu sve takve vrednosti i ne dobije po etni uslov.
c
Na primer, ukoliko se primeni ovaj postupak na rekurentnu jedna inu
c
(5.1) za vreme izvravanja algoritma toh, opti izraz za T(n) treba zameniti
c
umesto T(n 1), T(n 2), . . ., T(2) na desnoj strani rekurentne jedna ine
c
(5.1) za n > 1. Na kraju treba zameniti po etni uslov T(1) i pojednostaviti
rezultuju u formulu. Na taj na in se dobija slede e reenje za T(n):
c
c
c
T(n) = 2 T(n 1) + 1
= 2 2T(n 2) + 1 + 1 = 22 T(n 2) + 2 + 1
= 22 2T(n 3) + 1 + 2 + 1 = 23 T(n 3) + 22 + 2 + 1
.
.
.
= 2n1 T(1) + 2n2 + + 22 + 2 + 1
= 2 n 1 1 +
n 2
i =0
2 i = 2 n 1 +
2 n 1 1
= 2 2 n 1 1
21
= 2 1.
Primetimo da je reenje T(n) = 2n 1 zapravo broj poteza u reenju problema Hanojskih kula za n diskova, jer izvravanje algoritma move predstavlja upravo jedan potez u reenju.
Da bismo bolje uvebali rekurzivni na in reavanja problema i analizu
c
118
Rekurzivni algoritmi
119
120
Rekurzivni algoritmi
elementa polazne liste, odnosno prva lista sadri neparne, a druga parne
elemente polazne liste. Konkretno, l 1 = 89213 i l 2 = 6217. Zatim se ove
polovi ne liste rekurzivno sortiraju istim algoritmom, to kao rezultat daje
c
liste l 1 = 12389 i l 2 = 1267. Na kraju, algoritam list-merge proizvodi
objedinjenu sortiranu listu l = 112236789.
Nema, naravno, nita magi nog kod sortiranja dve manje liste, ve se
c
c
to dobija sistemati nom primenom rekurzivnog algoritma. Naime, algoritc
mom merge-sort se najpre deli ulazna lista na dve manje liste, a zatim
se nastavlja ovo rekurzivno deljenje manjih lista sve dok se ne dobije to da
svaka lista ima po jedan element. Na slici 5.4(a) je prikazano ovo rekurzivno deljenje listi iz primera. Zatim se dobijene manje liste objedinjuju
u parovima, idu i odozdo uz stablo, dok se cela lista ne dobije sortirana.
c
Ovaj proces je prikazan na slici 5.4(b). Medutim, vredno je uo iti da je ovo
c
869221173
89213
823
83
91
12389
6217
61
238
27
38
(a) deljenje
1267
19
16
27
(b) objedinjavanje
Analiza algoritma merge-sort. Neka je T(n) vreme izvravanja algoritma merge-sort za ulaznu listu l od n elemenata. Na osnovu dizajna
tog algoritma moemo zaklju iti da vreme njegovog izvravanja zavisi od
c
dva slu aja: kada ulazna lista ima jedan element (n = 1) i kada ima vie od
c
jednog elementa (n > 1).
Ako je n = 1, u tom algoritmu se izvrava konstantan broj instrukcija
za proveravanje uslova naredbe if i izvravanje naredbe return. Ukoliko
121
ako je n = 1
c1,
recimo najve u od njih), cime se dobija rekurentna jedna ina za T(n) koja
c
c
je prostija za reavanje:
T(n) =
c,
ako je n = 1
(5.2)
Uzgred, obratite panju na jo jedno suptilno pojednostavljenje u jedna ini (5.2). Naime, duina listi l 1 i l 2 u rekurzivnim pozivima algoritma
c
merge-sort nije uvek jednaka n/2. Paljivi citaoci mogu lako proveriti da
c
su te duine zapravo n/2 1 i n/2 , pa bi u jedna ini (5.2) za n > 1 na desnoj strani trebalo da stoji T n/2 1 + T n/2 + 2cn. Kako je uvek n/2
1 n/2 , ovu desnu stranu moemo pojednostaviti piu i 2T n/2 + 2cn.
c
(Ovde prirodno pretpostavljamo da je T(n) rastu a funkcija i, radi jednoc
stavnosti, koristimo jednakost umesto preciznije nejednakosti .) U stvari,
ovo cemo dalje pojednostaviti i potpuno zanemariti rad sa celobrojnim delovima realnih vrednosti, kako u jedna ini (5.2) tako i u preostalom delu
c
knjige. To ima opravdanja jer se paljivijom analizom moe pokazati da to
moemo uvek uraditi bez gubitka optosti, pa radi jednostavnosti namerno
biramo da budemo malo neprecizniji nautrb formalne ta nosti.
c
122
Rekurzivni algoritmi
vljaju i jednu takvu zamenu u jedna ini (5.2) na desnoj strani, dobijamo:
c
c
T(n) = 2 2T n/22 + 2c n/2 + 2cn
= 22 T n/22 + 4cn .
U ovoj jedna ini zamenjuju i dalje optu jedna inu za T n/22 na desnoj
c
c
c
strani dobijamo novu jedna inu:
c
T(n) = 22 2T n/23 + 2c n/22 + 4cn
= 23 T n/23 + 6cn .
cina, nije teko prepoznati obrazac po kojem se dobija opti oblik na desnoj
strani izraza za T(n):
T(n) = 2 i T n/2 i + 2icn,
i = 1, 2, 3, . . .
Po etni uslov T(1) = c na desnoj strani ove jedna ine dobija se kada je
c
c
i
i
n/2 = 1, odnosno n = 2 , ili i = log n. Zamenom tog uslova na desnoj strani
najzad dobijamo reenje jedna ine (5.2) u zatvorenom obliku:
c
T(n) = nT(1) + 2cn log n = cn + 2cn logn .
Ako se podsetimo asimptotske notacije iz odeljka 3.2, nije teko pokazati da se ovo reenje moe dalje izraziti O-zapisom u obliku T(n) =
O(n log n). Drugim re ima, vreme izvravanja algoritma merge-sort je
c
linearno-logaritamsko, to je asimptotski mnogo bre od kvadratnog vremena izvravanja jednostavnih algoritama za sortiranje o kojima smo govorili u odeljku 2.3 na strani 34.
123
a i p za svako i tako da je 1 i k; i
a i > p za svako i tako da je k + 1 i n.
Na slici 5.5 je prikazan rezulat ove permutacije elemenata u prvoj fazi
algoritma.
1
k +1
a
ai p
ai > p
124
Rekurzivni algoritmi
obuhvataju izbor prvog, poslednjeg, srednjeg, ili cak slu ajnog elementa
c
p
p
>p
>p
njihove vrednosti. Ovaj isti postupak se ponavlja sve dok je i < j. Kada se
c
indeksi i i j preklope (tj. i j), to zna i da je ispitan ceo podniz. Ono to
preostaje je da se medusobno zamene elementi a l i a j da bi se pivot element
125
podnizu.
// Ulaz: podniz niza a ogranien indeksima od l do r
c
// Izlaz: preureen podniz i njegov indeks u kome se nalazi pivot
d
algorithm partition(a, l, r)
// Pretpostavlja se da je a r+1 = +
p = a[l];
i = l + 1; j = r;
while (i < j) do
while (a[i] <= p) do i = i + 1;
while (a[j] > p) do j = j - 1;
swap(a[i],a[j]);
swap(a[l],a[j]);
return j;
ukoliko je pivot najve i element podniza ili su svi elementi podniza jednaki.
c
Da bismo u algoritmu partition izbegli proveravanje ovih uslova i tako
pokvarili njegovu jednostavnost, unapred smo pretpostavili da uvek postoji
grani ni element podniza na desnom kraju tako da je a r+1 = +. Aktuelni
c
a
p
>p
=p
Svaka od cetiri oblasti niza na slici 5.7 zadovoljava odreden uslov koji
126
Rekurzivni algoritmi
Bilo koju od dve prethodne verzije algoritma partition moemo koristiti da bismo napisali algoritam quick-sort(a,l,r) koji razdvajanjem
elemenata sortira podniz a l , . . ., a r , gde je 1 l r n. Eksplicitne granice
podniza su potrebne kao parametri ovog algoritma zbog njegove rekurzivne
prirode. Naravno, ukoliko elimo da sortiramo ceo niz a duine n, to moemo u programu uraditi pozivom quick-sort(a,1,n).
// Ulaz: podniz niza a ogranien indeksima od l do r
c
// Izlaz: sortiran podniz
algorithm quick-sort(a, l, r)
if (l < r) then
k = partition(a,l,r);
quick-sort(a,l,k-1);
quick-sort(a,k+1,r);
return a;
Analiza algoritma quick-sort. Izvravanje algoritma quick-sort zavisi od toga da li su razdvojeni delovi podnizova uravnoteeni po veli ini,
c
to sa svoje strane zavisi od ranga2 elementa izabranog za pivota. Ako
su podnizovi na svakom nivou stabla rekurzije otprilike jednako podeljeni,
sortiranje razdvajanjem se asimptotski izvrava kao i sortiranje objedinjavanjem za vreme O(n log n). Sa druge strane, ako je razdvajanje podnizova
2 Rang nekog elementa jednak je njegovoj poziciji u sortiranom nizu.
127
128
Rekurzivni algoritmi
Ova jedna ina je identi na rekurentnoj jedna ini za vreme izvravanja kod
c
c
c
sortiranja objedinjavanjem, pa vreme izvravanja za sortiranje razdvajanjem u najboljem slu aju iznosi O(n log n).
c
Prose an slu aj vremena izvravanja sortiranja razdvajanjem je mnogo
c
c
blii najboljem slu aju nego najgorem slu aju. Poto formalni dokaz ove
c
c
Iako nije mnogo verovatno da cemo za slu ajni ulazni niz uvek dobiti
c
da dobijemo mnogo vie dobrih podela nego loih, poto naa neformalna
5.3. Rekurentne jednacine
129
veli ine ulaza manje od n. Zadatak je na i formulu (ili bar gornju granicu)
c
c
za T(n) izraenu samo pomo u veli ine ulaza n.
c
c
Kroz primere u prethodnom odeljku smo upoznali i metod viestruke
zamene za reavanje nekih rekurentnih jedna ina. Pokazali smo da se
c
metod viestruke zamene sastoji od zamenjivanja vrednosti T(m) za m < n
optim oblikom rekurentnog dela jedna ine za T(n). Pri tome nakon nec
koliko zamena o ekujemo da moemo odrediti opti obrazac za T(n) i da
c
moemo odrediti kada taj opti oblik prelazi u bazni slu aj.
c
Sa matemati ke ta ke gledita, postoji trenutak kada kod metoda vic
c
estruke zamene dolazi do malo opasnog logi kog skoka. To se dogada u
c
koji dobijamo nakon niza zamena. Cesto je taj logi ki skok sasvim opravc
dan, ali ponekad to nije ba o igledno i moe biti podlono grekama. Da
c
bismo bili potpuno sigurni u takvim slu ajevima, opti oblik reenja treba
c
dalje verikovati, obi no indukcijom. Kombinovan sa ovom verikacijom,
c
metod viestruke zamene je sasvim korektan na in za dobijanje reenja
c
rekurentnih jedna ina.
c
Poto se u optem slu aju analize rekurzivnih algoritama mogu dobiti
c
rekurentne jedna ine koje su tee za reavanje, u ovom odeljku cemo upoc
znati jo neke matemati ke metode za reavanje rekurentnih jedna ina
c
c
rekurzivnih algoritama.
oblik iz koga moemo prepoznati opti obrazac. Medutim, kod teih pri
mera se lako moemo izgubiti u svom tom simboli kom manipulisanju, pa
c
se zato upotrebom stabla rekurzije obezbeduje slikovitiji na in za pra enje
c
c
130
Rekurzivni algoritmi
ako je n = 1
1,
(5.3)
sada iznosi n/2. Na slede em nivou imamo cetiri cvora, poto se svaki od
c
dva potproblema na prethodnom nivou dalje deli u dva potproblema. Svaki
od ova cetiri cvora ima oznaku n/4, jer je to vreme potrebno za reavanje svakog od ovih potproblema u nerekurzivnom delu. Ovaj postupak se
Stablo rekurzije
n/4
n/4
2 (n/2) = n
1n = n
n/2
n/2
Jedinice
rada
n/2
n/4
n/4
4 (n/4) = n
n/4
n/2 i
1
i
i
2 (n/2 ) = n
log n + 1
nivoa
n1 = n
5.3. Rekurentne jednacine
131
c,
ako je n = 1
(5.4)
Ukoliko zanemarimo bazni slu aj, rekurentnu jedna inu (5.4) moemo inc
c
terpretirati na slede i na in: da bismo reili problem veli ine n, reavamo
c
c
c
3 potproblema veli ine n/2 i radimo n2 jedinica dodatnog posla. Kada
c
crtamo stablo rekurzije, svaki cvor opet ozna avamo iznosom dodatnog (nec
rekurzivnog) vremena za odgovaraju u veli inu potproblema. Na najviem
c
c
nivou 0, za dodatni posao treba n2 jedinica vremena. Na nivou 1 imamo
tri cvora po (n/2)2 jedinica dodatnog vremena, to za taj nivo daje ukupno
132
Rekurzivni algoritmi
Veli ina
c
problema
Stablo rekurzije
Jedinice
rada
1 n2 = n2
n/2
(n/2)2
(n/2)2
n/4
(n/2)2
3(n/2)2 = (3/4)n2
9(n/4)2 = (3/4)2 n2
3 i (n/2 i )2 = (3/4) i n2
n/2 i
1
3log n c
ukupan broj nivoa jednak log n + 1 (to su nivoi 0, 1, 2, . . ., log n) i broj cvorova
na najniem nivou je jednak 3log n , zbir vremena po svim nivoima stabla je:
T(n) = n2 + (3/4)n2 + (3/4)2 n2 + + (3/4)log n1 n2 + c3log n
= n2
log n1
i =0
(3/4) i + c3log n
(3/4)log n 1
+ c3log n
3/4 1
1 nlog 3 /n2
= n2
+ cnlog3
1/4
= 4n2 4nlog 3 + cnlog3
= n2
= 4n2 + (c 4)nlog3 .
xi =
x m +1 1
,
x1
(x = 1) .
Metod nagadanja
5.3. Rekurentne jednacine
133
u tome da se najpre promiljeno pretpostavi reenje date rekurentne jedna ine, a zatim da se ta pretpostavka potvrdi, obi no indukcijom. Naravno,
c
c
primenom ovog metoda moda moramo da probamo nekoliko reenja dok
ne dobijemo dobru gornju granicu za datu rekurentnu jedna inu. Drugim
c
re ima, ako ne uspevamo da verikujemo aktuelno pretpostavljeno reenje,
c
verovatno treba probati neku funkciju koja bre raste. Ali i ako uspemo u
tome uz relativno malo truda, verovatno treba probati i neku funkciju koja
sporije raste.
Na primer, posmatrajmo slede u rekurentnu jedna inu (gde su a i b
c
c
neke pozitivne konstante):
T(n) =
a,
ako je n = 1
(5.5)
134
Rekurzivni algoritmi
Zato kao drugo reenje za T(n) moramo probati neku funkciju koja bre
c
raste, na primer, T(n) = O n2 . U tom slu aju, da bismo pokazali T(n)
cn2 za neku pozitivnu konstantu c i dovoljno veliko n, moemo uzeti c =
2(a + b) i n 0 = 1 i lako videti da bazni slu aj vai. Za indukcijski korak kada
c
je n > n 0 , ako po indukcijskoj pretpostavci uzmemo da je nae drugo reenje
ta no za vrednosti argumenta manjih od n, tada za argument jednak n
c
imamo:
T(n) = 2T(n/2) + bn log n
n2
+ bn log n
4
n2 c 2
c
+ n
2 2
= cn2 .
2 c
Dakle u ovom slu aju indukcija prolazi. Medutim, poto izgleda da je ovo
c
reenje lako dobiti, proba emo jo jednu (tj. pravu) funkciju koja ne raste
c
tako brzo: T(n) = O n log2 n . Sada, da bismo pokazali T(n) cn log2 n za
neku pozitivnu konstantu c i dovoljno veliko n, moemo uzeti c = a + b i
c
n 0 = 2 i opet lako videti da bazni slu aj vai. Za indukcijski korak kada je
n > n 0 imamo:
T(n) = 2T(n/2) + bn log n
n
n
2 c log2
+ bn log n
2
2
= cn(log2 n 2 log n + 1) + bn log n
cn log2 n 2cn log n + cn + cn log n
= cn log2 n cn log n + cn
= cn log2 n cn(log n 1)
cn log2 n .
Opti metod
Prethodni na ini za reavanje rekurentnih jedna ina zahtevaju odrec
c
deno matemati ko predznanje (recimo, primenu indukcije) da bi se mogli
c
5.3. Rekurentne jednacine
135
slu aja i neposredno daje reenje u svakom od njih. Ovaj opti metod sadri
c
formulu na osnovu koje se moe odrediti asimptotsko reenje velike klase
rekurentnih jedna ina u obliku:
c
T(n) = aT(n/b) + f (n) ,
gde su a 1 i b > 1 konstante, a f (n) je asimptotski pozitivna funkcija.
Ovaj oblik rekurentne jedna ine opisuje vreme izvravanja rekurzivnog
c
algoritma u kome se problem veli ine n deli u a nezavisnih potproblema
c
veli ine najvie n/b svaki, zatim reava svaki od ovih potproblema rec
kurzivno i, na kraju, kombinuju reenja ovih potproblema u reenje celog
problema. Ukupno vreme za deljenje polaznog problema u potprobleme i
za kombinovanje njihovih reenja je izraeno funkcijom f (n). Prema tome,
ovo je zaista opti oblik za rekurentne jedna ine rekurzivnih algoritama.
c
Opti metod zahteva prepoznavanje tri slu aja u jednoj teoremi, ali se
c
zato reenje mnogih rekurentnih jedna ina dobija prili no lako i cesto se
c
c
svodi samo na ispisivanje odgovora. Odgovaraju i slu aj na osnovu koga
c
c
se dobija reenje prepoznaje se poredenjem funkcije f (n) sa specijalnom
c
funkcijom nlogb a . Pomenutu teoremu medutim ne emo navoditi u njenoj
punoj optosti, jer je prili no tehni ke prirode i ima vie teorijski zna aj.
c
c
c
c
U praksi se ce e koristi njena pojednostavljena verzija u kojoj je f (n) u
sutini polinomska funkcija po n.
T EOREMA Neka je nenegativna funkcija T(n) denisana rekurentnom jedna inom
c
d,
n n0
T(n) =
k
aT(n/b) + cn , n > n 0
gde je n 0 1 celobrojna konstanta, a a 1, b > 1, c > 0, d > 0 i k 0 su
realne konstante.
Slucaj 1: Ako je a = b k , tada je T(n) = n k log n .
136
Rekurzivni algoritmi
= a aT n/b2 + f (n/b) + f (n)
= a2 T n/b2 + a f (n/b) + f (n)
= a3 T n/b3 + a2 f n/b2 + a f (n/b) + f (n)
.
.
.
= alogb n T(1) +
= nlogb a d +
logb n1
a i f n/b i
i =0
logb n1
a i f n/b i ,
i =0
logb n1
i =0
= dnlogb a + cn k
a i c n/b i
logb n1
i =0
bk
teoreme cemo pokazati posmatranjem slu ajeva za vrednost koli nika a/b k .
c
c
Prvo, ako je a = b k , tj. k = log b a, onda je
T(n) = dn k + cn k logb n = n k log n .
Drugo, ako je a = b k , onda je
T(n) = dn
logb a
+ cn
a/b k
logb n
a/b k 1
Dakle, ako je a < b k , odnosno k > logb a i 0 < a/b k < 1, onda je
T(n) = dnlogb a + cn k (1) = n k ,
m
i
i =0 x
U tre em slu aju, ako je a > b odnosno a/b k > 1, poto za x > 1 imamo
c
c
m
i
m
i=0 x = (x ), dobijamo:
T(n) = dnlogb a + cn k a/b k
logb n
5.3. Rekurentne jednacine
137
= dnlogb a + cn k
= n
logb a
nlogb a
nk
Naalost, ova jedna ina nije u onom obliku u kojem moemo primeniti
c
opti metod. Medutim, tu jedna inu moemo transformisati u eljeni oblik
c
cina cemo pokazati na problemu mnoenja dva velika n-bitna cela broja.
Pretpostavimo da je broj bitova n vrlo veliki (recimo, n > 100), tako da se
celi brojevi ne mogu direktno pomnoiti u aritmeti koj jedinici standardnih
c
ra unara. Drugim re ima, ne moemo pretpostaviti da uobi ajene aritmec
c
c
ti ke operacije nad velikim celim brojevima predstavljaju jedini ne operac
c
cije koje se izvravaju za konstantno vreme. O igledno, to vreme zavisi
c
od broja bitova u reprezentaciji velikih celih brojeva u binarnom sistemu.
138
Rekurzivni algoritmi
i Y = C2n/2 + D .
Y=
63852
42189
X=
19001
32000
(5.6)
5.3. Rekurentne jednacine
139
(5.6), ukupno moramo obaviti cetiri mnoenja n/2-bitnih celih brojeva (proizvodi AC, AD, BC i BD u formuli), tri sabiranja celih brojeva od najvie
2n bitova (to odgovara znakovima + u formuli) i dva pomeranja brojeva
od otprilike n bitova (mnoenje sa 2n i 2n/2 u formuli). Poto vreme za
svako od ovih sabiranja i pomeranja brojeva iznosi O(n), vreme izvravanja rekurzivnog algoritma za mnoenje T(n) moemo opisati rekurentnom
jedna inom:
c
c,
n=1
T(n) =
4T(n/2) + cn, n > 1 ,
za neku konstantu c.
Da bismo reili ovu rekurentnu jedna inu, moemo primeniti pojednoc
stavljenu optu teoremu za a = 4, b = 2 i k = 1. Poto nam to daje prvi slu aj
c
log2 4
2
= n . Naalost, ovo nije
teoreme, odmah dobijamo da je T(n) = n
nita bolje od uobi ajenog algoritma za mnoenje.
c
Na osnovu opteg metoda ipak moemo ste i uvid u to kako da ubrzamo
c
rekurzivni algoritam. Ako bismo nekako uspeli da smanjimo broj rekurzivnih poziva a, tada bismo dobili sporiju specijalnu funkciju nlogb a koja
u estvuje u reenju rekurentne jedna ine, odnosno vremenu izvravanja.
c
c
Moda zvu i iznenaduju e ako kaemo da to zaista moemo posti i, ali
c
c
c
(5.7)
Mora se priznati da zaista deluje cudno zato se posmatra ba ovaj proizvod, ali uporeduju i formulu (5.6) vidimo da proizvod (5.7) u razvijenoj
c
formi sadri zbir dva meduproizvoda koji treba da izra unamo (AD + BC),
c
140
Rekurzivni algoritmi
(5.8)
c,
n=1
3T(n/2) + cn,
n > 1.
dva n-bitna cela broja po formuli (5.8) ostavljamo citaocima za laku vebu.
Zadaci
1. Jedna igra sa etonima se sastoji od ukupno n etona podeljenih u nekoliko grupa. Pretpostavlja se da je broj etona n neki stepen broja 2 i
da je broj grupa u koje su etoni podeljeni proizvoljan. Jedan potez ove
igre se sastoji od toga da se najpre biraju dve grupe etona A i B i zatim
ako grupa A ima a etona i grupa B ima b etona i ako je, recimo, a b,
premeta se b etona iz grupe A u grupu B. Cilj igre je da se odredenim
nizom ovakvih poteza svi etoni premeste u samo jednu grupu na kraju.
Navedite algoritam kojim se reava problem ove igre i odredite njegovo
vreme izvravanja (tj. broj poteza) izraeno u funkciji broja etona n.
2. Napiite algoritam partition za sortiranje razdvajanjem kojim se za
5.3. Rekurentne jednacine
141
1, ako x i poznaje x j
0, ako x i ne poznaje x j
0 1
1 1
142
Rekurzivni algoritmi
n<3
1,
2
4T(n/3) + n ,
n3
koriste i metod
c
a) viestruke zamene;
b) stabla rekurzije;
c) opte teoreme.
11. Posmatrajmo slede i algoritam koji izra unava proizvod dva nenegac
c
tivna cela broja x i y:
// Ulaz: celi brojevi x 0 i y 0
// Izlaz: x y
5.3. Rekurentne jednacine
143
algorithm multiply(x, y)
p = 0;
while (x > 0) do
if (x % 2 != 0) then
p = p + y;
x = x / 2;
y = 2 * y;
// p = x y
// x je neparan
return p;
144
Rekurzivni algoritmi
i
B n (x) = b n x n + b n1 x n1 + + b 1 x + b 0 .
G LAVA
6
Stabla
Stablo je nelinearna struktura podataka koja predstavlja hijerarhijski odnos izmedu elemenata. Dobro poznati primeri strukture stabla iz
6.1
Korenska stabla
panju posvetiti ovim optim stablima, nego njihovoj ograni enoj verziji
c
koja se nazivaju binarna stabla. Ipak radi potpunosti, pojmove u vezi
sa stablima navodimo u optijem slu aju korenskih stabala (ili stabala sa
c
korenom). Korensko stablo se sastoji od skupa elemenata koji se nazivaju
cvorovi, kao i skupa uredenih parova razli itih cvorova povezanih linijama
146
Stabla
hijske strukture koju cini stablo. Na slici 6.1 je prikazan primer korenskog
v1
v3
v2
v6
v7
v5
v4
v8
v9
v10
v11
stablima. Pre svega, jedna grana stabla je ureden par dva razli ita cvora x i
c
y. U tekstu se ta grana ozna ava sa (x, y), a na crteima linijom koja spaja
c
paru koji predstavlja granu. Ipak se radi lakeg crtanja koristi linija za
cvor na crteima uvek prikazuje iznad drugog cvora. Tako se na slici 6.1
podrazumeva da je, recimo, (v2 , v7 ) grana stabla, a ne obrnuto.
Terminologija u vezi sa stablima je uglavnom pozajmljena iz njihove
primene u predstavljanju rodoslova neke porodice, gde se granama uspo
stavlja medusobni odnos roditelj-dete izmedu pojedinih clanova porodice.
Cvor u stablu moe imati nula ili vie dece, ali svaki cvor razli it od
c
korena ima ta no jednog roditelja i koren stabla je jedini cvor bez roditelja.
c
Ova osobina je upravo ona koja karakterie stablo i koristi se za formalnu
147
1. Ako je T neprazno stablo, ono ima jedinstven poseban cvor (koren) koji
r1
r2
T2
T1
rk
Tk
brojni. Deca istog cvora (tj. cvorovi sa zajedni kim roditeljem) nazivaju se
c
bra a (sestre). Cvorovi koji imaju bar jedno dete su unutranji, a cvorovi
c
c
primer, u stablu na slici 6.1 cvorovi v2 , v3 , v4 i v5 su bra a, a svi listovi tog
stabla su v3 , v6 , v7 , v8 , v9 i v11 .
Pojam puta u stablu je na neki na in uoptenje pojma grane. Put
c
od korena do tog cvora. Da bismo ovo pokazali, lako je najpre videti da uvek
148
Stabla
cvora najpre razdvoje i zatim ponovo spoje u bar jednom zajedni kom cvoru
c
y (ina e bi divergirali i jedan od puteva nikad ne bi stigao do x). Ali to bi
c
njegovog korena. Na primer, visina stabla na slici 6.1 je tri, a visina cvora
v5 je dva i njegova dubina je jedan.
odredivanje deteta datog cvora, moemo imati i operacije koje kao rezultat
daju roditelja, sasvim levog deteta ili desnog brata datog cvora. Radi lakeg
programiranja korisno bi bilo realizovati i upitne operacije koje odreduju
149
sli no. Najzad, treba imati na umu i pomo ne operacije koje obuhvataju
c
c
podaci koje cvorovi u stvarnosti moda sadre. Najprirodnija reprezentacija stabla, koja najo iglednije odraava njegovu logi ku strukturu, bila bi
c
c
da se svaki cvor stabla predstavlja objektom koji obuhvata polje klju a, vie
c
stablima, odnosno broj dece po cvoru moe biti vrlo razli it i nije unapred
c
ograni en, ovaj pristup nije najbolji jer proizvodi loe iskori enje memoc
c
rijskog prostora. Zato se obi no koriste dva druga na ina za predstavljanje
c
c
optih stabala o kojima govorimo u nastavku.
formiranje povezane liste dece svakog cvora. Ovaj pristup je vaan, jer se
moe lako generalizovati za predstavljanje sloenijih struktura kao to su
150
Stabla
2
5
6
5
10
7
8
9
10
10
Kao to se vidi sa slike 6.4, u ovoj reprezentaciji stabla imamo jedan niz
jednaka ukupnom broju cvorova u stablu. Pored toga, svaki element niza
to svako stablo ima svoj niz pokaziva a za svoje cvorove. Prema tome, da
c
bismo napravili novo stablo, recimo, od datog cvora kao korena i dva data
c
podstabla T1 i T2 , morali bismo da kopiramo T1 i T2 u tre e stablo i da
reprezentaciji svaki cvor pored klju a sadri samo jo dva pokaziva a: jec
c
dan pokazuje na njegovog sasvim levog deteta i drugi na njegovog desnog
brata. Naravno, ovi pokaziva i imaju specijalnu vrednost null ukoliko
c
151
Binarno stablo je stablo u kojem nijedan cvor nema vie od dvoje dece.
Ova deca se zovu levo dete i desno dete, poto se na crteima prikazuju levo
kojem svaki cvor ili nema decu, ili ima samo levo dete, ili ima samo desno
dete, ili ima i levo i desno dete.
Obratite panju na to da pojam binarnog stabla nije isti kao za obi no
c
stablo koje smo denisali u prethodnom odeljku, jer svako dete u binarnom
stablu mora biti levo dete ili desno dete. Ovo zapaanje je ilustrovano na
slici 6.6, gde imamo dva razli ita binarna stabla i jedno obi no stablo koje
c
c
izgleda vrlo sli no ovim binarnim stablima.
c
Primetimo da stabla pod (a) i (b) na slici 6.6 nisu ista binarna stabla,
niti je neko od njih uporedivo sa obi nim stablom pod (c). Na primer, u
c
binarnom stablu pod (a) cvor 2 je levo dete cvora 1, a cvor 1 nema desno
vor 1 nema levo dete ali ima cvor 2 kao
levo ili desno dete cvor 2 je samo dete cvora 1, niti levo niti desno.
152
Stabla
1
2
4
5
(a)
(b)
(c)
u kojoj je svaki cvor predstavljen jednim objektom. Taj objekat ima polje
klju, koje sadri klju cvora, kao i dva pokaziva ka polja levo i desno,
c
c
c
koja pokazuju na objekte koji predstavljaju levo i desno dete cvora. Ako
neko dete nije prisutno, odgovaraju e pokaziva ko polje sadri vrednost
c
c
null. Stablu T se kao celini pristupa preko posebnog spoljanjeg pokac
ziva a t koji nije deo stabla i koji pokazuje na koren stabla. Ovaj na in
c
predstavljanja binarnog stabla je ilustrovan u desnom delu na slici 6.7 za
stablo koje je prikazano u levom delu.
t
levo
desno
klju
c
2
3
2
4
153
koja se izvrava nad podacima (klju evima) svih cvorova binarnog stabla.
c
Ta operacija se neutralno naziva obilazak binarnog stabla i sastoji se kre
tanja du grana stabla od cvora do cvora radi sistemati nog pose ivanja
c
c
vorova stabla kako se neki cvor ne bi ponovio. Konkretna aktivnost
svih c
koja se obavlja nad podacima u cvoru v prilikom njegovog pose ivanja zac
visi od primene operacije obilaska stabla i moe obuhvatati sve od samog
cvora v.
Tri naj e a sistemati na postupka za obilazak binarnog stabla T od
c c
c
njegovog korena jesu obilazak cvorova u preorder, inorder i postorder redosledu. Oni se razlikuju samo po redosledu po kojem se pose uju naredni
c
cvor i njegovo levo i desno podstablo. Na slici 6.8 su ilustrovana ova tri
na ina tako to je brojevima 1, 2 i 3 ozna en redosled po kojem se pose uju
c
c
c
3
T
Td
preorder
3
T
Td
inorder
2
T
Td
postorder
inorder obilazak cvorova stabla T sastoji se najpre od rekur vorova stabla T u inorder redosledu, zatim
zivnog obilaska c
154
Stabla
preorder:
inorder:
7, 4, 8, 2, 5, 9, 1, 6, 3
postorder:
1, 2, 4, 7, 8, 5, 9, 3, 6
7, 8, 4, 9, 5, 2, 6, 3, 1
cvor prikazuje njegov klju . Algoritmi za ostala dva na ina obilaska binarc
c
Obratite panju na to da je rekurzivni algoritam bt-inorder neposredna implementacija rekurzivne denicije inorder obilaska binarnog sta
bla. Pri tome, obrada svakog cvora prilikom njegovog pose ivanja sastoji
c
se od prostog prikazivanja klju a cvora.
c
155
c
algoritam bt-inorder poziva ta no dva puta za svaki cvor stabla jednom
za njegovo levo dete i jednom za njegovo desno dete. Poto se deo algoritma
bt-inorder koji ne obuhvata ove rekurzivne pozive izvrava za konstantno
vreme, ukupno vreme izvravanja bi e 2n O(1) = O(n).
c
Ovo je dobra prilika da se osvrnemo i na na stil programiranja.
6.3
slede e BSP svojstvo: svi cvorovi u levom podstablu cvora v imaju klju eve
c
c
156
Stabla
c
c
u cvor u levom podstablu cvora v, onda je v.klju > u.klju; a ako je
c
c
w cvor u desnom podstablu cvora v, onda je v.klju < w.klju. (Ovde
pretpostavljamo pojednostavljen slu aj da su svi klju evi razli iti.)
c
c
c
Obratite panju na to da u binarnom stablu pretrage implicitno podra
zumevamo da se klju evi cvorova mogu medusobno uporedivati. To zna i
c
c
da klju evi pripadaju nekom totalno uredenom skupu, tj. skupu nad cijim
c
elementima je denisana relacija manje od. Primeri ovih skupova obuhvataju skupove celih i realnih brojeva sa uobi ajenom relacijom poretka
c
brojeva, kao i skup znakovnih stringova sa leksikografskim poretkom.
Na slici 6.10 su prikazana dva binarna stabla pretrage koja sadre isti
skup vrednosti klju eva. Kao to cemo videti, vreme izvravanja ve ine
c
c
operacija nad binarnim stablom pretrage je proporcionalno visini stabla.
U tom smislu, desno stablo na slici 6.10 je manje ekasno.
3
7
5
3
5
8
8
9
BSP operacije
Tipi ne operacije nad binarnim stablom pretrage su traenje, dodavac
157
Prvi, najlaki slu aj je ako je klju korena stabla T jednak x, jer smo
c
c
onda nali traeni cvor i moemo zavriti pretragu. U drugom slu aju, ako
c
je klju korena stabla T ve i od x, prema BSP svojstvu moemo zaklju iti
c
c
c
Ovaj neformalni opis operacije traenja cvora u binarnom stablu pretrage preciziran je rekurzivnim algoritmom bst-search u nastavku. Ako
c
c
c
algoritam bst-search kao rezultat vra a pokaziva na cvor sa klju em
slu aju, ukoliko takav cvor ne postoji, ovaj algoritam vra a pokaziva null.
c
c
c
// Ulaz: vor t binarnog stabla pretrage, klju x
c
c
// Izlaz: pokaziva na vor sa kljuem x, ili null
c
c
c
algorithm bst-search(t, x)
if ((t == null) || (t.klju == x)) then
c
return t;
else if (t.klju > x) then
c
bst-search(t.levo, x);
else
bst-search(t.desno, x);
21
11
9
7
18
23
15
13
16
158
Stabla
Dodavanje cvora. Operacija dodavanja (kao i uklanjanja) cvora modikuje binarno stablo pretrage tako da moramo paziti da ne naruimo BSP
prema proceduri traenja klju a dolazimo do cvora koji nema levo ili desno
c
je T prazno stablo, ono postaje stablo koje se sastoji samo od novog cvora
c
c
p. Ako stablo T nije prazno, a njegov koren ima klju jednak klju u cvora
p, tada se p ve nalazi u stablu i zato nita dodatno ne treba uraditi. Sa
c
druge strane, ako stablo T nije prazno i njegov koren nema isti klju kao
c
159
kao u slu aju traenja cvora. Taj put se zavrava u cvoru cije levo ili desno
c
dete treba da bude novi cvor. Stoga, ba kao u slu aju operacije traenja
c
23
11
27
21
19
22
25
c
c
c
U algoritmu bst-insert se sre emo sa jednom tehni kom poteko om
koja se sastoji u tome to kada novi cvor treba zameniti umesto trenutno
160
Stabla
aurira. Kod svih ostalih cvorova algoritam vra a isti pokaziva koji je
c
c
p spoljanji c
17
23
11
10
je
je
iz
iz
21
19
27
22
23
11
25
21
20
27
22
25
20
cemo time prekinuti strukturu stabla. Zbog toga, stablo se mora restruk
turirati tako da cvor p bude uklonjen, ali i da BSP svojstvo za preostale
slu aja. U prvom slu aju, kada cvor p ima samo jedno dete q, cvor p
c
c
moe se zameniti tim detetom. Preciznije, dete q se povezuje tako da bude
novo dete roditelja cvora p umesto starog deteta cvora p. Ova opta
transformacija binarnog stabla pretrage je ilustrovana na slici 6.14.
161
17
23
11
21
10
19
27
22
23
11
25
10
21
20
27
22
25
20
U drugom slu aju, kada unutranji cvor p ima dvoje dece, jedan nac
<p
<q
>p
q
>q
>q
q
>q
od cvora p, kao i bilo koji drugi cvor iz desnog podstabla cvora p. Dakle,
162
Stabla
17
19
23
11
10
5
27
21
19
22
25
23
11
10
27
21
20
22
25
20
za uklanjanje cvora koji je bez dece ili ima samo jedno dete.
// Ulaz: vor t binarnog stabla pretrage
c
// Izlaz: uklonjen najmanji vor p iz podstabla sa korenom t
c
algorithm bst-deletemin(t)
if (t.levo == null) then
p = t;
return t.desno;
else
t.levo = bst-deletemin(t.levo);
return t;
taj cvor pokaziva p.levo jednak null. Slika 6.18 sugerie zato je taj
c
163
t
>p
p
>p
pretrage i prelazi odreden put niz stablo da bi se najpre naao cvor koji
raju i postupak zavisno od broja njegove dece. Najgori slu aj je kada cvor
c
c
za uklanjanje ima dvoje dece, jer se tada u algoritmu prelazi dodatni put
164
Stabla
koji se uklanja. U svakom slu aju dakle, put koji se prelazi nije dui od
c
koji vijugaju levo ili desno kod nekih unutranjih cvorova. Na slici 6.19 su
prikazana dva primera ovih najgorih scenarija.
165
U praksi nije cest nijedan od ova dva slu aja, pa se moe postaviti pitac
nje ta je tipi an slu aj izmedu ova dva ekstrema? To jest, da li je tipi no
c
c
c
cvorovi mogu nedostajati, svi postoje i cvorovi moraju biti levo od onih
c
koji nedostaju. Na slici 6.21 su prikazani opti oblik i konkretan primer
kompletnog binarnog stabla.
1
11 10
je klju svakog cvora manji od klju eva dece tog cvora. Drugim re ima,
c
c
c
166
Stabla
v.klju < u.klju i v.klju < w.klju. Ovo svojstvo se naziva hip
c
c
c
c
svojstvo.
toga, najmanji cvor (tj. cvor sa minimalnim klju em) mora biti koren hipa,
c
max-hipove kod kojih je klju svakog cvora ve i od klju eva njegove dece.
c
c
c
Nema nita posebno to izdvaja min-hipove u odnosu na max-hipove. Oba
oblika hipova se ravnopravno koriste u praksi i sva zapaanja uz o igledne
c
izmene vae u oba slu aja.
c
Hip operacije
njegovog klju a), dodavanje novog cvora u hip, kao i stvaranje hipa od
c
prona i, jer smo zapazili da taj cvor mora biti koren stabla. Medutim,
c
ako prosto uklonimo koren, vie ne emo imati stablo. Zbog toga moramo
c
nekako na i novi klju za koren tako da stablo i dalje bude skoro puno, ali i
c
c
da hip svojstvo ne bude narueno. Ovo obezbedujemo slede im postupkom
c
167
Preciznije, pretpostavimo da je x aktuelni cvor koji naruava hip svojstvo. To zna i da je x ve i od jednog ili oba svoja deteta. Klju cvora
c
c
c
x moemo zameniti klju em jednog od njegova dva deteta, ali pri tome
c
moramo biti paljivi. Ako x zamenimo sa manjim od njegova dva deteta,
sigurno ne emo naruiti hip svojstvo izmedu dva ranija deteta, od kojih je
c
10
11 10
zameniti
stari koren
11
spustiti
novi koren
10
11
za vreme O(log n) ukoliko hip ima n cvorova. Ovo sledi otuda to se postupak potiskivanja privremenog klju a korena ponavlja najvie h puta, gde je
c
h visina stabla. A poto je h log (n + 1) u kompletnom binarnom stablu od
sobno zamenjuju novi klju aktuelnog cvora i klju roditelja tog cvora, ako
c
c
roditelj ima manji klju . Ovo zamenjivanje se ponavlja sve dok novi klju
c
c
ne dode ili do korena ili do cvora ciji roditelj ima manji klju . Na slici 6.23
c
168
Stabla
1
11 10
podi i
c
novi cvor
11 10
cvorova.
Konstruisanje hipa. Pretpostavimo da je dato kompletno binarno sta
blo ciji su cvorovi proizvoljno razmeteni tako da njihovi klju evi ne zadoc
voljavaju hip svojstvo. Operacija konstruisanja hipa sastoji se od preuredi
vanja klju eva tog stabla tako da ono na kraju bude hip.
c
Jedan o igledan na in da se ovo postigne je da se po ne od praznog
c
c
c
stabla jedan po jedan. (Pri tome se, recimo, cvorovi datog stabla uzimaju
tokom obilaska tog stabla jednim od tri standardna metoda.) Kako svaka
operacija dodavanja cvora u hip proizvodi stablo koje je takode binarni hip,
cvorova njegovo vreme izvravanja bilo O(n log n). To je zato to se njime
cemo vie govoriti u narednom odeljku koje je posve eno jednoj konkretnoj
c
realizaciji binarnog hipa.
169
korena, tre i element niza sadri desno dete korena, cetvrti element niza
c
sadri levo dete levog deteta korena i tako dalje. Primer ovakve reprezen
tacije hipa sa 10 cvorova pomo u niza a je prikazan na slici 6.24.
c
a[1]
a[2]
a[4]
a[8]
a[3]
a[5]
a[9]
a[6]
a[7]
a[10]
U optem slu aju dakle, ako za i 1 postoji levo dete cvora a[i], ono je
c
predstavljeno elementom a[2*i], a njegovo desno dete, ako postoji, predstavljeno je elementom a[2*i+1]. Ekvivalentna interpretacija je da se
170
Stabla
// a j je roditelj vora a i
c
vremeni cvor prosejava kroz stablo do svog pravog mesta u stablu. Naredni rekurzivni algoritam predstavlja realizaciju tog postupka prosejavanja
171
citaocima za vebu.
Bolji pristup je da se postupno konstruiu sve ve i hipovi po inju i od
c
c
c
oni cvorovi koji se nalaze na prvom nivou iznad prethodnog. Za ovaj korak
je opet potrebno prosejati samo korene ovih podstabala. To je dovoljno
poto su njihova leva i desna podstabla ve formirani hipovi. Nastavljaju i
c
c
ovaj postupak nivo po nivo i idu i nagore dok se ne dode do globalnog
c
172
Stabla
4. korak
prosejati
3. korak
prosejati
2. korak
prosejati
1. korak
prosejati
10
prosejati
reavanjem neke rekurentne jedna ine o cemu smo govorili u odeljku 5.2.
c
173
slede em gornjem nivou, koji ima 2h2 cvorova, za svaki od njegovih cvoc
rova se algoritam heap-siftdown poziva najvie tri puta, poto se tada
prosejavaju koreni podstabala visine dva. Nastavljaju i rezonovanje na
c
ovaj na in, zaklju ujemo da se na nultom nivou korena celog stabla algoric
c
tam heap-siftdown poziva najvie h + 1 puta, poto se na kraju prosejava
ovaj koren citavog stabla koje ima visinu h. Na slici 6.26 je ilustrovana ova
argumentacija tako to su prikazani delovi niza a i odgovaraju i brojevi
c
n/16 n/8
n/4
n/2
Prema tome, ukoliko sa S(h) ozna imo ukupan broj poziva algoritma
c
heap-siftdown za puno binarno stablo visine h, onda je:
h +1
i =1
2 h +1 i i
= 2 h +1
h +1
i =1
2i
Da bismo ograni ili poslednji zbir, ograni i emo njegovu beskona nu varic
cc
c
jantu 1 (i/2 i ):
i=
i =1
2i
1 2 3 4
+ + +
+
2 4 8 16
174
Stabla
1 1
1 1 1
1
1
1
1
1
+
+
+
+ +
+
+
+
+
+ .
2
4 4
8 8 8
16 16 16 16
i
i =1 2
i zato
h +1
i =1
2i
i
i =0 2
i =1
2i
=2 ,
=2 .
to je trebalo pokazati.
6.5
Primene stabala
175
Redovi sa prioritetima
Red za cekanje sa prioritetima elemenata predstavlja strukturu podataka u kojoj je svakom elementu ove strukture pridruena odredena
vanost i zato se klasikuju prema svom prioritetu. Najvii prioritet verovatno imaju sistemski procesi kao to su upravlja ki programi za tastaturu
c
ili mrenu karticu. Zatim po vanosti dolaze korisni ki procesi u kojima se
c
izvravaju interaktivne aplikacije. Na kraju dolaze pozadinski procesi kao
to su neki program za pravljenje rezervnih kopija datoteka ili program za
neko duga ko izra unavanje koji je namenski predviden da radi sa niskim
c
c
prioritetom.
Svaki proces u sistemu se zato predstavlja jednim objektom koji pored
ostalih polja koja blie opisuju proces sadri jo dva polja: jedno celobrojno
polje za identikacioni broj procesa i jedno celobrojno polje za prioritet
procesa. Operativni sistem sa deljenjem vremena rasporeduje ove procese
176
Stabla
Q su:
1. Operacija dodavanja pq-insert(Q,x) kojom se se u red sa prioritetima Q dodaje novi element x.
2. Operacija uklanjanja pq-deletemin(Q) kojom se u redu sa prioritetima Q najpre pronalazi element najnieg prioriteta, a zatim se taj
element uklanja iz reda Q i kao dodatni rezultat vra a se prioritet
c
tog najmanjeg elementa.
Jedan ekasan na in za implementaciju reda sa prioritetima je pomo u
c
c
binarnog hipa o kome smo govorili u odeljku 6.4. Osnovne operacije dodavanja i uklanjanja elemenata za red sa prioritetima odgovaraju bez izmena algoritmima heap-insert i heap-deletemin, odnosno operacijama
dodavanja i uklanjanja elemenata za binarni hip. Primetimo i da je vreme
izvravanja ovih operacija logaritamsko, odnosno O(log n) za red sa prioritetima od n elemenata.
U praksi je struktura podataka reda sa prioritetima obi no sloenija
c
zbog toga to treba obezbediti dodatne operacije za sloenije algoritme koji
koriste neki red sa prioritetima. Nepotpun spisak ovih dodatnih operacija
je:
pq-make(Q,a): formirati red sa prioritetima Q od datih elemenata u
nizu a.
pq-changekey(Q,x,p): promeniti prioritet datog elementa x u redu
sa prioritetima Q tako da bude jednak p.
pq-delete(Q,x): ukloniti dati proizvoljni element x iz reda sa prioritetima Q.
Ako se podsetimo strukture podataka binarnog hipa iz odeljka 6.4, moemo primetiti da se sve ove dodatne operacije mogu ekasno realizovati
ukoliko je red sa prioritetima predstavljen binarnim hipom u obliku niza.
Naime, da bismo konstruisali red sa prioritetima od datih elemenata, moemo iskoristiti algoritam heap-make koji se izvrava za linearno vreme.
Da bismo promenili prioritet datog elementa koji se nalazi negde unutar
binarnog hipa, moemo iskoristiti algoritam heap-siftdown za njegovo pomeranje nadole ako mu se prioritet pove ava, ili algoritam heap-bubbleup
c
za njegovo pomeranje navie ako mu se prioritet smanjuje. Da bismo uklonili proizvoljni element iz binarnog hipa, moemo primeniti postupak sli
can onom koji se koristi za uklanjanje minimalnog elementa. Obratite
panju na to da u svim ovim operacijama dolazi do zamenjivanja elemenata
du jednog puta u hipu, u najgorem slu aju od vrha hipa pa sve do njegovog
c
177
logaritamsko.
Disjunktni skupovi
U nekim primenama je potrebno da podaci budu organizovani u vie
grupa pri cemu su vane dve operacije: jedna kojom se odreduje kojoj grupi
pripada neki podatak i druga kojom se objedinjuju dve date grupe u jednu.
U tim slu ajevima dolazi do izraaja struktura podataka disjunktnih skuc
pova.
Apstraktna struktura podataka disjunktnih skupova predstavlja n elemenata grupisanih u kolekciju od najvie n disjunktnih skupova. Svaki
skup u kolekciji sadri dakle medusobno razli ite elemente koji su objekti
c
istog tipa. Ekasne operacije potrebne za rad sa ovom strukturom podataka su:
Konstruisanje skupa od jednog elementa. Operacijom ds-make(x)
178
Stabla
Predstavljanje disjunktnih skupova pomocu stabala. Jedan ekasan na in za predstavljanje disjunktnih skupova je pomo u kolekcije (opc
c
tih) korenskih stabala, pri cemu svaki cvor stabla predstavlja jednog clana
nekog skupa i svako stablo predstavlja jedan skup iz kolekcije. U svakom
stablu ove reprezentacije jedan cvor sadri, pored elementa skupova koga
predstavlja, jo samo pokaziva na svog roditelja. Skup koga neko stablo
c
predstavlja identikuje se preko predstavnika koji se nalazi u korenu tog
stabla. Na slici 6.27 je ilustrovana ovakva reprezentacija za kolekciju
disjunktnih skupova {a, b, c, d }, { e, f , g}, { h, i, j } i { k}.
e
c
h
i
k
j
c
U algoritmu ds-find(x) se prate roditeljski pokaziva i od cvora x
dok se ne dode do korena stabla. Za identikaciju (predstavnika)
mati nog skupa cvora x vra a se kao rezultat element koji se nalazi
c
c
u korenu stabla.
U algoritmu ds-union(x,y) se objedinjuju dva disjunktna skupa
predstavljena pomo u dva stabla sa korenima x i y tako to se koren
c
stabla manje visine vezuje za koren stabla ve e visine. Drugim rec
179
lobrojno polje h za visinu tog cvora. Pored toga, svaki cvor x sadri polje
klju u kome se nalazi odgovaraju i element skupa, kao i polje p u kome
c
c
c
Kada se operacijom ds-make konstruie stablo od jednog cvora, po etna
180
Stabla
porcionalno najvie logaritmu broja cvorova u datom stablu. Ova logaritamska granica visine nekog stabla u kolekciji stabala koja predstavljaju
disjunktne skupove preciznije se izraava na slede i na in.
c
c
c
L EMA Neka je T jedno stablo u kolekciji stabala koje je po etno konstruisano algoritmom ds-make i zatim formirano (viestrukom) primenom algoritma ds-union. Ako je visina stabla T jednaka h, onda T ima bar 2h
cvorova.
T2
T1
181
Zadaci
1. Odogovorite na slede a pitanja u vezi sa stablom na slici 6.29.
c
C
E
F
J
I
M
H
K
S LIKA 6.29.
182
Stabla
c) Binarno stablo je pravilno binarno stablo ako svaki cvor ima nula
ili dvoje dece. Ako takvo stablo ima n cvorova koji nisu listovi,
tada ono ima n + 1 list. Dakle, svako pravilno binarno stablo ima
183
suprotnom slu aju, to je najnii (prvi) predak cvora v cije je levo dete
c
cem redosledu svih klju eva binarnog stabla pretrage T. Koje je vreme
c
izvravanja tog algoritma?
13. Napiite ekasan algoritam koji odreduje k-ti najmanji klju u binarc
c
n cvorova, za k = 1 treba odrediti najmanji klju , za k = n treba odrediti
c
najve i klju , a za k = n/2 treba odrediti klju u sredini sortirane liste
c
c
klju eva u rastu em redosledu.
c
c
14. Za svaku od slede ih sekvenci klju eva odredite binarni hip koji se doc
c
bija kada se ti klju evi dodaju po etno praznom hipu, redom jedan po
c
c
jedan u datom redosledu.
a) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
b) 3, 1, 4, 1, 5, 9, 2, 6, 5, 4.
c) 2, 7, 1, 8, 2, 8, 1, 8, 2, 8.
15. Za svako od binarnih hipova dobijenih u prethodnom zadatku odredite
184
Stabla
a) U kojem redosledu treba izlistati cvorove u drugoj fazi ovog algoritma preorder, inorder ili postorder?
b) Koliko je vreme izvravanja za fazu listanja?
c) Ako je ulazni niz brojeva ve sortiran, koliko je ukupno vreme
c
izvravanja ovog algoritma?
d) Ako se koristi binarni hip umesto binarnog stabla pretrage, koliko
je vreme izvravanja za fazu dodavanja ovog algoritma?
e) Kako treba modikovati fazu listanja u slu aju binarnog hipa?
c
f) Koliko je vreme izvravanja za ovu modikovanu fazu listanja?
18. Napiite algoritam heap-sort(a,n) kojim se niz a od n neuredenih
G LAVA
7
Grafovi
takvu reprezentaciju. Jedan primer je auto-karta na kojoj se gradovi predstavljaju ta kama, a medusobni odnos povezanosti tih gradova putevima
c
186
Grafovi
Graf se dakle sastoji od skupa cvorova i skupa grana koje povezuju neke
NS
ZR
BG
SD
PO
VA
KG
K
CA
NI
KV
cemu svaka grana iz E spaja dva cvora iz V . Graf se ozna ava zapisom
c
187
V = {BG, NS, NI, KG, SD, PO, VA, CA, KV, K, A, ZR, SU} ,
kao i skupa E sa 23 grane:
nazivaju se susedi cvora v. Druga ije re eno, stepen nekog cvora je broj
c
c
stepen cvora SU je 1.
U stvari, prethodne denicije se odnose na neusmerene grafove kao to
je to graf na slici 7.1. Kod takvih grafova grane ozna avaju simetri an
c
c
se cvor u zove po etak i cvor v se zove kraj grane e. Isto tako, u slu aju
c
c
grane e = (u, v), cvor v jeste sused cvora u, ali u nije sused cvora v. Na
188
Grafovi
imati po etak i kraj u istom cvoru. Takva jedna grana, koja se naziva
c
petlja, u grafu na slici 7.2 je grana kod cvora b. Sa druge strane, petlje u
neusmerenim grafovima nisu dozvoljene, jer grana u neusmerenom grafu
ulazni stepen je broj usmerenih grana koje ulaze u cvor v. Stepen cvora u
valentnim jednom usmerenom grafu koji ima isti skup cvorova i ciji se
skup grana dobija tako to se svaka grana { u, v} u neusmerenom grafu
zameni dvema usmerenim granama (u, v) i (v, u). Teorijski dakle neusmereni grafovi su specijalan slu aj usmerenih grafova, pa je dovoljno poc
smatrati samo optije usmerene grafove. Uprkos tome u ovoj knjizi, radi
moe predstaviti neki veb sajt. U tom grafu cvorovi odgovaraju pojedina c
nim veb stranama i postoji grana izmedu cvora u i v ako u ima hiperlink na
svaki susedan par cvorova v i , v i+1 u tom nizu spojen granom u G. Duina
slici 7.1, niz cvorova BG, CA, VA, BG, NS obrazuje put duine 4 od cvora
BG do cvora NS.
Put u grafu je prost ako su svi cvorovi na tom putu medusobno razli iti.
c
prost put ne ra unaju i prvi i poslednji cvor. Graf koji nema nijedan ciklus
c
c
se naziva acikli ki graf.
c
189
izmenu: u putu ili ciklusu svi parovi susednih cvorova moraju biti povezani
c
V V i E E. Drugim re ima, graf H je podgraf grafa G ako su cvorovi
granu) ili za svaki par cvorova u i v u G postoji neki put od u do v. Primetimo da ovo ne zna i da u povezanom grafu postoji grana izmedu svaka dva
c
cvora, ve samo da postoji put (mogu e duga ak) izmedu njih. Primetimo i
c
c
c
da ako postoji u-v put u neusmerenom grafu, onda postoji i v-u put u tom
grafu koji se sastoji od obrnutog niza cvorova u-v puta. Graf na slici 7.1
je primer jednog povezanog grafa. Sa druge strane, graf na slici 7.4 nije
povezan graf, jer ne postoji nijedan put, recimo, izmedu cvorova 1 i 6.
G
1
6
190
Grafovi
Slobodna stabla. Povezan graf koji nema nijedan ciklus naziva se slobodno stablo. Slobodna stabla se razlikuju od korenskih stabala o kojima
smo govorili u poglavlju 6 jedino po tome to su kod slobodnih stabala svi
cvorovi na drugom kraju svih grana koje idu od tog korena, zatim poveu
svi cvorovi svih grana koje idu od prethodnih cvorova (dece korena) i tako
dalje. Slikovitiji na in za razumevanje ovog postupka je da zamislimo da
c
isti parovi cvorova su spojeni granama, ali crte na levoj strani je slobodno
stablo i crte na desnoj strani je to stablo transformisano u korensko stablo
7
2
1
6
191
koji se sastoji od vie stabala, ta nije graf cije sve povezane komponente
c
predstavljaju slobodna stabla sama za sebe, naziva se uma. Na slici 7.6 je
prikazan primer grafa G koji je uma.
G
1
10
7.2
Predstavljanje grafova
192
Grafovi
1
2
3
4
5
1
0
0
1
0
0
2
1
0
1
0
1
3
1
0
0
0
0
4
0
1
0
0
0
5
0
0
1
1
0
1
2
3
4
1
0
1
1
0
2
1
0
1
1
3
1
1
0
1
4
0
1
1
0
da najve i broj grana za usmeren graf sa n cvorova iznosi n2 , dok je taj broj
c
za neusmeren graf jednak n(n 1)/2.
Da bi se reio ovaj problem za retke grafove, koristi se alternativna
reprezentacija grafova pomo u listi susedstva. Ova reprezentacija ima nec
koliko varijacija, a u najprostijem obliku se graf predstavlja jednim nizom
193
tako predstaviti pomo u jednog niza a veli ine n, pri cemu element a i
c
c
2
3
1
2
morijski prostor veli ine (n). Duine listi susedstva zavise od cvora do
c
194
Grafovi
ra una svaka grana, taj zbir je 2m. Drugim re ima, ukupna duina svih
c
c
listi susedstva je 2m, odnosno memorijski prostor za sve liste susedstva je
veli ine (2m) = (m).
c
Veli ina memorijskog prostora (n + m) za niz listi susedstva je mnogo
c
c
manja od (n2 ) za matricu susedstva u slu aju retkih grafova. Sa druge
strane, treba imati u vidu da potencijalni nedostatak reprezentacije nizom
listi susedstva moe biti vreme od (n) koje je potrebno za proveravanje
da li postoji odredena grana izmedu dva cvora, jer moe biti (n) cvorova
do cvora t? Ovo prosto pitanje o tome da li postoji put izmedu dva cvora
mnogim primenama grafova potrebno je prona i put izmedu dva cvora koji
c
Zbog toga se uvodi pojam rastojanja izmedu dva cvora u grafu koje
c
varati geografskom zna enju tog pojma dva cvora mogu biti na kratkom
rastojanju u grafu iako predstavljaju ta ke koje geografski mogu biti vrlo
c
udaljene.
195
Pretraga u irinu
Moda najprostiji algoritam za odredivanje s-t povezanosti u grafu je
dobio svoje ime po tome to se, polaze i od cvora s, ide to ire u grafu
c
iz prvog talasa. Tre i talas se sastoji od svih novih cvorova koji su spojeni
c
1
3
2
5
8
6
9
11
Talas W1 : 2, 3, 4
4
7
10
Talas W2 : 5, 6
Talas W3 : 8, 9, 10, 7
Talas W4 : 11
c
Talas W0 se sastoji od po etnog cvora s.
196
Grafovi
Pored toga, neki cvor se ne nalazi ni u jednom talasu pretrage u irinu ako
grafa G otkriva sve cvorove komponente grafa G koja sadri po etni cvor s.
c
se na ispitivanju suseda cvorova radi konstruisanja talasa otkrivenih cvorova. Zbog toga je za ekasnu algoritamsku realizaciju pretrage u irinu
idealna reprezentacija grafa nizom listi susedstva, jer ove liste upravo
W[0] = s;
p[s] = true;
i = 0;
197
while (W[i] != ) do
// prethodni talas Wi nije prazan
W[i+1] = ;
// naredni talas Wi+1 je poetno prazan
c
for (svaki vor u u talasu Wi ) do
c
// Ispitati susede vora u
c
for (svaki vor v u listi susedstva G za vor u) do
c
c
if (p[v] == false) then
p[v] = true;
// vor v je novootkriven (poseen)
c
c
W[i+1] = W[i+1] + v;
// dodati v talasu Wi+1
i = i + 1;
return;
cinjenicom:
L EMA Za graf G sa n cvorova i m grana koji je predstavljen nizom listi
susedstva, vreme izvravanja algoritma bfs je O(n + m). (To vreme je dakle
linearno u odnosu na veli inu ulaza algoritma.)
c
Dokaz: O evidno je da u vremenu izvravanja algoritma bfs dominira
c
c
vreme za koje se izvrava glavna while petlja. Medutim, ta an broj ite
c
racija ove while petlje nije lako odrediti, pa cemo postupiti na druga iji
na in i analizirati iteracije prve (spoljanje) for petlje tokom izvravanja
c
svih iteracija while petlje u algoritmu.
Pre toga, poto se u svakoj iteraciji while petlje na po etku konstruie
c
prazna lista za aktuelni talas i na kraju uve ava broja talasa, potrebno je
c
c
odrediti ukupno vreme potrebno za ta dva koraka. To je lako oceniti ukoliko
for petlje izvrava najvie jedanput za svaki cvor u grafa. Pored toga, ako
vora u, onda je broj iteracija unutranje
c
n u ozna ava broj suseda (stepen) c
for petlje jednak n u . Kako se dalje jedna iteracija te unutranje for petlje
o evidno izvrava za konstantno vreme, to je vreme izvravanja unutranje
c
198
Grafovi
for petlje za svaki cvor u jednako O(n u ). Ukoliko ovo vreme saberemo po
svim cvorovima grafa, dobijamo dakle ukupno vreme izvravanja spoljanje for petlje tokom izvravanja svih iteracija while petlje:
u V
O(n u ) = O
u V
n u = O(2m) = O(m) .
dobro denisan, jer se u svakom koraku dodaju samo novi cvorovi iz narednog talasa, a uz to se dodaju i samo pojedine grane koje ih spajaju
stabla.
199
//
//
//
//
while (W[i] != ) do
// prethodni talas Wi nije prazan
W[i+1] = ;
// naredni talas Wi+1 je poetno prazan
c
for (svaki vor u u talasu Wi ) do
c
// Ispitati susede vora u
c
for (svaki vor v u listi susedstva G za vor u) do
c
c
if (p[v] == false) then
p[v] = true;
// vor v je novootkriven (poseen)
c
c
W[i+1] = W[i+1] + v;
// dodati v talasu Wi+1
T = T + v + {u,v};
// dodati v i granu { u, v} stablu T
i = i + 1;
return;
istaknute su grane koje ne dovode do otkrivanja novih cvorova tokom pretrage. U stablu T su grane stabla prikazane punim linijama, dok su isprekidanim linijama nazna ene grane grafa G koje ne pripadaju stablu T.
c
G
1
2
1
3
5
8
6
9
11
2
7
3
5
10
4
6
10
11
cvora 1.
200
Grafovi
Wi+1 ukoliko taj cvor nije ranije otkriven ili y pripada nekom prethodnom
Pretraga u dubinu
toga to se ide sve dublje u grafu od po etnog cvora, du nekog puta sve dok
c
se taj put vie ne moe nastaviti, bilo zato to poslednji cvor nema grana
koje vode od njega ili zato to sve grane od njega vode do ve pose enih
c
c
cvorova.
Pretraga u dubinu grafa podse a na postupak koji se prirodno pric
prona i izlaz od po etnog cvora s, onda je prirodno probati prvu granu koja
c
c
vodi od s. Ako nas to vodi do nekog cvora v, onda bismo dalje sledili prvu
granu koja vodi od v. Ovaj postupak bismo zatim sli no nastavili od cvora
c
odnosno do cvora cije smo sve susede ve probali. Onda bismo se vratili
c
putem kojim smo doli do prvog cvora cije sve susede jo nismo probali i
zatim bismo odatle ponovili isti postupak.
granu koja vodi do nekog susednog cvora koji nije ve pose en. Zato se
c
c
pretraga u dubinu moe najlake opisati u rekurzivnom obliku u kojem
201
slui za vodenje ra una o tome koji cvorovi su ve pose eni tokom pretrage.
c
c
c
// vor u je poseen
c
c
bitan po etni cvor, ve ulazni cvor moe biti bilo koji cvor grafa. Na primer,
c
c
problem s-t povezanosti moe se jednostavno reiti pozivom dfs(s). Pored
toga, algoritam dfs ne proizvodi neki opipljiv rezultat, nego samo propi
suje odreden na in obilaska svih cvorova grafa. (Ovo zapaanje se odnosi
c
pose en, a zatim se ispituju svi susedi cvora u proveravanjem svake grane
c
algoritma za cvor v. Poto se potpuno provere sve grane koje idu od cvora
202
Grafovi
i da zavisi od redosleda kojim se pose uju susedi nekog cvora u for petlji
c
algoritma dfs.
1
3
2
5
8
6
9
11
4
7
10
dfs(1)
dfs(2)
dfs(3)
dfs(6)
dfs(10)
dfs(7)
dfs(4)
dfs(9)
dfs(8)
dfs(5)
dfs(11)
obide ta no ona povezana komponenta grafa koja sadri po etni cvor. Pored
c
c
na in moe konstruisati stablo pose enih cvorova sli no kao kod pretrage
c
c
c
u irinu.
Sa druge strane, iako se primenom oba na ina naposletku obide isti
c
skup cvorova one komponente grafa koja sadri po etni cvor, pretragom
c
dode do cvora v odakle se lanac vie ne moe nastaviti, bilo zato to cvor v
nema grana koje vode od njega ili zato to sve grane od njega vode do ve
c
203
naime jasno kako to vreme moemo izraziti u obliku rekurentne jedna ine
c
rova koji su susedi cvora u. Ako je broj suseda (stepen) cvora u jednak
n u , onda se telo for petlje u algoritmu dfs izvrava n u puta. Poto se u
telu te petlje ne ra una vreme za izvravanje rekurzivnog poziva dfs(v),
c
moe se zaklju iti da se to telo izvrava za konstantno vreme. Prema
c
c
c
tome, ukupno vreme za izvravanje poziva dfs(u), ne ra unaju i njegove
rekurzivne pozive, jednako je O(1 + n u ). Ovde je jedinica dodata broju
c
suseda n u kako bi se u obzir uzeo slu aj kada je n u = 0, jer se onda poziv
dfs(u) ipak izvrava za neko konstantno vreme O(1).
Da bismo dalje ocenili ukupan broj poziva algoritma dfs, primetimo
grafu. Naime, cim se pozove dfs(u) za neki cvor u, odmah se taj cvor
c
obeleava da je pose en, a algoritam dfs se nikad ponovo ne poziva za ve
c
pose en cvor. Prema tome, ukupno vreme izvravanja za sve pozive algoc
c
c
ritma dfs od nekog po etnog cvora grafa G je ograni eno zbirom vremena
u V
O(1 + n u ) = O
u V
(1 + n u ) = O
u V
1+
u V
vreme O(n + m), odnosno za linearno vreme u odnosu na zbir brojeva cvorova i grana grafa.
Stablo pretrage u dubinu. Svaka pretraga u dubinu grafa na prirodan
na in odreduje jedno povezuju e stablo komponente grafa koja sadri poc
c
zivno poziva dfs(v) za neki cvor v, onda se cvor v i grana koja spaja
204
Grafovi
// vor u je poseen
c
c
// dodati vor u stablu T
c
205
T
1
3
2
2
4
6
7
10
10
7
11
5
11
je e povratna grana.
Dokaz: Primetimo najpre da za dati rekurzivni poziv dfs(u), svi cvorovi koji su pose eni izmedu po etka i zavretka ovog poziva predstavljaju
c
c
kraj v ranije ve pose en. Kako cvor v nije bio pose en pre po etka poziva
c
c
c
c
c
c
njegovih povezanih komponenti, postavlja se pitanje u kom odnosu stoje
ove komponente? Taj odnos je izraen na slede i na in:
c
c
206
Grafovi
L EMA Povezane komponente bilo koja dva cvora s i t u grafu su ili identi ne
c
ili disjunktne.
Dokaz: Tvrdenje leme je inuitivno o igledno kada se graf nacrta, jer
c
komponenti koja sadri s ako i samo ako se taj cvor nalazi u komponenti
koja sadri t.
Sa druge strane, ukoliko ne postoji put izmedu cvorova s i t u grafu,
zavretka druge pretrage od t jo uvek postoji neki cvor v koji nije bio
207
svaku granu ili cvor obavlja se aktivnost konstantnog vremena ipak samo
u iteraciji u kojoj se konstruie povezana komponete kojoj oni pripadaju.
Zbog toga je vreme izvravanja prethodnog algoritma za nalaenje svih
povezanih komponenti grafa ukupno jednako O(n + m).
je grafom opisana velika TV mrea neke kompanije. U tom grafu svaki cvor
predstavlja TV stanicu i svaka grana predstavlja dvosmerni komunikacioni kanal izmedu dve stanice kojim su one direktno zemaljski povezane
208
Grafovi
tako da se svakom pose enom cvoru pridruuje redni broj njegove kompoc
nente.
// Ulaz: graf G predstavljen listama susedstva
// Izlaz: niz c takav da je c v broj komponente vora v
c
algorithm connected-components(G)
// vor u je poseen
c
c
// vor u pripada aktuelnoj komponenti
c
209
nog do drugog cvora: grana (u, v) ima smer od cvora u do cvora v. Ovaj
asimetri ni odnos izmedu cvorova proizvodi kvalitativno razli it efekat na
c
c
strukturu usmerenih grafova. Posmatrajmo na primer Internet iz grafov
ske perspektive kao jedan veliki, komplikovan graf ciji cvorovi predstavljaju pojedine veb strane, a grane predstavljaju medusobne hiperlinkove.
Pregledanje Interneta se onda svodi na pra enje niza grana u ovom usmec
renom grafu, pri cemu je smer grana od sutinske vanosti jer obi no nije
c
mogu e unazad pratiti hiperlinkove koji vode to date strane.
c
Vanost smera grana odraava se dakle na bitno druga iji pojam povec
zanosti u usmerenim grafovima nego u neusmerenim grafovima. U usme
svaka dva njegova cvora postoji put od jednog do drugog cvora, ali i obrnut
cvor. Kod usmerenog grafa, cvor v je susedan cvoru u ako postoji usme
rena grana (u, v). Ali cvor u nije automatski susedan cvoru v, osim ako ne
210
Grafovi
postoji i grana (v, u). Ako se uzme u obzir ova promena interpretacije relacije susedstva, osnovni algoritmi bfs i dfs mogu se bez izmene primeniti i
za usmerene grafove. Pored toga, na identi an na in se moe pokazati da je
c
c
2
5
8
6
9
11
4
7
10
dfs(1)
dfs(2)
dfs(4)
dfs(6)
dfs(9)
dfs(11)
dfs(8)
dfs(5)
dfs(3)
dfs(10)
dfs(7)
kat. Prvo, pretraga u dubinu moe proizvesti umu stabala cak i kada je
usmeren graf povezan. Na primer, da smo pretragu u dubinu na slici 7.16
po eli od cvora 7, dobili bismo umu od dva stabla ili vie njih. Drugo, u
c
slu aju neusmerenog grafa pokazali smo da grane grafa koje nisu grane
c
211
T
2
5
8
4
6
4
6
10
11
10
8
11
5
3
vih predaka u stablu. Drugim re ima, grane neusmerenog grafa koje nisu
c
grane stabla uvek su povratne grane. Sa druge strane, grane usmerenog
grafa G u odnosu na njegovo stablo pretrage u dubinu T mogu biti jednog
od slede a tri tipa:
c
1. Direktna grana. To je usmerena grana (u, v) u G koja nije grana stabla
212
Grafovi
Pored toga, na slici 7.17 se uo ava da popre na grana (7, 10) ima
c
c
smer zdesna na levo. To nije slu ajnost i vai u optem slu aju: svaka
c
c
popre na grana ima smer zdesna na levo, cak i u umi stabala pretrage
c
u dubinu.
Da bismo to pokazali, neka je (u, v) popre na grana i posmatrajmo
c
c
poziv dfs(u). O evidno je cvor v potomak cvora u u stablu pretrage u
dubinu ako i samo ako je cvor v dodat u stablo izmedu vremena po etka
c
proverava grana (u, v), cvor v je morao biti ve pose en, jer (u, v) nije
c
c
grana stabla. Prema tome, cvor v je morao biti pose en ranije u toku
c
c
c
izvravanja dfs(u) ili pre poziva dfs(u). Ali prvi slu aj je nemogu ,
jer bi u suprotnom slu aju cvor v bio potomak cvora u. Dakle, v je bio
c
turu. Na primer, usmeren graf bez ciklusa sa n cvorova moe imati veliki
broj grana reda (n2 ), dok stablo (neusmeren graf bez ciklusa) sa n cvorova
ima samo n 1 granu. Usmeren graf bez ciklusa se standardno naziva
usmeren acikli ki graf i jedan primer takvog grafa je prikazan na slici 7.18.
c
6
213
c
e
imala smisla, dobijeni usmeren graf G mora biti acikli ki, jer ukoliko G
c
sadri neki ciklus C, onda ne postoji na in da se uradi nijedan zadatak u
c
C. Naime, kako svaki zadatak u ciklusu C ima neki drugi zadatak koji
se prethodno mora zavriti, nijedan zadatak u C se ne moe obaviti jer se
nijedan zadatak ne moe zapo eti.
c
Ukoliko usmeren graf zavisnosti zadataka nema cikluse, prirodno je
onda traiti redosled tih zadataka po kojem se oni mogu obaviti tako da
sve medusobne zavisnosti zadataka budu potovane. Takav ispravan redo
sled zadataka se naziva topoloki redosled. Preciznije, topoloki redosled
214
Grafovi
dakle redosled po kojem se oni mogu bezbedno uraditi kada treba po eti
c
neki zadatak, svi zadaci koji su njegovi preduslovi sigurno su ve zavreni.
c
U stvari, posmatrano iz apstraktnijeg ugla, topoloki redosled usmerenog
grafa predstavlja dokaz da je graf acikli ki.
c
L EMA Ako usmeren graf G ima topoloki redosled, onda G nema nijedan
ciklus.
Dokaz: Pretpostavimo, radi kontradikcije, da G ima jedan topoloki re
dosled svojih cvorova v1 , v2 , . . ., vn i da u G postoji ciklus C. Neka je v j
c
prethodi cvoru v j . To zna i da je (v i , v j ) jedna od grana u G. Ali to dovodi do
protivre nosti, jer onda mora biti ta no da je i < j zato to svaka grana za
c
c
215
zavretka druge pretrage od t jo uvek postoji neki cvor v koji nije bio
tako dalje sve dok se ne posete svi cvorovi grafa. Na ovaj na in se indukuje
c
uma stabala pretrage u dubinu sa korenima s, t i tako dalje.
Za razumevanje ovog algoritma je najvanija cinjenica to da jedno stablo pretrage u dubinu u sutini predstavlja stablo rekurzivnih poziva al
c
goritma dfs od po etnog poziva tog algoritma za neki cvor. Kako se za
za odgovaraju i cvor.
c
Podsetimo se da se tokom (viestruke) pretrage u dubinu grafa algo
c
ritam dfs poziva ta no jedanput za svaki cvor grafa. Zbog toga je vreme
216
Grafovi
e
1
9 10
c
poziva algoritma dfs za sve cvorove. To zna i da se tokom pretrage u
dubinu grafa G prvi zavrio poziv dfs(v1 ), zatim se zavrio poziv dfs(v2 )
i tako dalje, poslednji se zavrio poziv dfs(vn ). Recimo, u primeru na
c
uveriti da je i > j. Naime, u tom slu aju je cvor v j potomak cvora v i , pa se
poziv dfs(v i ) svakako zavrava posle poziva dfs(v j ).
c
Najzad, ako je (v i , v j ) popre na grana, onda se mogu razlikovati dva
slu aja zavisno od toga da li cvorovi v i i v j pripadaju istom stablu ili razlic
citim stablima u umi pretrage u dubinu. Ipak, u oba slu aja smer grane
c
217
pre njegovog zavretka cvor koji je njegov parametar dodaje na kraj jedne
// vor u je poseen
c
c
218
Grafovi
Zadaci
1. Za usmeren graf G na slici 7.23 odgovorite na slede a pitanja.
c
c
f
e
d
S LIKA 7.23.
3. Dokaite da ako se granom spoje bilo koja dva cvora u slobodnom stablu
T izmedu kojih ne postoji grana, onda se formira ta no jedan ciklus.
c
4. Dokaite da povezan neusmeren graf G sa n cvorova predstavlja slobodno stablo ako i samo ako G ima n 1 granu.
219
vor koji
da li usmeren graf predstavljen matricom susedstva ima jedan c
je ponor.
9. Za usmeren graf G na slici 7.24 odgovorite na slede a pitanja.
c
koristi jedan red za cekanje umesto vie posebnih listi W[i] za svaki
220
Grafovi
G
b
a
c
h
e
g
d
f
S LIKA 7.24.
S LIKA 7.25.
a) Pokaite da je svako slobodno stablo jedan bipartitan graf.
b) Napiite ekasan algoritam kojim se proverava da li je dati neusmeren graf bipartitan. (Savet: Koristite pretragu u irinu.)
13. Za usmeren graf G na slici 7.24, kao i za njegovu neusmerenu verziju,
odgovorite na slede a pitanja.
c
a) Navedite sve rekurzivne pozive algoritma dfs za graf G koji se
c
c
dobijaju za po etni poziv dfs(a) i uvla enjem nazna ite njihov
c
221
17. Navedite primer usmerenog grafa bez ciklusa sa n cvorova koji ima
(n2 ) grana. (Savet: Uo ite graf G = (V , E) kod koga je V = {1, 2, . . ., n} i
c
E = {(i, j) : i < j za i, j V }.)
18. Ako d(u, v) ozna ava duina najkra eg puta (rastojanje) izmedu cvorova
c
c
vora u je:
c
u i v u grafu G = (V , E), ekscentri nost c
max d(u, v).
v V
222
Grafovi
21. Prost put u grafu je Hamiltonov ako prolazi kroz sve cvorove grafa. Napiite ekasan algoritam kojim se odreduje da li dati usmeren acikli ki
c
G LAVA
8
Teinski grafovi
puta (rastojanja) izmedu dva cvora u povezanom grafu moe koristiti pre
odgovaraju i.
c
Graf moe predstavljati, na primer, neku ra unarsku mreu (kao to je
c
koji ozna avaju date ra unare u grafu. Ali u ovom slu aju nije prirodno
c
c
c
da sve grane grafa budu ravnopravne poto su neke veze u mrei ra uc
nara obi no mnogo bre od drugih neke grane mogu predstavljati spore
c
telefonske linije, dok druge predstavljaju brze opti ke veze.
c
Da bismo sli ne probleme modelirali grafovima, u ovom poglavlju proc
irujemo pojam grafa i posmatramo (usmerene ili neusmerene) grafove
224
Teinski grafovi
8.1
Osnovni pojmovi
Teinski graf je obi an (usmeren ili neusmeren) graf cije sve grane
c
imaju teinu u obliku numeri ke vrednosti. Primetimo da su teine grana
c
neutralni naziv za brojeve koji su pridrueni granama, ali u prakti nim
c
primenama ti brojevi mogu predstavljati razne druge zi ke veli ine kao
c
c
to su duina, vreme, cena, brzina ili neka druga mera odnosa dva cvora.
Primer jednog teinskog grafa je prikazan na slici 8.1.
a
100
200
120
350
300
E ima dodeljen broj w(e) koji odreduje njenu teinu. S obzirom na cinjenicu
da obi an graf moemo smatrati teinskim grafom cije su sve teine grana
c
jednake (na primer, moemo uzeti da su sve teine jednake 1), jasno je da
svi osnovni pojmovi za obi ne grafove imaju smisla i za teinske grafove.
c
mogu biti brojevi 1 ili 0 cime se odreduje da li grana izmedu neka dva cvora
postoji ili ne. U slu aju teinskih grafova, postojanje neke grane e i njena
c
teina w(e) zajedno se predstavljaju odgovaraju im elementom matrice suc
sedstva koji je jednak w(e). Ali zato ako neka grana ne postoji u grafu,
odgovaraju i element matrice susedstva mora biti neka vrednost koja nije
c
mogu a za teinu grane. Na slici 8.2 je prikazana matrica susedstva u kojoj
c
se za predstavljanje nepostoje e grane u teinskom grafu na slici 8.1 koristi
c
specijalni simbol .
8.2. Minimalno povezujuce stablo
a
b
c
d
200
b
100
80
225
c
120
d
350
300
Niz listi susedstva za predstavljajnje obi nog grafa moe se lako pric
lagoditi za predstavljajnje teinskog grafa ukoliko se teina neke grane
e priklju i elementu povezane liste koji odreduje drugi kraj grane e. Na
c
b 100
c 120
80
d 300
d 350
b
c
a 200
i njihove cene.
226
Teinski grafovi
20
10
20
10
2
5
3
6
d
(a)
3
6
d
(b)
u ciklusu. Pri tome povezanost izmedu bilo koje dva cvora datog grafa ne bi
8.2. Minimalno povezujuce stablo
227
podrazumeva da ono sadri skup svih cvorova V datog grafa G. Nije teko
proveriti da povezuju e stablo grafa G postoji ako i samo ako je G povezan
c
graf.
U slu aju povezanog teinskog grafa G, zbir teina grana u nekom poc
vezuju em stablu T tog grafa nazivamo cenom stabla T. Problem nalaenja
c
povezuju eg stabla grafa G koje ima najmanju cenu, prema prethodnoj
c
lemi, zapravo je drugim re ima formulisan opti problem koji smo ilustroc
vali primerom kompanije sa vie predstavnitava: za dati teinski graf
c
G = (V , E) na i podskup grana T E tako da podgraf (V , T) bude povezan
i da ukupna teina grana u T bude minimalna. Zbog toga se reenje
T ovog problema naziva minimalno povezuju e stablo (engl. minimum
c
spanning tree) grafa G. Dakle, minimalno povezuju e stablo je stablo jer je
c
acikli ki graf; ono je povezuju e jer povezuje sve cvorove datog grafa; i ono
c
c
je minimalno jer ima najmanju cenu medu svim povezuju im stablima.
c
Sem ukoliko G nije vrlo prost graf, G moe imati ogroman broj po
vezuju ih stabala cija je struktura potpuno razli ita. Zbog toga na prvi
c
c
pogled nije uopte lako na i povezuju e stablo sa najmanjom cenom medu
c
c
228
Teinski grafovi
U ovom ciklusu C koji sadri granu e kao most izmedu skupa cvorova
V2
v1
v1
v2
v2
8.2. Minimalno povezujuce stablo
229
Kruskalov algoritam
Radi konstruisanja minimalnog povezuju eg stabla teinskog grafa G =
c
(V , E), u Kruskalovom algoritmu se polazi od ume (V , ) koja se sastoji od
svih cvorova grafa G i nema nijednu granu. Drugim re ima, po etna uma
c
c
grana e povezuje dva cvora iz dva razli ita stabla do tada konstruisane
c
ume, onda se e dodaje skupu izabranih grana i ta dva stabla se objedinjuju
(1)
(2)
f
2
b
1
(3)
(4)
(5)
b
1
b
1
230
Teinski grafovi
8.2. Minimalno povezujuce stablo
231
strukturu, ti grafovi imaju ista povezuju a stabla. Ali ako bi stara cena
c
stabla T bila ve a od stare cene nekog drugog povezuju eg stabla grafa G,
c
c
onda za dovoljno male promene teina grana ne bi cena tog drugog stabla
mogla da se uve a toliko da stablo T bude bolje sa novim teinama u G . To
c
pokazuje da je T minimalno povezuju e stablo i za graf G. Kako su teine
c
c
grana novog grafa G medusobno razli ite, Kruskalov algoritam ce prema
dati cvor u, operacija ds-find(u) kao rezultat daje ime skupa cvorova koji
232
Teinski grafovi
//
//
//
//
//
return T;
Vreme izvravanja prve for petlje u kojoj se inicijalizuje n disjunktnih skupova iznosi O(n), jer za inicijalizaciju jednog skupa treba
konstantno vreme.
Telo druge for petlje se izvrava m puta, a svaka iteracija se izvrava
za vreme O(log n) ukoliko su operacije sa disjunktnim skupovima
realizovane onako kako smo to opisali na strani 177. Prema tome,
ukupno vreme izvravanja druge for petlje je O(m log n).
Kako za povezan graf vai da je m n 1, to je n = O(m). Takode,
c
poto uvek vai m n2 , to je log m = O(log n). Uzimaju i sve u obzir dakle,
ukupno vreme izvravanja algoritma mst-kruskal je:
O(m) + O(m log m) + O(n) + O(m log n) =
O(m) + O(m log n) + O(m) + O(m log n) = O(m log n) .
8.2. Minimalno povezujuce stablo
233
Primov algoritam
U Kruskalovom algoritmu se pohlepno biraju grane najmanje teine
bez mnogo obzira na to u kakvom odnosu stoje sa prethodno izabranim
granama, osim to se pazi da se ne formira ciklus. Na ovaj na in se doc
bija uma stabala koja se ire prili no nasumi no dok se ne stope u jedno
c
c
zavrno stablo.
Nasuprot tome, u Primovom algoritmu se dobija minimalno povezuju e
c
stablo tako to se po etno najprostije stablo postupno proiruje. To po etno
c
c
c
c
podskup cvorova S V nad kojim je delimi no konstruisano povezuju e
c
stablo. Po etno je S = { s} i zatim se S postupno uve ava za jedan cvor v
c
kojim se minimizuje cena uve anja skupa S:
c
min w(e).
e={u,v}
uS,vS
S
v
234
Teinski grafovi
(0)
(1)
(2)
a
f
a
f
(3)
(4)
(5)
a
f
a
f
8
2
b
1
po etnog cvora a.
c
podele grafa.
c
L EMA Primov algoritam konstruie minimalno povezuju e stablo povezanog teinskog grafa G.
Dokaz: Ispravnost Primovog algoritma se dokazuje vrlo sli no Kruskaloc
vom algoritmu. Zbog toga cemo pokazati samo da se i u Primovom algoritmu u svakom koraku dodaje grana koja pripada svakom minimalnom
povezuju em stablu grafa G.
c
Ali to je u Primovom algoritmu jo o iglednije, jer u svakom koraku
c
8.2. Minimalno povezujuce stablo
235
blu grafa G. Pored toga, grane ciji je samo jedan kraj u skupu S moraju se
organizovati na na in koji omogu ava da se moe brzo izabrati takva grana
c
c
minimalne teine. Zbog toga se u ralizaciji Primovog algoritma koriste ove
strukture podataka:
Za skup grana T delimi nog stabla koristi se reprezentacija u obliku
c
povezane liste kako bi dodavanje grane u T moglo da se izvri za
konstantno vreme.
ovog niza jednaka je broju cvorova grafa G i elementi niza su indek vorovima. Pored toga, svaki element niza ima vrednost
sirani tim c
ta no ili neta no prema tome da li odgovaraju i cvor pripada skupu
c
c
c
S.
Da bi se brzo odredila slede a grana koju treba dodati delimi nom
c
c
) do
236
Teinski grafovi
e = pq-deletemin(Q);
Neka je e = { u, v};
T = T + e ; // granu e dodati granama deliminog stabla
c
S = S + v; // drugi kraj v grane e dodati vorovima
c
// deliminog stabla
c
for (svaka grana e = {v, x} za koju x S ) do
pq-insert(Q,(w(e), e ));
return T;
sasvim tre e, recimo, vreme ili cenu.) Tome cemo se prilagoditi u izlaganju
c
237
(P) =
k 1
(e i ) .
i =1
cvora ima istu sloenost u optem slu aju kao problem najkra ih puteva
c
c
Dijkstrin algoritam
c
cvor, za svaki nereen cvor v u V S se odreduje duina najkra eg speci
od c
238
Teinski grafovi
G
S
reeni
cvorovi
s
specijalni
put
veli ina
c
(v) = min d(u) + (e).
e={u,v}
u S
Nakon toga, radi proirenja skupa S, bira se cvor x za koji se ova veli ina
c
1
4
x
2
2
3
239
S, jer je cvor x izvan S. Neka je y prvi cvor na putu P koji nije u S i neka
je P y deonica puta P od s do y. Kao to je prikazano na slici 8.11, put P iza
cvora y moe krivudati unutar i izvan skupa S nekoliko puta dok se najzad
ne zavri u cvoru x.
G
S
Px
x
u
s
v
c
Kako je P y jedan od specijalnih puteva od cvora s i P x je najkra i takav
specijalni put, to je (P y ) (P x ). Sa druge strane, (P) (P y ) jer su
duine grana nenegativne. Ove dve nejednakosti zajedno daju (P) (P x ),
to pokazuje da duina svakog puta P od s do x nije kra a od duine
c
240
Teinski grafovi
Put P mora negde iza i iz skupa S, jer je cvor x izvan S. Neka je y prvi
c
Implementacija Dijkstrinog algoritma. Za teinski graf G sa n cvorova i m grana, u Dijkstrinom algoritmu se izvrava n 1 iteracija doda
vanja novog cvora x skupu S. Na prvi pogled, u svakoj iteraciji se zahteva
v radi izra unavanja najpre minimuma (v) i zatim izbora cvora x za koji
c
se postie najmanji od ovih minumuma. U najgorem slu aju dakle vreme
c
izvravanja svake iteracije moe biti O(m), pa bi ukupno vreme izvravanja
Dijkstrinog algoritma bilo O(mn).
Da bi se ekasnost Dijkstrinog algoritma znatno unapredila, moraju
se koristiti prave strukture podataka. Pre svega, da se ne bi nepotrebno
u svakoj iteraciji ponovo izra unavale duine najkra ih specijalnih puteva
c
c
vorova u V S, one se cuvaju u nizu d duine n koji je indeksiran
do c
241
nereen cvor x koji ima najmanju vrednost d(x) od svih nereenih cvorova.
Radi ekasne realizacije tog postupka moe se postupiti na sli an na in
c
c
kao kod Primovog algoritma i koristiti struktura podataka reda sa priori
tetima za sve nereene cvorove u V S. Ako jedan element takvog reda
odnosno nereen cvor x koji ima najkra u duinu d(x) specijalnog puta od
c
cvora s.
cvor x reen i da moda postoje kra i specijalni putevi koji vode do njegovih
c
suseda. Zbog toga se mora proveriti vrednost d(v) za svaki nereen cvor v
koji je susedan cvoru x. Naime, za svaki takav cvor v, novi specijalni put
do v prati put od s do x u novom S i zavrava se granom { x, v}. Taj novi
c
specijalni put do cvora v ima duinu d(x) + (x, v), pa ako je taj put kra i od
postoje eg najkra eg specijalnog puta do v duine d(v), ta stara vrednost
c
c
c
d(v) mora se aurirati vredno u d(x) + (x, v). Jedan primer ovog slu aja
c
prikazan je na slici 8.12.
d(x) = 11
d(x) = 11
v
s
d(s) = 0
d(v) = 20
d(v) = 17
s
d(s) = 0
nereenog cvora v, novi specijalni put do v nije kra i od postoje eg, pa stara
c
c
vrednost d(v) treba da ostane nepromenjena. Oba slu aja podeavanja
c
242
Teinski grafovi
20
10
7
5
3
2
4
4
6
iteracija
d(1)
d(2)
d(3)
d(4)
d(5)
d(6)
{1}
20
10
{1, 6}
20
10
12
11
{1, 3, 6}
17
10
12
11
{1, 3, 5, 6}
17
10
12
11
{1, 3, 4, 5, 6}
13
10
12
11
{1, 2, 3, 4, 5, 6}
13
10
12
11
243
grane koja povezuje cvor x i nekog njegovog suseda v koji se nalazi izvan
c
novog S radi provere da li je d(x) + (x, v) < d(v). Ako je to slu aj, mora se
grafu nema negativnih grana, onda se ovaj problem moe reiti viestru
kim izvravanjem Dijkstrinog algoritma od svakog cvora grafa. Ukoliko
G ima n cvorova i m grana, vreme potrebno za ovo reenje je O(nm log n),
pod pretpostavkom da je graf G povezan i predstavljen nizom listi susedstva. U najgorem slu aju kada je ulazni graf gust, odnosno m = (n2 ), ovo
c
c
vreme iznosi O(n3 log n). U najboljem slu aju kada je graf redak, odnosno
2
m = (n), ovo vreme iznosi O(n log n).
laenja najkra ih puteva izmedu svih cvorova koji se moe primeniti cak
c
i u slu aju kada graf sadri grane negativne duine (ali ne i cikluse nec
gativne duine). Taj na in se po svom autoru naziva Flojdov algoritam
c
i pripada kategoriji algortama dinami kog programiranja. U ovom algoc
ritmu se pretpostavlja da je ulazni graf predstavljen matricom susedstva i
njegovo vreme izvravanja je O(n3 ).
244
Teinski grafovi
ideji da se nalaenje najkra eg puta izmedu bilo koja dva cvora v i i v j podeli
c
c
c
cvora i drugog puta od tog posrednog cvora do v j . Ta nije, najkra i put od
c
v i do v j odreduje se koriste i na tom putu samo posredne cvorove iz skupa
c
radi pogodnosti ozna imo V0 = . Duina najkra eg puta D(i, j, k) od cvora
c
c
v i do cvora v j , uzimaju i u obzir posredne cvorove na putevima od v i do
c
c
c
v j samo one iz skupa Vk , izra unava se za k = 0, 1, 2, . . ., n na slede i na in.
Po etno, za k = 0,
c
D(i, j, 0) =
0,
(v i , v j ),
,
ako i = j
ako (v i , v j ) E
ina e
c
a za k = 1, 2, . . ., n,
D(i, j, k) = min D(i, j, k 1), D(i, k, k 1) + D(k, j, k 1) .
onda zbir duina najkra eg puta od v i do vk koji prolazi samo kroz cvorove
c
c
cvor vk , tada bi to protivre ilo deniciji D(i, j, k 1), a ako bi postojao takav
kra i put koji sadri cvor vk , tada bi to protivre ilo deniciji D(i, k, k 1) ili
c
c
245
D(k, j, k 1). U stvari, lako se proverava da ovo vai i ukoliko postoje grane
grafa G negativne duine, ali ne i ciklusi negativne duine.
Na slici 8.14 je ilustrovano izra unavanje duine D(i, j, k) prema pretc
vi
V Vk
Vk
vj
grana. Pored toga, M(i, i) = 0.
// Ulaz: teinski graf G predstavljen matricom susedstva M
// Izlaz: matrica D takva da D(i, j, n) = d(v i , v j )
algorithm floyd(G)
for i = 1 to n do
for j = 1 to n do
D[i,j,0] = M[i,j];
for k = 1 to n do
for i = 1 to n do
for j = 1 to n do
D[i,j,k] = min {D[i,j,k-1], D[i,k,k-1] + D[k,j,k-1]};
return D;
246
Teinski grafovi
20
f
D0
10
20
10
3
d
10
20
D1
D2
10
20
10
11
12
20
28
28
10
10
11
31
12
32
20
28
20
28
31
32
D3
D4
10
11
11
12
10
11
11
12
10
10
11
10
11
10
11
11
12
10
12
10
D5
D6
10
11
11
12
10
11
11
12
10
10
11
11
11
11
12
12
247
U slu aju kada svaka grana grafa ima nenegativnu duinu, Flojdov
c
algoritam se moe poboljati tako da se umesto trodimenzionalne matrice
koristi dvodimenzionalna matrica. Naime, onda su elementi u k-toj vrsti i
k-toj koloni matrice D k isti kao oni u matrici D k1 , poto je D k1(k, k) uvek
nula.
Preciznije re eno, za svako k = 1, 2, . . ., n vai D k (i, k) = D k1(i, k) za
c
svako i = 1, 2, . . ., n i vai D k (k, j) = D k1 (k, j) za svako j = 1, 2, . . ., n. Kako
se nijedan element ciji je jedan ili drugi indeks jednak k ne menja u ktoj iteraciji prve od tri ugnjedene for petlje, nova vrednost za D k (i, j)
moe se izra unati kao minimum stare vrednosti D k1 (i, j) i zbira novih
c
vrednosti D k (i, k) i D k (k, j), a ne kao minimum stare vrednosti D k1 (i, j)
c
i zbira starih vrednosti D k1(i, k) i D k1 (k, j). To zna i da se u Flojdovom
algoritmu umesto trodimenzionalne matrice D reda n n n moe koristiti
dvodimenzionalna matrica D reda n n.
Ova verzija Flojdovog algoritma je jednostavna modikacija originalne
Zadaci
1. Odredite sva povezuju a stabla grafa G na slici 8.15.
c
G
S LIKA 8.15.
248
Teinski grafovi
249
G
25
a
10
10
30
40
15
23
20
e
17
S LIKA 8.16.
9. Odredite vreme izvravanja algoritma dijkstra ukoliko se koristi matrica susedstva za ulazni graf G, povezane liste za skupove S i V S,
sa nenegativnim granama.
12. Voralov algoritam. Problem povezanosti obi nog (neteinskog) usmec
renog grafa G sastoji se od utvrdivanja da li postoji put izmedu svaka
je P(i, j) = 1 ukoliko postoji put od cvora v i do cvora v j i P(i, j) = 0 u suprotnom slu aju. Napiite i analizirajte algoritam kojim se izra unava
c
c
matrica P. (Savet: Modikujte Flojdov algoritam.)
Literatura
[1]
Alfred V. Aho, John E. Hopcroft, and Jeffrey D. Ullman. Data Structures and Algorithms. Addison-Wesley, 1987.
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
Indeks
A
acikli ki graf, 188
c
algoritam, 4
analiza, 8, 2128
denicija, 6
dizajn, 8, 18
funkcija vremena izvravanja, 24
ispravnost i ekasnost, 17
iterativni, 108
izlaz, 6
jedini na instrukcija, 24
c
jednostavnost i jasno a, 17
c
osnovne konstrukcije, 25
pojednostavljena analiza, 46
primeri, 2840
pseudo jezik, 1113
rekurzivni, 108
ulaz, 6
veli ina, 23
c
vreme izvravanja, 24, 43
najgori slu aj, 24
c
vremenska sloenost, 24
asimptotska notacija, 5458, 66
O-zapis, 54
-zapis, -zapis, o-zapis, 58
asimptotsko vreme izvravanja, 43
B
ben mark podaci, 27
c
binarna pretraga, 48
binarni hip, 165
hip svojstvo, 166
operacije, 166
D
Dijkstrin algoritam, 237
implementacija, 240
poputanje, 241
E
ekasnost BSP operacija, 164
254
Indeks
rekurzivni, 110
F
Fibona ijev niz brojeva, 111
c
Flojdov algoritam, 243
funkcija vremena izvravanja algoritma,
24
G
graf, 186
acikli ki, 188
c
ciklus, 188
incidentna grana, 186
minimalno povezuju e stablo, 225
c
neusmeren, 187
bipartitan, 219
obilazak, 194
podgraf, 189
povezan, 189
povezana komponenta, 189
povezane komponente
nalaenje, 205
povezuju e stablo, 227
c
minimalno, 227
predstavljanje, 191
liste susedstva, 192
matrica susedstva, 191
pretraga u irinu, 195
analiza, 197
implementacija, 196
stablo, 198
pretraga u dubinu, 200
analiza, 202
stablo, 203
prost put, 188
Hamiltonov, 222
put, 188
duina, 188
teinski, 223
usmeren, 187
H
Hanojske kule, 113
hip, Vidi binarni hip
hip operacije, 166
hip svojstvo, 166
I
implementacija pretrage u irinu, 196
incidentna grana, 186
invarijanta petlje, 20
inverzija niza, 142
iterativni algoritam, 108
J
jaka povezanost, 209
jako povezan graf, 190
jedini na instrukcija, 24
c
jedini ni model sloenosti, 9
c
K
kompletno binarno stablo, 165
korensko stablo, 145
kruni turnir, 142
Kruskalov algoritam, 229
implementacija, 231
kursor, 95
L
lista, 88
dvostruko povezana, 93
implementacija
pomo u nizova, 94
c
c
c
pomo u pokaziva a, 89
liste susedstva, 192
M
maksimalna suma podniza, 2934
kvadratni algoritam, 29
linearni algoritam, 75
rekurzivni algoritam, 142
Indeks
matrica, 79
matrica susedstva, 191
metod nagadanja, 132
N
najgori slu aj izvravanja algoritma, 24
c
O
obilazak binarnog stabla, 153
inorder, 153
postorder, 154
preorder, 153
obilazak grafa, 194
obilazak usmerenog grafa, 209
opti metod, 134
osnovne algoritamske konstrukcije, 25
osnovne strukture podataka, 71101
P
podaci, 2
podgraf, 189
pojednostavljena analiza algoritama, 46
ponor, 219
poputanje, 241
povezan graf, 189
255
R
ra unar sa proizvoljnim pristupom mec
moriji (RAM), 9
ra unarski model, 810
c
ra unarski problem, Vidi problem
c
randomizirani algoritam, 27
red za cekanje, 98
redak graf, 192
rekurentne jedna ine, 116, 128
c
metod nagadanja, 132
256
S
s-t povezanost, 194
skup, 104
skup povezanih komponenti, 205
nalaenje, 205
slobodno stablo, 190
sortiranje niza, 34
sortiranje izborom (select-sort), 39
sortiranje objedinjavanjem (mergesort), 117
analiza algoritma, 120
sortiranje razdvajanjem (quick-sort),
122
analiza algoritma, 126
medijana, 124
pivot, 123
sortiranje umetanjem (insert-sort),
37
sortiranje upotrebom hipa (heap-sort),
184
sortiranje zamenjivanjem (bubble-sort),
34
sportski navija , 67
c
srpska zastava, 67
stabilno vezivanje, 82
stablo, 145
cvorovi, 145
bra a (sestre), 147
c
dete, 146
dubina, 148
listovi, 147
potomak, 148
predak, 148
roditelj, 146
spoljanji, 147
unutranji, 147
visina, 148
binarno, 151
obilazak, 153
binarno stablo pretrage, 155
denicija
formalna, 146
rekurzivna, 147
Indeks
grane, 145
koren, 146
korensko, 145
podstablo, 148
reprezentacija
red za cekanje, 98
skup, 104
stablo, 148
stek, 96
uma, 191
Indeks
T
teinski grafovi, 223247
ternarna pretraga, 66
tipi ne funkcije vremena izvravanja, 52
c
topoloki redosled, 213
nalaenje, 214
V
veli ina ulaza, 23
c
vezivanje
savreno, 80
stabilno, 82
virtuelna inicijalizacija niza, 101
Voralov algoritam, 249
vreme izvravanja algoritma, 24
asimptotsko, 43
najgori slu aj, 24
c
o ekivano, 27
c
prose no, 27
c
vremenska sloenost algoritma, 24
Z
zamena vrednosti dve promenljive, 13
zapis algoritama, 1013
257
CIP -
,
004.421(075.8)
510.5(075.8)
004.6(075.8)
, , 1956Uvod u algoritme i strukture podataka /
Dejan ivkovi. - 1. izd. - Beograd :
Univerzitet Singidunum, 2010 (Loznica :
Mladost Grup). - IV, 257 str. : ilustr. ; 24
cm
Tira 240. - Bibliograja: str. 251. Registar.
ISBN 978-86-7912-239-1
a) b) ()
COBISS.SR-ID 172433420
2010.
Sva prava zadrana. Ni jedan deo ove publikacije ne moe biti reprodukovan u bilo kom
vidu i putem bilo kog medija, u delovima ili celini bez prethodne pismene saglasnosti
izdavaa.