You are on page 1of 19

SVEUILITE U ZAGREBU

FAKULTET ORGANIZACIJE I INFORMATIKE


VARA D I N

Darko unec

RASPRENO ADRESIRANJE
SEMINARSKI RAD

Varadin, 2014.

SVEUILITE U ZAGREBU
FAKULTET ORGANIZACIJE I INFORMATIKE
VARA D I N

Darko unec
Redoviti student
Broj indeksa: 41885/13-R
Smjer: Informacijski sustavi
Preddiplomski studij

RASPRENO ADRESIRANJE
SEMINARSKI RAD

Varadin, studeni, 2014

Sadraj
1. UVOD.........................................................................................................................................................................1
2. BINARNO PRETRAIVANJE...............................................................................................................................2
2.1. ALGORITAM BINARNOG PRETRAIVANJA.............................................................................................................2
2.2. PRIMJER BINARNOG PRETRAIVANJA...................................................................................................................3
3. RASPRENO ADRESIRANJE...............................................................................................................................4
3.1. IDEJA IDEALIZACIJA..........................................................................................................................................4
3.2. REALNOST...........................................................................................................................................................4
3.3. NAJGORI MOGUI SLUAJ RASPRENOG ADRESIRANJA.......................................................................................5
3.4. PREDNOSTI RASPRENOG ADRESIRANJA..............................................................................................................5
4. PRIMJERI RASPRENIM ADRESIRANJEM....................................................................................................6
4.1. PRIMJERI SPREMANJA PODATAKA........................................................................................................................6
4.2. PRIMJERI PRETRAIVANJA PODATAKA..................................................................................................................8
4.2.1. Primjer 1.....................................................................................................................................................8
4.2.2. Primjer 2.....................................................................................................................................................9
4.3. PRIMJERI BRISANJA PODATAKA..........................................................................................................................10
5. IMPLEMENTACIJA RASPRENOG ADRESIRANJA....................................................................................11
5.1. UPIS VRIJEDNOSTI PO RELACIJI..........................................................................................................................11
5.2. UPIS VRIJEDNOSTI PO RELACIJI SA PRELJEVOM.................................................................................................12
5.3. PRETRAIVANJE.................................................................................................................................................13
5.4. PRETRAIVANJE POSLIJE BRISANJA....................................................................................................................14
6. ZAKLJUAK.........................................................................................................................................................15
LITERATURA............................................................................................................................................................16

1. Uvod
U ovom seminarskom radu pokuat u poblie opisati i objasniti raspreno adresiranje.
Do sada smo nauili jedno od najbrih pretraivanja binarno pretraivanje (BinSearch). Na
samom poetku seminara detaljno u razraditi binarno pretraivanje kako bi lake mogli shvatiti
raspreno adresiranje. Vidjet emo da raspreno adresiranje moe biti daleko bre i efikasnije od
binarnog pretraivanja, te zbog toga ima znaajnu ulogu u svijetu programiranja. Nakon to
objasnim binarno sortiranje, opisat u princip rada rasprenog adresiranja, navesti njegove
prednosti i nedostatke te na kraju samu implementaciju u programskom jeziku c++.

2. Binarno pretraivanje

2.1. Algoritam binarnog pretraivanja


Binarno pretraivanje moemo protumaiti kao metodu podijeli pa ovladaj.
Algoritam binarnog pretraivanja daleko je bri od slijednog pretraivanja, ali ga mnogi ne
koriste zbog malo vee sloenosti algoritma. Vano je spomenuti da prije nego to radimo
binarno pretraivanje, polje koje pretraujemo mora biti sortirano. Kad shvatimo princip
sortiranja bit e nam jasno zato polje mora biti sortirano.
Ukratko opisani koraci izvedbe algoritma:

Pronalazim
o centralni
element

Odbacimo
polovicu
liste

Pretrauje
mo drugu
polovicu

Traimo
dok ne
pronaem
o ili ostane
samo
jedan
element

Kao to je prikazano u kratkoj izvedbi algoritma binarnog pretraivanja, vidimo da prvo


