SPA Usmeni

You might also like

Download as odt, pdf, or txt
Download as odt, pdf, or txt
You are on page 1of 13

Krutove transformacije: transformisu sumu stabla u jedno binarno stablo

1.
2.
3.
4.

Povezu se koreni svih stabala


izbrisu se sve veze izmedju roditelja i dece izuzev krajnje leve veze
Povezu se sva deca roditelja
Slika se rotira za 45 stepeni u desno i dobija se transformisano stablo

Sortiranje nizova:
1. Da su podaci na neki nacin numerisani, tj. da su smestani od prvog do n-tog podatka u niz,
listu,...
2. Da nam je dato totalno uredjenje prema kome zelimo da uredimo elemente. To moze biti
leksikografsko ili neko algebarsko uredjenje

Sortiranje selekcijom: Krecemo od elementa a1 i trazimo najmanji element liste koji ce sa


njim zamniti mesto. Potom se pomeramo na a2 i poredimo ga sa svim elementima nakon njega, da
bi pronasli najmanji od tih elemenata. Postupak nastavljamo dok ne dodjemo do kraja liste.
Ako zelimo da premestimo promenljivu ai uvodimo promenljivu min koja sluzi za cuvanje indeksa
najmanje vrednosti ai i elemenata koji ga slede. Pocinjemo od min = 1 i uporedjujemo ostale
elemente sa amin. Kada stignemo do poslednjeg elementa razmenimo ai sa a min i idemo na ai+1.
Napomena: broj poredjenja je n(n-1)/2. Kompleksnost algoritma je n^2.
void zameniMesta(int* niz, int i1, int i2)
{
static int bafer;
bafer = niz[i1];
niz[i1] = niz[i2];
niz[i2] = bafer;
}
void sortiranjeSelekcijom(int* niz, int n)
{
int i, j;
int najmanji, indeksNajmanjeg;
for(i=0; i<n; i++)
{
najmanji = niz[i];
indeksNajmanjeg = i;
for(j=i+1; j<n; j++)
{
if(niz[j] < najmanji)
{
najmanji = niz[j];
indeksNajmanjeg = j;
}
}
if(indeksNajmanjeg != i)
{ zameniMesta(niz,i,indeksNajmanjeg); }
}
}

Bubble sort: mali brojevi kao da isplivaju na vrh (na pocetak liste). Polazimo od kraja liste i
uporedjujemo dva elementa pomerajuci manji u levo. Potom manji element uporedimo sa
elementom sa njegove leve strane i ako je manji, zamenimo im mesta. Postupak nastavimo dok ne
dodjemo do krajnjeg levog elementa liste. Sada ponovo postupak ponavlamo sa desne strane dok ne
dodjemo do drugog elementa liste, cime na 2. poziciju izbija 2. najmanji element liste. Proces
nastavljamo sve dok ne sortiramo celu listu.
Problem: kroz listu se prolazi u suprodnom smeru (od poslednjeg ka prvom elementu) i nije
efikasan za velike nizove. Mada kroz listu mozemo krenuti i od prvog elementa ali onda najveci
pomeramo na kraj.
Napomena: kompleksnost algoritma je n^2.

Merge sort (Sortiranje ucesljavanjem):


Prednost: Jednostavna primena, efikasan na malim skupovima podataka
Deljenje liste elemenata na polovine sve dok ne postane lista jednoelementnih delova
(Jednoelementni niz se smatra sortiranim). Sada se uporedjuju oni elementi koji su razdvojeni (po
grupama), grupe se spajaju i sortiraju se. Ako je vise elemenata po grupi uporedjuje se prvi sa
prvim, manji se stavlja u novu listu. Prethodno uporedjivan sa narednim iz druge grupe, itd do
poslednjeg elementa u grupi. Takvim spajanjem grupa gobijamo sve vece i vece grupe , dok na
kraju ne dobijemo sortirani niz.
PROCEDURE Merge(l, m,r)
Neka je A = {al, al+1, . . . am} i B = {am+1, am+2, . . . ar}
i neka je C nova ueljana lista.
iF obe liste A i B sadre elemente THEN uporedititi prve i ukloniti manji od njih
Dodati uklonjeni element na kraj liste C.
iF jedna od A i B je prazna THEN
ostatak neprazne liste dodati listi C.
Promeniti imena elemenata liste C = {al, al+1, . . . ar}
PROCEDURE MergeSort(l, r)
iF l < r THEN m == [(l + r)/2]
Call MergeSort(l, m)
Call MergeSort(m + 1, r)
Call Merge(l, m,r)

