You are on page 1of 13

1. UVOD U ovom radu emo razmotriti problem pronalaenja odreene informacije u velikom skupu podataka.

Kao to emo videti, izvjesne metode organizacije podataka (tj. strukture podataka) ine proces pronalaenja efikasnijim. S obzirom da je proces pretraivanja vrlo est u obradi podataka, poznavanje metoda i tehnika organizacije podataka pretraivanja je vrlo vano. Pod pretraivanjem podrazumijevamo provjeru da li se zadana vrijednost pojavljuje u nekoj kolekciji vrijednosti (nizu, strukturi ili datoteci). Efikasnost pretraivanja uglavnom se mjeri prosjenim brojem poreenja koje je potrebno izvesti u postupku traenja razliitih vrijednosti u datoj kolekciji. to je algoritam bri to je kompleksniji i koristi vie radne memorije. Neki od razloga za pretraivanje su : utvrivanje da li je elementa lan liste, pronalaenje pozicije za umetanje novog elementa ako je lista sortirana, i pronalaenje lokacije elementa za brisanje. U ovom seminarskom obradit emo tri osnovna algoritma pretraivanja: 1. Sekvencijalna (linearna) pretraga 2. Binarna pretraga 3. Interpolacijska pretraga

2. SEKVENCIJALNO PRETRAIVANJE Sekvencijalna pretraga se jo naziva i linearna pretraga, a predstavlja proces traenja podatka u nekom nizu na taj nain da se redom, od prvog do zadnjeg, usporeuju svi elementi tog niza sa elementom kojeg traimo dok se ne naie na traeni element ili dok se ne izae iz okvira niza. Prilikom sekvencijalne pretrage podatka, skup podataka koji se pretrauje ne treba biti sortiran. Ova pretraga ujedno predstavlja i najjednostavniji nain pretrage skupa podataka, ali nedostatak joj je veliko vrijeme izvravanja. Ova se vrsta pretrage naziva i linearna jer ovisnost vremena pretrage o broju elemenata u nizu upravo predstavlja funkciju koja ima linearni rast.

Slika 1. Zavisnost vremena o broju lanova niza kod sekvencijalne pretrage

t vrijeme n broj lanova niza

Primjer: Ukoliko imamo niz brojeva: 3, 5, 3, 9, 0, 12, 9, 4 i sekvencijalnom pretragom elimo nai poziciju broja 0 tada bi se sekvencijalno traenje odvijalo tako da bi prvo usporedili da li je: 3 == 0 (nije) 5 == 0 (nije) 3 == 0 (nije) 9 == 0 (nije) 0 == 0 (jeste) Ovdje bi se pretraga zavrila i vratio bi se indeks 4 koji predstavlja poziciju broja 0 u nizu (indeks prvog elementa je 0). U svrhu implementacije sekvencijalne pretrage u C++ programskom jeziku napisat emo funkciju koja e kao ulazne parametre primati: niz cjelobrojnih vrijednosti, broj koji predstavlja duinu tog niza, broj koji traimo u nizu.

Funkcija e vraati cjelobrojnu vrijednost koja predstavlja indeks traenog broja u nizu, a ukoliko funkcija ne pronae broj u nizu vratit e broj -1.

int sekvencijalnaPretraga(int *niz, int duzina, int broj) { for (int i = 0; i < duzina; i++) { if (niz[i] == broj) { return i; } }

return -1;}

Funkcija radi na taj nain da se krene od prvog elementa prema zadnjem i provjerava se jednakost trenutnog elementa u nizu sa brojem koji se trai. Kada se ispostavi da je trenutni element niza jednak traenom broju - funkcija e vratiti indeks tog elementa niza (naredba return osim to vraa vrijednost takoer i prekida dalje izvravanje funkcije). Ukoliko se preu svi elementi niza, a ne nae se traeni broj funkcija e vratiti negativnu vrijednost -1.

3. BINARNO PRETRAIVANJE Binarna pretraga je algoritam za pretraivanje odreene vrijednosti u nizu koji mora biti sortiran. Takoer moramo znati i duinu niza. Ovaj algoritam spada u grupu podijeli pa vladaj algoritama. U svakom koraku algoritam uporeuje traenu vrijednost sa pivotom (srednji element niza). Ako se vrijednosti podudaraju traeni elemnt je pronaen i algoritam vraa poziciju ili index, ovisno o tome ta smo zadali da funkcija vraa. U sluaju da vrijednosti nisu jednake algoritam tad provjerava da li je pivot vei ili manji od traene vrijednosti. Ako je vrijednost pivota manja od traene vrijednosti, algoritam nastavlja pretraivanje u desnoj polovini niza. U sluaju da je vrijednost pivota vea od traene vrijednosti, algoritam e pretraivanje nastaviti u lijevom dijelu nizu. Dakle svakom iteracijom niz se prepolovljuje.

Slika 2. Ilustracija binarne pretrage


5

U prosjeku, ako su elementi sortirani, binarna pretraga ini oko

( )

usporedbi, gdje je n broj elemenata niza. Binarna pretraga je daleko efikasnija od sekvencijalne, pa tako npr. ako u sortiranom nizu brojeva od 1 do 60 traimo broj 47 sekvencijalna pretraga e napraviti 47 provjera, dok e binarna napraviti manje provjera i dosta bre pronai traeni element to nam i dokazuje ovaj primjer.

1. 2. 3. 4. 5. 6.

Da li je broj vei od 30? Da li je broj vei od 45? Da li je broj vei od 52? Da li je broj vei od 48? Da li je broj vei od 46? Pitamo dali je broj jednak sa 47.

-Jeste -Razmatramo -Jeste -Razmatramo -Nije -Razmatramo -Nije -Razmatramo -Jeste -Razmatramo