pronalazimo centralni ili sredinji element tkz. pivot. Kada imamo srednji element tada vrimo
usporedbu, dali je traeni element vei ili manji od srednjeg elementa. Ako je traeni elemen
manji od pivota onda odbacijemo drugu (s veim vrijednostima) polovicu, u sluaju da je traeni
element vei onda odbacujemo lijevu (s manjim vrijednostima). Ostaje nam jedna polovica te se
taj postupak opet ponavlja sve dok ne doemo do traene vrijednosti ili ako ne ostane nita to
znai da traeni element ne postoji u tom polju.

2.2. Primjer binarnog pretraivanja


Kao to sam ve bio napomenuo, ovo pretraivanje zahtjeva sortiranost podataka i ako je
taj zahtjev ispunjen algoritam radi sljedee. Na primjer uzimamo da imamo 200 posudica .

Pretpostavit emo da su posudice numerirane brojevima od 1 do 200. U svakoj posudici se nalazi


jedan podatak. Posudice su sortirane, to znai da je prva posudica numerirano brojem jedan,
druga brojem dva...i zadnja posudica brojem dvijesto. Trait emo posudicu s brojem 47. Kod
prvog otvaranja itamo podatak 100 koji se nalazi na sredini (srednjoj posudici) tkz pivot. Taj
podatak se usporeuje s traenim. Ako je traeni broj manji onda idemo na lijevu polovicu, ako
je traeni podatak vei idemo na desnu polovicu. Polje u kojem traimo nama se u prvom koraku
smanjilo na pola. Za svaki korak se polje smanjuje na pola.

100

200

50

100

25

36

50

36

43

50

43

46

46

47

48

49

50.

46

47

48

25

50

50.

47

Na kraju je pivot zapravo traeni broj. Slijednim pretraivanjem prije pronalaska broja trebalo bi
proi 46 provjera.

3. Raspreno adresiranje
3.1. Ideja idealizacija
Ovaj algoritam polazi od jedne injenice, a to je da znamo relaciju koja povezuje traeni
podatak i njegovu lokaciju. Ukoliko to primjenimo na prijanjem primjeru sa posudicama onda
dobijemo relaciju broj_posudice = broj_vrijednosti. Sama idealizacija ovog algoritma je da
traenom podataku pomou relacije odredimo poloaj i jednostavno provjerimo da li je on
zapravo tamo ili uope ne postoji. Ukoliko traimo vrijednost 47 kao i u binarnom pretraivanju,
onda pomou relacije broj_posudice = broj_vrijednosti dolazimo da je broj posudice 47.
Provjerimo tu kutiju i pronalazimo da se u kutiji pod brojem 47 nalazi vrijednost 47, ili ako nema
u kutiji 47 te vrijednosti dolazimo do zakljuka da traeni podatak ne postoji. Za razliku od
binarnog pretraivanja gdje smo kutije otvarali 8 puta, ovdje smo otvorili kutiju samo jednom.

3.2. Realnost
U realnosti se ovakva idealizirana ideja i idealizirani postupak pretvori u neto
kompliciranije. Jedna od mogunosti je da imamo npr. 200 jaja (podataka) , a 100 posudica.
Tada emo morati u svaku posudicu staviti po dva jaja. Mogli bismo ustanoviti jednostavnu
relaciju: broj posudice = zaokrui (broj jaja/2). Sada bismo pri traenju odreenog jaja morali
nakon to otvorimo posudicu provjeravati dvaput za oba jaja koja se nalaze u posudici. Kada ve
znamo koja je posudica u pitanju, puno je lake provjeriti jaja koja se nalaze u njoj nego stalno
traiti od posudice do posudice i pogaati gdje bi mogao biti taj podatak (jaje).
Jo jedna kompliciranija situacija je kada imamo 200 jaja, a sa brojevima od 1 do 300. Broj
posudica je 100, a relacija je broj posudice zaokrui (broj na jaju / 3). Takvom relacijom e
svako jaje biti poslano u jednu od 100 posudica koje su nam na raspolaganju. Kada imamo 200
jaja, u svaku bi posudicu trebali staviti po dva jaja.
Kada razmiljamo kako bismo uope postavili jaja u posudice, tako da prije navedena relacija
bude zadovoljena. Uzmimo za primjer da su neki od brojeva na jajima 100, 150, 21, 70, 20, 22,
Prvo jaje je sa brojem 100, pa on ide u posudicu 100/3 = 33., sljedee jaje je s brojem 150,
to znai da ide u posudicu 50, jaje s brojem 21 u 7. posudicu, broj 70 u 23. u posudicu 20, 22 u
7. Sada u sedmoj posudici imamo dva jaja i nema vie mjesta za nova jaja. Kada imamo sluaj
da bi tri jaja trebala ii u istu posudicu, to ne bi bilo mogue. Tada se jaje pokua smjestiti u