insert sort (sortiranje umetanjem): elementi podataka se uzimaju jedan po jedan i


stavljaju na odgovarajuce mesto, u vec formiranu listu. Svi elementi levo od umetnutog moraju biti
manji od njega, dok su svi desno od njega veci.
Dakle uzima se svaki put naredni element liste i krece u proveru od prvog elementa liste. Ako je
broj koji uporedjujemo veci od tekuceg, pomerimo tekuci za jedno mesto sve dok element koji
uporedjujemo ne bude veci od tekuceg elementa Ako je veci od tekuceg, pomeramo sve elemente
iza tekuceg za jedno mesto i na tu upraznjenu poziciju smestamo element koji uporedjujemo.
Napomena: u najgorem slucaju isti broj koraka kao Bubble sort (n^2)
Najgori slucaj: da su elementi sortirani u obrnutom redosledu najvise vremena ce utrositi.
37495261
37495261

for (c = 1 ; c <= n - 1; c++)


{
d = c;

37495261
while ( d > 0 && niz[d] < niz[d-1])
{
t = niz[d];
nizd] = niz[d-1];
niz[d-1] = t;

34795261
34795261
34579261

d--;
23457961

}
}

23456791
12345679

Zavadi pa vladaj: Tehnika razbijanja skupova na osnovne skupove, izvrsavanje operacija nad njima
i njihovo ponovno spajanje.

Quick sort algoritam (Algoritam brzog sortiranja): definise se rekurzivno. Princip