brojeve brojeve brojeve brojeve brojeve

od 30-60 od 45-60 od 45-52 od 45-48 od 46-48

-Jeste -Vratimo njegovu vrijednost.

Kod binarne pretrage je sljedei:


#include <iostream> using namespace std; int main() { int velicina=5; int niz[]={1,5,2,4,3}; int donji=0, srednji, gornji=velicina-1, trazeniBroj=3; while (gornji>donji) { srednji=(gornji+donji)/2; if (niz[srednji]<trazeniBroj) { donji=srednji+1; } else { gornji=srednji; } }

cout<<"traeni broj se nalazi na indeksu "<<gornji<<" odnosno traeni broj je "<<niz[gornji]<<endl;

4. INTERPOLACIJSKO PRETRAIVANJE Interpolacijsko pretraivanje je algoritam za pretraivanje dane vrijednosti u poljima koja su indeksirana i sortirana po vrijednostima kljueva. Ovaj algoritam pretraivanja moemo uporediti sa nainom kako ljudi pretrauju imenik. Npr. ako traimo broj neke osobe ije prezime i ime poinje s nekim od zadnjih slova abecede, logino je da cemo imenik otvoriti pri kraju. Interpolacijska pretraga je ustvari modificirana binarna pretraga. U interpolacijskoj pretrazi srednji element nije sredina niza kao to je sluaj kod binarne pretrage. Srednji element se izraunava na osnovu vrijednosti koja se trai i vrijednosti krajnjih elemenata u trenutnom segmentu koji se pretrauje tako da se pokua procijeniti gdje bi u takvom sortiranom segmentu mogao biti traeni podatak. To se izvrava uz pomo vrijednosti kljueva elemenata koji se nalaze na granicama preostalog prostora za pretraivanje. Taj prostor za pretraivanje je na poetku cijeli niz ili lista, i on se svakom sljedeom iteracijom algoritma smanjuje za pola. Na sljedeoj slici prikazan je odabir srednjeg (middle) elementa.

Slika 3. Interpolacija indeksa middle

Vrijednost kljua proraunate pozicije se uporeuje s vrijednou koja se pretrauje. Ako se ne podudaraju preostali prostor za pretraivanje se smanjuje. Preostali prostor za pretraivanje postaje dio prije ili poslije proraunate pozicije, zavisno od usporedbe vrijednosti za pretraivanje i srednje elementa. Ako je srednji

element manji od traenog elementa, lijeva strana niza se odbacuje i pretraivanje se nastavlja u desnom dijelu niza i obrnuto. U prosjeku, ako su elementi sortirani, interpolacijska pretraga ini oko log(log(n)) usporedbi, gdje je n broj elemenata koji se moraju provjeriti. U najgorem sluaju moe doi i do n provjera. U prosjeku interpolacijska pretraga je uspjenija i daje bolje rezultate od binarnog pretraivanja. U ovom primjeru je prikazana implementacija interpolacijskog pretraivanja :
int interpolacijskaPretraga (int K[ ], int key, int length){ int bottom = 0, top = length - 1, middle; while (K[low] < key && K[top] >= key) { middle = bottom + ((key - K[bottom]) * (top - bottom)) / (K[top] - K[bottom]); if (K[middle] < key) bottom = middle + 1; else if (K[middle] > key) top = middle - 1; else return middle; } //kraj while petlje if (K[bottom] == key) return bottom; else return -1; }//kraj funkcije.

5.

ZAKLJUAK Ovaj seminarski rad bih zakljuio uporedbom ova tri algoritma za pretraivanje,

odnosno njihovim prednostima i slabostima. Prednosti sekvencijalnog algoritma je u tome to je algoritam dosta jednostavan i elemnti liste mogu biti u bilo kojem poretku. Dok su mu slabosti neefikasnost (dosta je spor). Za listu od N elemenata u prosjeku mora provjeriti n/2 elemenata a ako se traena vrijednost ne nalazi u listi moraju se provjeriti svi elementi. Prednosti binarnog pretraivanja su mnogo vea efikasost pretraivanja od sekvencijalnog pretraivanja. Primjera radi, za listu od 1.048.576 elemenata pri sekvencijalnom pretraivanju bismo imali u prosjeku 524.266 iteracija, dok bismo pri binarnom pretraivanju imali najvie 20 iteracija. Slabosti binarnog pretraivanja su da niz mora biti sortiran i moramo imati direktan pristup elementima (preko indeksa). Prednost interpolacijskog pretraivanja je jo vea efikasnost pretraivanja nego kod binarnog pretraivanja. U prosjeku daje bolje rezultate nego binarna pretraga. Naalost to vrijedi samo u sluaju ako su dane vrijednosti u poljima indeksirane i sortirane po vrijednostima kljueva.

10

PITANJA I ZADACI 1. Objasniti funkciju sekvencijalne pretrage. 2. Implementirati funkciju koja vraa broj provjera binarne i sekvencijalne pretrage. 3. Izraunati broj provjera binarne pretrage za niz koji sadri 32768 lanova. 4. Kako interpolacijska pretraga pronalazi srednji element odnostno pivot ?

11

POPIS SLIKA 1. Zavisnost vremena o broju lanova niza kod sekvencijalne pretrage 2. Ilustracija binarne pretrage 3. Interpolacija indeksa middle 2. 5. 8.

12

LITERATURA

[1] [2] [4]


[5]

http://algoritam.org/category/ostalo/cpp-programiranje http://en.wikipedia.org/wiki/Interpolation_search
http://en.wikipedia.org/wiki/Binary_search_algorithm http://en.wikipedia.org/wiki/Linear_search

[6] [7]

upi H.: Algoritmi i strukture podataka (skripta) Pjani E.:Algoritmi i strukture podataka (skripta)

13

You might also like