prvu sljedeu slobodnu posudicu, iako joj tamo zapravo ni nije mjesto. Ta odluka kasnije utjee
na to kako emo vriti pretraivanje. Kada spremamo neki broj u odreenu posudicu, a ona je
ve puna, taj broj se sprema u prvu slobodnu posudicu. Kada mi traimo taj broj, traimo ga u
posudici gdje bi logino trebao biti taj broj. Ako je ta posudica puna, a u njoj se ne nalazi traeni
broj, pretpostavljamo da je traeni broj zapisan u sljedeoj posudici jer je ova puna. Idemo na
sljedeu posudicu i tako dalje sve dok ne pronaemo ili doemo do posudice koja ima slobodno
mjesto, a u nju nije zapisan traeni broj. To znai da traeni broj ne postoji.

3.3. Najgori mogui sluaj rasprenog adresiranja


Problem je ako dopustimo brisanje podataka, tj ako pronaemo jaje sa odreenim brojem,
da ga uzmemo iz posudice. To je najgori mogui sluaj rasprenog adresiranja. Npr. da smo pri
popunjavanju posudica stavili jaje s brojem 22 u posudicu broj 7, no nismo mogli jer je bila
puna. Tada smo jaje uspjeli pohraniti u posudicu broj 8. Pri tome se u posudici 7 nalaze brojevi
20 i 21. Kada obavimo prvo traenje za jajom broj 20, pronalazimo ga u posudici 7 i vadimo.
Sada vidimo da je u posudici broj 7 samo jaje broj 21 te posudica nije vie puna. Nakon toga
potraimo broj 22 i gledamo u sedmoj posudici te ga tada nema, ali posudica nije popunjena.
Sada vie ne smijemo zakljuiti da jaje ne postoji jer se on nalazi u sljedeoj posudici. Znai,
doputeno je vaenje podataka to u stvarnim aplikacijama znai brisanje podataka, no pri
traenju podataka se nuno moraju provjeriti sve raspoloive lokacije, znai u naem sluaju sve
posudice.

3.4. Prednosti rasprenog adresiranja


U svim ovim navedenim primjerima vidjeli smo kakvi se sve sluajevi mogu pojaviti kod
rasprenog adresiranja:

upis vrijednosti po relaciji


upis vrijednosti po relaciji (preljev)
pretraivanje podataka
brisanje podataka
pretraivanje podataka poslije brisanja

Kad bi ovo trebali realizirati, prvi primjer bi nam bio najlaki, dok zadnji najtei. No relacija
koja nam daje priblinu lokaciju kod pretraivanja nam uvelike ubrzava proces traenja jer ne

moramo pogaati gdje se podatak nalazi dok npr. kod binarnog stabla nemamo ni priblinu
lokaciju gdje se nalazi podatak. Zatim, podatke koje imamo ne trebamo sortirati jer je to
relativno spor posao, ve ih je dovoljno spremati po nekoj logici (relaciji) to je daleko bre.
Kada vrijednosti grupiramo u posudice, kod pretraivanja itamo cijelu posudicu, i dalje nam je
postupak brz, jer je rad s memorijom puno bri od rada sa diskom. Zato je isplativije proitati
odjednom n podataka (ovisno koliko ih stane u posudicu) nego n puta itati svaki podatak
zasebno. Moemo postavit pitanje kako odrediti veliinu posudice.