rada je podeli pa vladaj.
Uzima se poslednji element liste i sve brojev manje ili jednake njemu pomeramo levo od njega, a
sve brojeve vece od njega pomeramo desno od njega. Novodobijenu listu manjig ili jednakih
elemenata elementu a1 oznacavamo sa S1, a vecig sa S2. Primenjujuci postupak brzog sortiranja na
listi S1, od S1 dobijamo dve liste S11 i S12. Ponavljamo procaduru na listi S11 i tako dok ne
dobijemo neko Sx, koje ce se podeliti dalje na Sx1 i na Sx2, pri cemu je Sx1 ili sortiran ili prazan.
Zatim prelazimo na Sx2, Sy1, Sy2 itd.
Kada se leva i desna strana neke liste sortiraju, vracamo se na listu kojoj ona predstavlja levu i
desnu stranu i primenjujemo istu proceduru.
(Wikipedia): Uzima se jedan element niza koji se naziva pivot-element. Obicno je taj element iz
sredine niza. Element se stavlja na kraj niza i pocinje uporedjivanje. Pivot-element se uporedjuje
redom sa svakim elementom od prvog. Svi elementi koji su manji ili jednaki pivotu idu levo, a svi
elementi veci od pivota idu desno. Sada smo dobili konacno mesto pivot elementa u nizu (svi manji
od njega su levo/ veci desno, dakle on mora da stoji na toj poziciji). Dobili smo sada levo od pivota
jedan niz, i desno od pivota drugi niz. Uzmimo sada levi niz. Opet uzimamo jedan sredisnji element
levog niza koji postaje pivot-element, postavljamo ga na kraj te leve polovine niza i i poredjujemo
sa elementima te leve polovine niza na isti nacin kao sto je prethodno opisano, cime cemo dobiti
konacni raspored sadasnjeg pivot-elementa (svi manji od njega su levo od njega, a veci od njega su
desno od njega). Saada je ta leva polovina liste podeljena na jos jednu levu i desnu polovinu liste,
opet se odredjuje pivot element i vrsi sortiranje sve dok ne ostane jedan element koji ne moze da se
podeli na dve liste i njegovo mesto je vec jedinstveno odredjeno u listi. Sada se isti postupak
primeni i na desnoj polovini liste, cime se dobija sortirana lista.
void quicksort(int x[10],int first,int last){
int pivot,j,temp,i;
if(first<last){
pivot=first;
i=first;
j=last;
while(i<j){
while(x[i]<=x[pivot]&&i<last)
i++;
while(x[j]>x[pivot])
j--;
if(i<j){
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
}
temp=x[pivot];
x[pivot]=x[j];
x[j]=temp;
quicksort(x,first,j-1);
quicksort(x,j+1,last);
}
}

Matematicki algoritmi: osnovne metode iz aritmeticke I numericke analize, za resavanje


raznih matematickih problema.
Brzina izvrsavanja programa:
Vreme je konstantno: ako sve instrukcije imaju osobinu da se vecina instrukcija izvrsava
jednom ili samo nekoliko puta u toku programa
log n program se izvrsava malo sporije nego sto n raste (program koji velike probleme
resava tako sto ih sece na manje, I to nekim konstantnim razlomkom)
n liearno izvrsenje programa (obrada svakog ulaznog podatka)
n log n problem se resava razlaganjem na manje probleme koji se nezavisno resavaju, a
potom se kombinuju njihova resenja
n^2 kvadratno vreme (dvostruko ugnjzdene petlje, parovi elemenata,...)
n^3 trostruke petlje (n duplira, vreme se osmostrucuje; trostruke petlje,...)
2^n eksponencijalno vreme izvrsavanja (veoma neprakticni)

Najcesce greske:
1. brzi algoritmi su komplikovaniji za razumevanje impleentatori prihvataju sporiji a
jednostavniji algoritam
2. za neki problem koji se sao jednom pokrece utrosi se mnogo vremena za implementaciju I
debagiranje algoritma

Algoritam:

Precizno objasnjavanje postupka za resavanje nekog problema


Iz definisanih objekata, jednoznacno odredjenim koracima dobijamo zavrsni objekat tj.
rezultat
Svaki korak opisan je instrukcijom
Algoritamski proces je rad algoritma
Za algoritam kazemo da je upotrebljiv ako mozemo dobiti rezultat u konacnom vremenu
Osnovni problem: SLOZENOST!

Slozenost kod algoritama se resava uvodjenjem detalja. Detalji se zanemaruju na nekom nivou,
kakko bi se broj koncepata sveo na razumnu meru.
Apstrakcije: opis problema gde su svesno uklonjeni detalji
(Razlicite apstrakcije uklanjaju I prikazuju razlicite stvari; pr. Autobuska mapa)
Konkretizacija: suprotno od apstrakcije. Oznacava detaljisanje.
(Implementacija apstrakcije je njena konkretizacija na nekom nivou)
pr. mapa grada mapa gradskog prevoza mapa nocnog prevoza
Podatak je nosilac informacije.
Informacija je protumaceni podatak.

Nacini apstrakcije podataka:


1. Klasifikacija
2. Agregacija
3. Generalizacija

1. Klasifikacija

Svi objekti istih osobina se klasifikuju u jedan tip kako bi se dodatno smanjio broj koncepata
tj kako bi se umanjila slozenost
Tip podataka je skup vrednosti I operacija nad njima
Prema nacinu implementacije, tipovi podataka se dele na:
1. Fizicki tipovi (tipovi podrzani od strane racunara: int, char, float, )
2. Jezicki (virtuelni) tipovi (podrska od strane jezika: nizovi, zapisi,...)
3. Apstraktni tipovi podataka (ATP)
(Prosirenje skupa tipov: student, radnik,...)
Prema slozenosti:
1. Prosti (primitivni tipovi)
2. Slozeni (strukturni) tipovi : strukture podataka
(Nastaju agregiranjem drugih tipova)

2. Agregacija: agregiranjem vise tipova u slozeniji tip. Objkti u strukturi mogu biti
razlicitog tipa.

3. Generalizacija I specifikacija
Program: opis algoritma koji u nekom programskom jeziku jednoznacno odredjuje sta racunar
treba da uradi.

Programiranje: ucenje sintakse jezika, pisanje algoritama za resenje problema.


ALGORITMI + STRUKTURE PODATAKA = PROGRAMI
pr. za polinome
pr. za sabiranje I mnozenje matrica

Rekurzija:
1. Definisemo f-ju za pocetnu vrednost a (a=0 ili a=1)
2. Kada je f-ja definisana za k >= a, mozemo da je definisemo za k+1
pr. n!
pr. Fibonacijev niz
pr. Hanojska kula

pr. Katalanovi brojevi


1. Konveksni poligon sa n+2 strane ce se raseci na Cn trouglova
2. Potpuno binarno stabolo gde svaki cvor ili ima dvoje dece ili nema dece
3. Broj nacina da se n zagrada ubaci u izraz

Balansirano = AVL stablo

BST stablo kod koga za svaki vor vai da se visina njegovog levog i desnog podstabla ne
razlikuje za vie od 1 se naziva visinski balansirano stablo ili AVL stablo

Binarno stablo kod koga je resen problem pretrazivanja I ima efikasnost O(log n)

Ima modifikovane algoritme za ubacivanje I izbacivanje iz stabla zasnovane na rotacijama


(rotacija u levo I rotacija u desno)

Rotacije menjaju visinski debalans stabla (Rotacija na levo povecava debalans u korist levog
podstabla, rotacija na desno povecava debalans u korist levog podstabla)
Rotacije se koriste kod ubacivanja elemenata:
Kada se narusi balans I stvori se debalans na jednos strani, koristi se odgovarajuca
rotacija kako bi se balans uspostavio
Rotacija je uvek suprotna debalansu, kako bi se uspostavio balansirano
(ako je debalans levo koristi se desna rotacija I obrnuto)

Ubacivanje u AVL:
1. Ubacuje se cvor na isti nacin kao u BST
2. Za svaki cvor u stablu se proverava njegov debalans tj razlika visina levog I desnog podtabla
3. Ako postoji debalans onda se vrsi odgovarajuca rotacija oko cvora k. Cvor k je najblizi cvor
cvoru koji smo ubacili.
4. Ako je oznaka debalansa deteta vora k suprotna, onda se pre rotacije iz koraka 3, vri
suprotna rotacija oko tog deteta vora k.
(U ovom slucaju se vrse dve rotacije)

Izbacivanje iz AVL (postoje 3 slucaja):


1. Cvor je list : samo se izbaci
2. Cvor je polu-list: poveze se dete na roditelja
3. vor unutranji vri se zamena sa prethodnikom (sledbenikom) i svodi se na prva dva
sluaja
Ukoliko je stablo sada debalansirano, balansiranje se vrsi kao I kod ubacivanja cvora

Strukture podataka: slozeni tipovi podataka koji nastaju objedinjavanjem vise prostih tipova
podataka. Elementi u strukturi mogu biti prosti i slozeni, a medjusobno mogu biti u nekoj relaciji.
S = (E,p)
E skup elemenata strukture
p binarna relacija kojom je E uredjen (kardinalnost koliko elemenata odgovara jednom elementu
u datoj strukturi)
Svaka struktura podataka se dobija kao kombinacija neke od sledecih strukura podataka.

Na osnovu kardinalnosti relacija p, mogu se definisati:


1. kardinalnost relacije 0:0 (ne postoji uredjenje)
Tu spadaju KOLEKCIJE i SKUPOVI
-Elementi u strukturi nemaju medjusobni odnos, samo znamo da li neki element pripada
strukturi ili joj ne pripada
-U skupu nema ponavljanja elemenata / U kolekciji se mogu ponavljati elementima
2. kardinalnost relacije 1:1 (linearno uredjenje)
tu spadaju LINEARNE STRUKTURE (liste)
-Osim kod 1. elementa, svakom elementu prethodi jedan element
-Osim kod poslednjeg elementa. svakom elementu predstoji jedan element
3. kardinalnost relacije 1:M (linearno uredjenje)
tu spadaju STABLA
-osim korenu, svakom elementu prethodi tacno jedan element
-svaki element moze imati vise naslednika
4. kardinalnost relacije M:M (uredjeni elementi bez ogranicenja)
tu spadaju GRAFOVI i MREZE
-Svakom elementu moze prethoditi vise elemenata
-Iza svakog elementa moze slediti vise elemenata

Po mestu lokacije gde se vrsi ubacivanje elemenata:


1.
2.
3.
4.

Stack ubacivanje i izbacivanje sa istog kraja


Queue = red ubacivanje na jednom, izbacivanje na drugom kraju
Double queue = Deque = dvostruki red ubacivanje i izbacivanje na krajevima
List = lista ubacivanje ili izbacivanje bilo gde

1. Stack:

LiFO struktura (brise se element koji je najskorije ubacen)


Osnovne operacije:
Ubacivanje (push) //algoritme znamo...
izbacivanje (pop)
Vrati vrh (peek)
Prazan stek (Underflows)
Pun stek (Overflows)
broj elemenata

2. Queue = red:

FiFO struktura (brise se element koji nejduze u listi)


Jednostruki/Dvostruki red
Osnovne operacije:
Ubaci = insert (enqueue): element zauzima svoje mesto na repu //ubaci na kraj
izbaci = delete (dequeue): element se brise sa strane gde je glava //izbaci prvi
Ako je glava == rep, red je prazan:
kada je red prazan primena dequeue daje underdlow //nema sta da se izbaci
Ako je head[Q] = tail[Q] + 1, tada kazemo da je red pun, tj. Dopisivanje elementa ukazuje
na overflow //nema mesta za upis

Po nacinu implementacije:
1. Staticke strukture (Vektorske)
2. Dinamicke strukture (Ulancane strukture)

1. Staticke strukure:

Velicina memorije koja ce biti na raspolaganju se fiksira u kodu


Losa procena dovodi do nepotrebnog zauzeca memorije, sto kasnije moze izrokovati
nedostatak memorijskog prostora

2. Dinamicke linearne strukture:

Dinamicka alokacija memorije


Rezervise se tacno onoliko memorijskog prostora koliko nam je potrebno (kada se javi
potreba za novom memorijom ona se zauzme)
Kada dinamicki podaci vise nisu potrebni, zauzeta memorija se oslobadja

Pojam linearnog uredjenja:


Dat je konacan skup elemenata S = {a1, a2, , an}, pri cemu se posmatra konacan i uredjen niz
elemenata L = {b0, b1, , bk}

Definicija liste:
1. Prazna lista je lista
2. Lista se sastoji od 1. elementa tj glave liste i liste ostalih elemenata tj repa liste
3. Svaka lista se dobija primenom pravila 1. i 2. konacan broj puta

Definicija povezane liste:


To su strukture podataka ciji su objekti povezani prema linearnom uredjenju, a uredjenje je
organizovano pokazivacem na svaki objekat.

Forme povezanih listi:

jednostruko/dvostruko povezane liste


samo jedan pokazivac na proizvoljno odabranog sledbenika
sortirane ili ne
sortirane linearno uredjenje odgovara linearnom uredjenju kljuceva koji ukazuju na
pozicije gde su smesteni elementi liste
minimalni element zauzma mesto glave, maksimalni mesto repa
cirkularne ili ne
dva pokazivaca:
prev prethodni element
next sledeci elementa
prev glave pokazuje na rep dok next repa pokazuje na glavu

Pretrazivanje: prosto dovodljenje pokazivaca na poziciju prvog elementa kljuca k


//klasicna metoda za pretrazivanje JS/DS liste

Brisanje (seljenje) elementa iz liste:

ako je dat pointer udaljavamo pointer iz liste


ako je dat samo broj onda prvo vrsimo pretragu do tog broja, pa tek onda uklanjamo element
iz liste
brisanje u kruznoj listi moze biti olaksano ako dogovorom izuzmemo brisanje prvog i
poslednjeg elementa liste. Drugi nacin je uvodjenje strazara koji ce kontrolisati brisanje.
Straar je lani objekat koji nam dozvoljava da pojednostavimo granicne uslove. Ubacimo
straara NIL[L] izmedju glave i repa, tj. Neka next[NIL[L]] pokazuje glavu, a prev[NIL[L]]
rep. Takodje, next polje za rep i prev za glavu su prikazani sa NiL[L]. (algoritam pretrage)

Da bi ubacili kljuc u dinamicki skup predstavljen dvostruko povezanom listom moramo da


dodelimo pokazivac trenutno neiskoricenom objektu u reprezentaciji povezane liste (treba nam
pom). Ovo je korisno za skladitenje objekata koji nisu upotrebljeni u povezanoj listi, te mogu biti
dodeljeni.
U nekim sistemima postoji djubretar odgovoran da odredi koji su objekti beskorisni.
Slobodna lista je JS lista slobodnih objekata (ima samo next na sledeci element liste).
Svaki objekat ce imati reprezentaciju ili u listi ili u slobodnoj listi.
///////////////////fali uvodni deo o stablima/////////////////////////

Algoritmi problem za nalazenjem sto brzeg resenja problema


Zadovoljnost (Satisfiability) ili skraceno SAT je problem od najveceg znacaja.
Primer SAT problema: Data je Bulova formula u CNF formi i naci vrednost za koju ona ima true
rezultat.
Odgovor: treba ispitati za svako od slova (Eksponencijalan rast 2^n, posto za svako slovo 0/1).
imamo ulazne podatke od kojih treba dobiti resenje S. Resenje mora biti takvo da lako moze da se
proveri (da bude jasno, koncizno, odredjene duzine,...)
Ako zelimo da formalizujemo brzo pretrazivanje problem pretrazivanja mozemo definisati sa Q ,
uzimajuci ulaz i i resenje S.
Q(I,S) = true, onda kazemo da je S resenje od I
Ako svaka recenica sadrzi barem jedno pozitivno slovo, Bulova formula se naziva Hornerova
formula i resenje moze brze da se nadje.
Ako recenice imaju samo dva slova, algoritam moze biti resen u linearnom vremenu.

Backtracking sposobnost da se eliminisu porcije prostora istrazivanja i tako se umanji vreme


potrebno za realizaciju algoritma.
Backtracking svojim resavanjem daje jedan od tri izlaza:
1. NEUSPEH: promblem nema resenja
2. USPEH: resenje problema je nadjeno
3. NESIGURNOST
primer: Neka je S skup u kome se nalazi aktivni problem P.
Podelimo problem P na skup manjih problema.
Svaki od problema prolazi kroz test.
Ako je rezultat testa true, onda se taj problem smesta nazad u skup S, a ako je false, onda se
izbacuje.
Postupak ponavljati sve dok ima problema.
Backtracking algoritam se vrlo cesto koristi i u problemu nalazenja podskupova:
1. za svaki element x iz S proveromo da li se x nalazi u podskupu T.
Ovaj algoritam je prostiji ali postoji problem eksponencijalnog rasta, narocito kada je T
mali, a S veliki skup.
2. na osnovu neke osobine konstruisati sve elemente skupa T (pocevsi on nekog elementa koji
zasigurno ima tu osobinu). Ovim postupkom se elementi skupa T konstruisu bez upotrebe
skupa S.
Iako je prakticniji, nekada je vrlo tesko konstruisati elemente podskupa.
Nalazenje podskupa pretrazivanjem: Treba naci skup T koji je konacna n-torka I naziva se resenje.
//slajd 12, 13, 14 (previse komplikovano)

Definicija HES TABELE: efikasne strukture podataka za implementaciju .


To je zapravo struktura podataka koja koristi hes funkciju za efikasno preslikavanje kljuceva (npr.
Imena ljudi) u njima pridruzene vrednosti(npr. Telefonske brojeve). Hes funkcija se koristi za
transformisanje kljuca u indeks tj mesto u nizu elemenata gde treba traziti odgovarajucu vrednost.
Idealno bi bilo kada bi se svaki hes kljuc preslikvao u poseban indeks. Medjutim to nije slucaj pa
vecina hes tabela podrazumeva kolizije (kada se razliciti kljucevi slikaju u istu celiju).
Iako trazenje elementa u hes tabeli moze da traje kao i pretrazivanje liste, u praksi su se hes tabele
pokazale kao veoma korisne i pretrazivanje u njima je brze nego pretrazivanje u listama.
Hes tabele su narocito zgodne kada broj podataka moze da se predvidi u napred.
U dobro dimenzioniranoj hes tabeli prosecno vreme pronalazenja kljuca ne zavisi od broja
elemenata uskladistenih u hes tabeli.
Mnoge hes tabele omogucuju skladistenje i brisanje proizvoljnih kljuceva.

Direktno sdresiranje:

koreisti se kada je broj elemenata u skupu umereno mali


Pretpostavimo da treba uzeti kluceve iz skupa U = {0, 1, , m-1}, i pretpostavimo da
nikoja dva elementa nemaju isti kljuc. Da bi predstavili dinamicki skup koristimo niz ili
direktno adresiranu tabelu oznacenu sa T[0, 1, , m-1], gde je svaka notacija mesto
odgovarajuceg kljuca] (pretpostavimo da su svi kljucevi razliciti).
Ako skup ne sadrzi element sa kljucem k, onda je T[k] = NIL.
Recnik operacije su ovde trivijalne (operacije za implementaciju recnika). Svaka od ovih
operacija je relativno brza. Obzirom da imamo indeks objekta u tabeli, imamo i njegov
kljuc. Ako kljuc nije dodeljen, na neki nacin moramo izdati obavestenje da je mesto prazno.