4. Primjeri rasprenim adresiranjem


4.1. Primjeri spremanja podataka

Npr. imamo 10 posudica te niz vrijednosti 6,8,10,6,5... U svaku posudicu moemo spremiti po
dvije vrijednosti. Spremanje podataka bi se odvijalo ovako :
Broj_ posudice = zaokrui(6/2)

Broj_ posudice = zaokrui(3) = 3

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

Broj_ posudice = zaokrui(8/2)

Broj_posudice = zaokrui(4) = 4

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

Broj_ posudice = zaokrui(10/2)

Broj_ posudice = zaokrui(5) = 5

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

10

Broj_ posudice = zaokrui(6/2)

Broj_ posudice = zaokrui(3) = 3

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

6,6

10

Broj_ posudice = zaokrui(5/2)

Broj_ posudice = zaokrui(2.5) = 3

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

6,6

8,5

10

Kao to je prikazano u tablici, moe doi da vrijednost po relaciji spada u posudicu koja je ve
poprimila dvije vrijednosti. Neka od rjeenja ovakvih sluajeva je da se vrijednost sprema u prvu
sljedeu posudicu koja nije popunjena do kraja. Time smo naruili relaciju koju smo si zadali
prije no kod pretraivanja dobijemo priblinu lokaciju gdje bi se vrijednost mogla nalaziti.

4.2. Primjeri pretraivanja podataka

4.2.1. Primjer 1

Ukoliko elimo sada pretraivati te podatke koji su raspreno adresirani u memoriju


pomou relacije broj_posudice = zaokrui (broj_vrijednosti/2) dolazimo do sljedeeg postupka
(mi traimo vrijednost 5) :
Broj_posudice = zaokrui(5/2)

Broj_posudice = zaokrui(2.5) = 3

Po relaciji vrijednost 5 se treba nalaziti u posudici broj 3 pa stoga pristupamo posudici 3 i itamo
obje vrijednosti iz nje.
Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

6,6

8,5

10

Ne pronalazimo traenu vrijednost, ali poto je kapacitet posudice pun, prelazimo u sljedeu
posudicu.

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

6,6

8,5

10

Nakon to proitamo obje vrijednosti iz sljedee posudice pronali smo traenu vrijednost. U
ovom primjeru vrijednost iz memorije itamo 4 puta to je prihvatljivo.

4.2.2. Primjer 2

Sljedei primjer pretraivanja je kada traimo vrijednost koja se ne nalazi u posudicama.


Npr. traimo vrijednost 7 u posudicama. Po relaciji ta vrijednost bi se trebala nalaziti u posudici
broj 4.
Broj_ posudice = zaokrui(7/2)

Broj_ posudice = zaokrui(3.5) = 4

Pretraivanje se vri sljedeim algoritmom :

1) Broj_ posudice = 4 po zadanoj relaciji


2) Otvori posudicu [broj_ posudice]
3) Ako se vrijednost 7 nalazi u posudici-> vrati true (1)
4) Ako se vrijednost 7 ne nalazi u posudici
a. Ako je posudica puna -> Broj posudica poveaj za 1 i vrati se na korak 2
b. Inae vrati false (0)
Grafiki to moemo prikazati na ovaj nain:
Provjeravamo posudicu 4 jer bi se vrijednost 7 po relaciji trebala nalaziti u posudici broj 4 pa
otvorimo tu posudicu i vidimo da se vrijednost 7 ne nalazi unutra, ali poto je posudica puna
otvaramo sljedeu.
Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

6,6

8,5

10

Kada otvorimo sljedeu posudicu vidimo da se vrijednost 7 ne nalazi unutra te da ona nije puna
to nas dovodi do zakljuka da se vrijednost 7 ne nalazi u posudicama.
Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

6,6

8,5

10

4.3. Primjeri brisanja podataka


Postoji mogunost da kada pronaemo neki podatak da ga elimo obrisati. Kakve
posljedice ima to na traenje? Jednim brisanjem vrijednosti iz posudice moemo upropastiti
cijelu relaciju. Brisanje vrijednosti koja se ne nalazi u punoj posudici nam ne naruava relaciju,
no ukoliko briemo neku vrijednost koja se nalazi u punoj posudici dolazimo do sljedeeg:
Traimo vrijednost 6 koja se po relaciji treba nalazit u posudici broj 3.
Broj_posudice = zaokrui(6/2)

Broj_posudice= zaokrui(3) = 3

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

6,6

8,5

10

Kada smo pronali traenu vrijednost, nju izbriemo te nae posudice izgledaju ovako:

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

8,5

10

No ukoliko elimo poslije brisanja opet pretraivat posudice i to vrijednost 5 dolazimo do


sljedeeg problema. Po relaciji vrijednost 5 bi se trebala nalaziti u posudici broj 3.
Broj_posudice = zaokrui(5/2)

Broj_posudice = zaokrui(2.5) = 3

10

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

Posudica

10

8,5

10

No poto smo izbrisali vrijednost 6 iz posudice 3 sada nam posudica vie nije puna i po
algoritmu pretraivanja dolazimo do zakljuka da se vrijednost 5 ne nalazi u nijednoj posudici
to u naem primjeru nije istina. Ovaj problem bi se mogao rijeiti na vie naina. Npr,
uvoenjem brisanja vrijednosti moramo pretraivati sve posudice to je zapravo slijedno
pretraivanje i tada raspreno adresiranje nema efekta jer relacija po kojoj smo spremali podatke
nam ne slui. Prema mojem miljenje rjeavanja ovog problema je da kada izbriemo neku
vrijednost iz pune posudice da ga ne izbriemo, nego ga zamijenimo nekom neutralnom
vrijednou. Ta neutralna vrijednost se nikada ne bi pretraivala ali bi posudica i dalje bila puna i
pretraivanje po relaciji bi i dalje radilo.

5. Implementacija rasprenog adresiranja


5.1. Upis vrijednosti po relaciji
Na poetku moramo definirati strukturu koja e nam sluiti kao posudica. Imat emo 100
posudica imenom Data[100] koja sadri dva podatka, ime i prezime, a sprema se na temelju
kunog broja. Uzeo sam primjer kunog broja zato jer ne postoje isti kuni brojevi. Pa nam stoga
struktura izgleda:
struct {
char ime[20];
char prezime[20];
} Data[100];

Kod za upis vrijednosti po relaciji kucni_broj=podatak[kucni_broj]. Varijabla upisano nam sluzi


da znamo da li nam je ve upisano ime i prezime za taj kuni broj.

11

Napomena : kuni brojevi su ogranieni vrijednostima od 1 do 99.

do{
cout <<"Unesite kucni broj";
cin >>a;
if(a<1||a>99) cout <<"Kucni brojevi su moguci samo od 1 do 99\n ";
}while(a<1 || a>99);

cout <<"Ime: ";


cin >>Data[a].ime;
cout <<"Prezime: ";
cin >>Data[a].prezime;

5.2. Upis vrijednosti po relaciji sa preljevom


Kod upisa imamo jo jednu varijablu u strukturi tipa bool. Varijabla upisano nam slui da znamo
da li nam je ve upisano ime i prezime za taj kuni broj.
struct {
char ime[20];
char prezime[20];
} Data[100];

12

Kod za upis sa preljevom izgleda ovako:


do{
cout <<"Unesite kucni broj";
cin >>a;
if(a<0||a>100) cout <<"Kucni brojevi su moguci samo od 1 do 99\n ";
}while(a<1 || a>99);

while(1){
if(Data[a].upisano==false)break;

// provjera da li ve postoji zapisa na kunom broju

a++;
}
cout <<"Ime: ";
cin >>Data[a].ime;
cout <<"Prezime: ";
cin >>Data[a].prezime;
Data[a].upisano=true;