Problemi direktnog adresiranja:


1. Ako je skup U veliki, prilicno je nemoguce uskladistiti tabelu T
2. Skup K kljuceva koji su stvarno uskladisteni moze biti mali u odnosu na predvidjeni broj
kljuceva, pa se gubi veliki deo prostora koji je dodeljen tabeli
Hesiranje je smestanje elementa sa kljucem k na mesto h(k).
Dakle element sa kljucem k hesira na mesto h(k), a h(k) je hes vrednost kljuca k.
Glavni cilj hes funkcije je da redukuje rang niza indeksa kojime se manipulise.
Moze se desiti da dva kljuca hesiraju na istu poziciju sto se naziva KOLIZIJA (sudar). Na zalost ne
postoji idealna tehnika za izbegavanje sudara, ali treba se truditi da se priblizimo ovom cilju,
izborom dobre hes funkcije h. Ideja je da se pojavljiivanje h ucini slucajnim kako bi se kolizije
svele na minimalnu mogucu meru.
pr. za |U|>m mora postojati najmanje dva kljuca koja imaju istu hes vrednost. Posto zelimo da broj
kolizija svedemo na minimum potreban nam je metod za uklanjanje istih.

Izbegavanje kolizije pomocu lanaca:


Brisanje elementa x iz liste moze se ostvariti u Q(1) vremenu, ako je lista dvostruko
povezana (za ulaz koristi x a ne njegov kljuc)
U slucaju jednostruko povezane liste ne bi trebalo koristiti x kao kljuc jer bi onda procedure
pretrazivanja i brisanja imale isto prolazno vreme.
Najgori slucaj kolizije je kada svih n kljuceva hesira u istu celiju i formira se lista duzine n.