5.3. Pretraivanje
Za pretraivanje imamo dva sluaja. Ili se podatak nalazi sa preljevom ili bez preljeva u kutiji, ili
ga nema. Stoga moemo kod za pretraivanje realizirati ovako:
int b;
bool petlja=true;

13

char ime[20];
do{
cout <<"Unesite kucni broj koji zelite provjeriti";
cin >>b;
if(Data[b].upisano==true){
cout <<"Unesite ime koje zelite provjeriti pod tim kucnim imenom: ";
cin.ignore();
cin.getline(ime,20);
do{
if(!(strcmp(Datab].ime,ime))){
cout <<"Pronaen je va upit\n";
cout <<"kucni broj " <<b;
cout <<"\nIme " <<Data[b].ime;
cout <<"\nPrezime " <<Data [b].prezime;
petlja=false;
break;
}
else b++;
}while(Data[b].upisano==true);
}
if (petlja){cout <<"Nije naen nijedan zapis pod tim kucnim brojem\n"; break;}
}while(petlja);
Na poetku unosimo kuni broj za koji elimo traiti zapis. Ako je varijabla upisano u tom
zapisu false, odmah ispiemo da nije naen ni jedan zapis pod tim kunim brojem. Ukoliko
imamo neki zapis pod tim kunim brojem, tj varijabla upisano pod tim kunim brojem je true,
onda pretraujemo svaki kuni broj koji ima zapis poslije toga. Ukoliko ga pronaemo, ispiemo
ga, a ukoliko ga ne pronaemo ispiemo da nema nijednog zapisa.

5.4. Pretraivanje poslije brisanja.

14

Kod brisanja imamo isti programski kod kao kod pretraivanja sa opcijom brisanja. Kad
bi pronali traeni kuni broj i eljeli ga obrisati onda bi samo ime (varijabla po kojoj se trai)
promijenili u neki neutralni zapis (npr. 00000)a varijabla upisano bi ostala istinita zbog
pretraivanja. Tako bi izbjegli onaj problem sa relacijom pa bi mogli pretraivat. Kod za
pretraivanje poslije brisanja bi ostao isti kao i kod pretraivanja prije.

6. Zakljuak
Na kraju ovog seminarskog rada mogu zakljuiti da raspreno adresiranje ima veliku
ulogu kod brzine pretraivanja kad imamo velike koliine podataka. Na mojim primjerima su
male koliine podataka pa da i koristimo najsporije pretraivanje to ne bi imalo nekakav veliki
utjecaj, no ukoliko imamo jako puno podataka vrijeme pronalaska podataka se drastino
smanjuje pa ak i u odnosu sa binarnim pretraivanjem. Ako ve ne pronae tonu lokaciju
traenog podatka, predost je to je taj podatak uvijek negdje u blizini. Kada razmiljemo, disku
nije problem pristupiti jednom sektoru i itati nekoliko sektora za redom. Puno vei problem mu
stvara nasumino itanje razliitih sektora zbog pomaka glave po disku.
Mislim da bi se ovo adresiranje trebalo vise koristiti u operacijskim sustavima jer je po
mojem miljenju jako korisno imati brzo pretraivanje. Idealno bi bilo da u svakoj posudici
imamo po jedan podatak ili nekoliko njih i imati relaciju koje ne dozvoljava mnogo preljeva
kako bi pretraivanje bilo to bre.

15

Literatura

1. http://grube.web.srk.fer.hr/marcupic/CTips/RasprsenoAdresiranje.html
2. http://www.mathos.unios.hr/~isimic1/wp-isimic/zadaca_1/binarno.html
3. http://razno.sveznadar.info/02-2razred/5-Algoritam/5-BinarnaPretraga.htm
4. http://fly.srk.fer.hr/~gbaotic/asp/zavrsni14.pdf
5. http://bib.irb.hr/datoteka/443064.ZRIvaBrajer.pdf

16