Definicija: Za datu hes tabelu T sa m celija koja sadrzi n elemenata definisacemo faktor
opterecenja
a = n / m za tabelu T, koji predstavlja prosecan broj elemenata smestenih u jednu celiju.

Prosecan uspeh hesiranja zavisi od toga koliko uspesno f-ja razvrstava kljuceve u celije.
Pretpostavljamo da je jednaka verovatnoca da kljuc hesira u bilo koju od celija prema definiciji to
je jednostavno uniformno hesiranje.

Teorema:
U he tabeli u kojoj je kolizija izbegnuta formiranjem lanaca, za
bezuspeno traganje ocekivano vreme je O(1 + ), uz pretpostavku
da je u pitanju jednostavno, uniformno heiranje.

Definicija: sta cini dobru hes funkciju?


Zadovoljava pretpostavku da svaki od kljuceva ima podjednaku sansu da se smesti u sveku od m
celija. Medjutim, obicno je nemoguce proveriti ovaj uslov, jer nije poznata verovatnoca
distribuiranja hes kljuceva.
Najveci broj he funkcija pretpostavlja daje prostor kljuceva. Skup N = {0, 1, 2 . . . } prirodnih
brojeva. Tako, ako kljucevi nisu prirodni brojevi, treba naci nacin za njihovu interpretaciju u
vidu prirodnih brojeva.

Metod deljivosti
Slikamo kljuc k na jedno od m mesta metodom ostatk apri deljenju h(k) = k mod m.
Posto zahteva samo prostu operaciju deljenja, hesiranje deljivoscu je prilicno brzo.
Kada biramo broj m, ne treba da biramo broj 2 (Kaze na slajdu: nije zgodno zbog stepena dvojke)

Metod mnozenja
Metod mnoenja za kreiranje he funkcija obavlja se u dva koraka.
Najpre mnoimo kljuc k konstantom A ranga 0 < A < 1 i izdvajamo mali deo od kA.
Zatim ovu vrednost mnoimo sa m i uzimamo najniu vrednost rezultata, tj. h(k) = [m(kA mod 1)]
Prednost metoda mnoenja je to vrednost za m nije kriticna (za razliku od deljenja ovde bas
praktikujemo da uzimamo stepene dvojke)

Univerzalno hesiranje
Osnovna ideja univerzalnog heiranja je da slucajno izabere he funkciju iz klase funkcija koja je
definisana na pocetku izvodjenja.
Ako zlonameran neprijatelj bira kljuceve koji treba da se heiraju nekom fiksiranom he funkcijom,
on bira n kljuceva koji heiraju u istu celiju za prosecno vreme Q(n). Proizvoljna fiksirana he
funkcija ovako se ponaa na najgori moguci nacin. Jedini efektivan nacin da se situacija popravi je
da se he funkcija izabere slucajno, potpuno nezavisno od kljuceva koji treba da se uskladite.
Ovakav pristup moe da proizvede dobar uspeh bez obzira na kljuceve koje je neprijatelj izabrao.
//Fali glupa definicija sa dokazom slajd 45-46

Teorema:
Neka je he funkcija h izabrana iz uniformne kolekcije he funkcija i neka se koristi za heiranje n
kljuceva u tabelu T velicine m, uz koricenje lanaca da se izbegne kolizija. Ako kljuc k nije u tabeli,
onda je ocekivana duina E[nh(k)] najvie . Ako je k u tabeli, ocekivana duina E[nh(k)] koja
sadri kljuc k je najvie 1 + .

Dokaz: Primetimo da ocekivanje zavisi od izbora he funkcije, a ne od distribucije kljuceva. Za


svaki par kljuceva k i l definiemo indikator slucajne promenljive.
Dalje cemo definisati, za svaki kljuc k slucajnu promenljivu koja je jednaka broju kljuceva,
razlicitih od k, koji heiraju u istu celiju kao k.
Ostatak dokaza zavisi od toga da li je kljuc k u tabeli T.

Posledica: Koricenje univerzalnog heiranja u kome se kolizija izbegava pomoc u lanaca u tabeli
T sa m celija, ocekivano vreme je Q(n) za proizvoljan niz od n INSERT, SEARCH i DELETE
operacija koje sadre Q(m) INSERT operacija.
//Vidi slike sa prezentacija

You might also like