Asocijativna polja POGLAVLJE Ključevi kao cijeli brojevi

Similar documents
Algoritam za množenje ulančanih matrica. Alen Kosanović Prirodoslovno-matematički fakultet Matematički odsjek

ZANIMLJIV NAČIN IZRAČUNAVANJA NEKIH GRANIČNIH VRIJEDNOSTI FUNKCIJA. Šefket Arslanagić, Sarajevo, BiH

TEORIJA SKUPOVA Zadaci

pretraživanje teksta Knuth-Morris-Pratt algoritam

Mathcad sa algoritmima

U ovom dijelu upoznat ćemo strukturu podataka stablo, uvesti osnovnu terminologiju, implementaciju i algoritme nad tom strukturom.

PRIPADNOST RJEŠENJA KVADRATNE JEDNAČINE DANOM INTERVALU

Slika 1. Slika 2. Da ne bismo stalno izbacivali elemente iz skupa, mi ćemo napraviti još jedan niz markirano, gde će

Uvod u relacione baze podataka

Red veze za benzen. Slika 1.

Sveučilište J. J. Strossmayera u Osijeku Odjel za matematiku Sveučilišni nastavnički studij matematike i informatike. Sortiranje u linearnom vremenu

Projektovanje paralelnih algoritama II

ALGORITAM FAKTORIZACIJE GNFS

Karakteri konačnih Abelovih grupa

Nilpotentni operatori i matrice

Fajl koji je korišćen može se naći na

KLASIFIKACIJA NAIVNI BAJES. NIKOLA MILIKIĆ URL:

Šime Šuljić. Funkcije. Zadavanje funkcije i područje definicije. š2004š 1

Rekurzivni algoritmi POGLAVLJE Algoritmi s rekurzijama

Metode praćenja planova

Matematika (PITUP) Prof.dr.sc. Blaženka Divjak. Matematika (PITUP) FOI, Varaždin

LINEARNI MODELI STATISTIČKI PRAKTIKUM 2 2. VJEŽBE

Osobine metode rezolucije: zaustavlja se, pouzdanost i kompletnost. Iskazna logika 4

Prsten cijelih brojeva

Iskazna logika 1. Matematička logika u računarstvu. oktobar 2012

ALGORITMI PODIJELI PA VLADAJ

KRITERIJI KOMPLEKSNOSTI ZA K-MEANS ALGORITAM

Metode izračunavanja determinanti matrica n-tog reda

DISKRETNI LOGARITAM. 1 Uvod. MAT-KOL (Banja Luka) ISSN (p), ISSN (o) Vol. XVII (2)(2011), 43-52

Mirela Nogolica Norme Završni rad

KVADRATNE INTERPOLACIJSKE METODE ZA JEDNODIMENZIONALNU BEZUVJETNU LOKALNU OPTIMIZACIJU 1

Turingovi strojevi Opis Turingovog stroja Odluµcivost logike prvog reda. Lipanj Odluµcivost i izraµcunljivost

SHEME DIGITALNOG POTPISA

Dr. Željko Jurić: Matematička logika i teorija izračunljivosti Radna skripta za istoimeni kurs na Elektrotehničkom fakultetu u Sarajevu.

SITO POLJA BROJEVA. Dario Maltarski PRIRODOSLOVNO MATEMATIČKI FAKULTET MATEMATIČKI ODSJEK. Diplomski rad. Voditelj rada: Doc. dr. sc.

NIZOVI I REDOVI FUNKCIJA

Uvod u analizu (M3-02) 05., 07. i 12. XI dr Nenad Teofanov. principle) ili Dirihleov princip (engl. Dirichlet box principle).

Rešenja zadataka za vežbu na relacionoj algebri i relacionom računu

Konstrukcija i analiza algoritama

Maja Antolović Algoritmi u teoriji brojeva

Fibonaccijev brojevni sustav

Kvaternioni i kvaternionsko rješenje kvadratne jednadžbe

DES I AES. Ivan Nad PRIRODOSLOVNO MATEMATIČKI FAKULTET MATEMATIČKI ODSJEK. Diplomski rad. Voditelj rada: doc.dr.sc.

Ariana Trstenjak Kvadratne forme

Sveučilište J. J. Strossmayera u Osijeku Odjel za matematiku DIOFANTSKE JEDNADŽBE

Teorem o reziduumima i primjene. Završni rad

Sveučilište J. J. Strossmayera u Osijeku Odjel za matematiku

PARALELNI ALGORITMI ZA PROBLEM GRUPIRANJA PODATAKA

Funkcijske jednadºbe

Quasi-Newtonove metode

Formalni postupci u oblikovanju računalnih sustava

Položaj nultočaka polinoma

Simetrične matrice, kvadratne forme i matrične norme

Hornerov algoritam i primjene

NIPP. Implementing rules for metadata. Ivica Skender NSDI Working group for technical standards.

Matrice traga nula math.e Vol. 26. math.e. Hrvatski matematički elektronički časopis. Matrice traga nula. komutator linearna algebra. Sažetak.

Sortiranje podataka. Ključne riječi: algoritmi za sortiranje, merge-sort, rekurzivni algoritmi. Data sorting

ELIPTIČKE KRIVULJE I KRIPTIRANJE. Zdravko Musulin PRIRODOSLOVNO MATEMATIČKI FAKULTET MATEMATIČKI ODSJEK. Diplomski rad

4 Funkcije. 4.1 Definicija funkcije

Fraktalno Brownovo gibanje

BROJEVNE KONGRUENCIJE

1 Konveksni skupovi i konveksne funkcije

Pellova jednadžba. Pell s equation

Vektori u ravnini i prostoru. Rudolf Scitovski, Ivan Vazler. 10. svibnja Uvod 1

Oracle Spatial Koordinatni sustavi, projekcije i transformacije. Dalibor Kušić, mag. ing. listopad 2010.

ZANIMLJIVI ALGEBARSKI ZADACI SA BROJEM 2013 (Interesting algebraic problems with number 2013)

POOPĆENJE KLASIČNIH TEOREMA ZATVARANJA PONCELETOVOG TIPA

Standard Parallel and Secant Parallel in Azimuthal Projections

Algoritam za odre divanje ukupnog poravnanja dva grafa poravnanja parcijalnog ure daja

Pitagorine trojke. Uvod

Neprekidan slučajan vektor

AKSIOM IZBORA I EKVIVALENCIJE

PRIRODOSLOVNO MATEMATIČKI FAKULTET MATEMATIČKI ODSJEK. Marina Zrno KOMUTATIVNI PRSTENI. Diplomski rad. Voditelj rada: prof.dr.sc.

Formule za udaljenost točke do pravca u ravnini, u smislu lp - udaljenosti math.e Vol 28.

O aksiomu izbora, cipelama i čarapama

Sveučilište Josipa Jurja Strossmayera u Osijeku Odjel za matematiku

UNIVERZITET U BEOGRADU MATEMATIČKI FAKULTET

Grupiranje podataka u skupine 1 Rudolf Scitovski, Odjela za matematiku, Sveučilište u Osijeku 2

Ksenija Doroslovački KOMBINATORIKA INTERPRETIRANA FUNKCIJAMA I NJIHOVIM OSOBINAMA MASTER RAD. NOVI SAD jun 2008

Monoalfabetske supstitucijske šifre

POLINOMNE VARIJANTE DIOFANTOVA PROBLEMA

Karakterizacija problema zadovoljenja uslova širine 1

Napredni standard enkripcije (AES)

NTRU KRIPTOSUSTAV. Valentina Pribanić PRIRODOSLOVNO MATEMATIČKI FAKULTET MATEMATIČKI ODSJEK. Diplomski rad

Sveučilište J. J. Strossmayera u Osijeku Odjel za matematiku Preddiplomski studij matematike. Školska kriptografija

Mersenneovi i savršeni brojevi

Geometrijski smisao rješenja sustava od tri linearne jednadžbe s tri nepoznanice

Asimetrični kriptografski RSA algoritam

Konstekstno slobodne gramatike

Neke klase maksimalnih hiperklonova

PRIMJENA METODE PCA NAD SKUPOM SLIKA ZNAKOVA

Termodinamika. FIZIKA PSS-GRAD 29. studenog Copyright 2015 John Wiley & Sons, Inc. All rights reserved.

Sveučilište J.J. Strossmayera u Osijeku Odjel za matematiku Sveučilišni preddiplomski studij matematike. Ivana Oreški REKURZIJE.

Matrice u Maple-u. Upisivanje matrica

1.1 Uvod. 1.1 Uvod Značajke programskog jezika Python Interpretacija me dukôda

PRIRODOSLOVNO MATEMATIČKI FAKULTET MATEMATIČKI ODSJEK BINARNI POLINOMI. Diplomski rad. Voditelj rada: doc. dr. sc. Goranka Nogo. Zagreb, 2017.

Matrične dekompozicije i primjene

Metrički prostori i Riman-Stiltjesov integral

BAZE PODATAKA Predavanje 03

Podatak objekt u obradi. Algoritam uputstvo ( recept ) koje opisuje transformaciju ulaznih podataka u traženi razultat. Izvršitelj?

Transcription:

POGLAVLJE 7 Asocijativna polja U ovom poglavlju promotrit ćemo poopćenje strukture podataka polja. Upoznali smo se s činjenicom da se elementima polja efikasno pristupa poznavajući cjelobrojni indeks određenog elementa kojem želimo pristupiti. Želimo definirati strukturu podataka koje može koristiti bilo koji alfanumerički znak (čak i skup znakova) kao indeks elementa u polju. Jedno od primjena koje zahtjeva takvu strukturu podataka možemo naći u kompajleru nekog programskog jezika koji želi održavati tablicu simbola čije vrijednosti odgovaraju identifikatorima u tom jeziku. Asocijativno polje je upravo struktura podataka koje pomaže u implementaciji takvih rječnika. Često se u literaturi može pronaći pojam za asocijativno polje ime hash tablica (hash tablica predstavlja jednu od implementacija), rječnik (dictionary) ili preslikavanje (map). Za razliku od dosadašnjeg koncepta polja, u ovom slučaju ćemo koristiti indeksaciju od 0... m 1 za veličinu polja m pa ćemo ponekad to zvati i tablicom. Asocijativno polje je dinamična struktura podataka koje se sastoji od skupa parova H = {x = (k, D) : k S U, D D} gdje k predstavlja ključ kojeg odabiremo iz nekog konačnog skupa ključeva S univerza ključeva U. Ključu k je pridružena struktura podataka D koje pripada skupu svih struktura podataka D izvedivih na RAM stroju. Dinamičke operacije koje želimo da ova struktura podržava su Insert(H, x) operacija koja ubacuje element x u H Delete(H, x) operacija koja briše element x iz strukture H Search(H, k) pretraživanje elementa s ključem k Za dani element x S D definiramo atribut key[x] koji nam vraća vrijednost ključa od x. U daljnim odjeljcima promotrit ćemo kako se može izvesti takva struktura podataka. Ključan koncept je definicija funkcije h : U {0,..., 1} koje preslikava ključeve u cjelobrojne vrijednosti u rasponu od 0 do m 1. 7.1 Ključevi kao cijeli brojevi Većina hash funkcija koje ćemo predstaviti operiraju nad cjelobrojnim podacima. Ukoliko imamo općeniti skup ključeva (znakovi, brojevi kliznog zareza, polja,...) nužno je pretvoriti ih u njihov cjelobrojni predstavnik. U slučaju brojeva kliznog zareza preslikavanje ϕ(k) = kn gdje 63

64 Asocijativna polja je N neka cjelobrojna veličina. Npr. ključu k = 12.34 možemo na takav način pridružiti cjelobrojni ključ k = 12.34 100 = 1234 za N = 100 itd. U slučaju alfanumeričkih znakova potrebno je pogledati odgovarajući decimalni zapis u tablici kodiranja (alfabetu). Npr. za ključ k = `a' ima decimalnu vrijednost u ASCII tablici 97 stoga je pridruženi ključ k = 97 itd. U slučaju stringa, dakle niza znakova, svaki znak stringa se može ponderirati bazom alfabeta, dakle ϕ(k) = length[k] i=1 ord A (k[i])b i 1 (ukoliko uzmemo da je početak stringa na mjestu k[1]) npr. string ključu k = "abc" je pridružen ključ k = ord(`a') + ord(`b') b 1 + ord(`c') b 2 što bi u ASCII kodu značilo k = 97 + 98 128 + 99 128 2 = 25315. Funkcija ord A (c) predstavlja decimalnu vrijednost binarnog zapisa znaka c u nekom alfabetu A. 7.2 Polja s direktnim adresnim pristupom Neka je dan skup ključeva S iz universa U = {0, 1,..., m 1} i tablica (polje) H veličine m. Možemo definirati preslikavanje h : U {0, 1,..., m 1}, h(k) = k koje podatak (k, D) sprema na H[k] mjesto. Implementacija pretraživanja, ubacivanja i brisanja u takvom asocijativnom polju su dani pseudokodom: Direct-Address-Search(H, k) return H[k] Direct-Address-Insert(H, x) H[key[x]] x Direct-Address-Delete(H, x) H[key[x]] nil Ilustrativno se može prikazati u Slici 7.1 7.3 Hash tablica Očit nedostatak direktnog adresiranja je u tome što univerz U mora biti reda veličine tablice T. Što u slučaju kada S > m? U tom slučaju koristimo netrivijalnu hash funkciju h : U {0, 1,..., m 1} koja preslikava ključeve u H[0... m 1]. Neizbježnost kolizije ključeva u tablici H implicira odabir strategije kako spremati objekte u tablicu H u kojima se ključevi po hash vrijednosti podudaraju. Hash tablica s ulančanim kolizijama Svi objekti koji se preslikaju u isti indeks povezujemo u povezanu listu gdje tablica H na tom indeksu sadrži pokazivač na početak te liste. Dinamičke operacije nad takvom strukturom su dani preko operacija nad povezanom listom. Hash-Insert(H, x) List-Insert(H[h(key[x])], x)

7.3. Hash tablica 65 D D D 1 D 2 D 3 D4 x i = (k i, D i ) U (2, D 1 ) (3, D 2 ) S 2 5 3 8 (5, D 3 ) (8, D 4 ) Slika 7.1: Ilustracija Direct-Address operacija m = 10 Hash-Search(H, x) List-Search(H[h(key[x])], key[x]) Hash-Delete(H, x) List-Delete(H[h(key[x])], x) Sljedeći primjer demonstrira kako odabir hash funkcije može biti loš u smislu da sve ključeve hešira u isto mjesto. Primjer 7.1. Neka su dani ključevi S = {`a',`f',`k',`p',`u',`z'}. Demonstrirajte ubacivanje ključeva S u hash tablicu veličine m = 5 koristeći hash funkciju h(k) = k mod m. Rješenje. Za svaki k S odrediti ord(k) A ASCII. Dakle, znakovima iz S redom odgovara hash vrijednost 2 i 7. Svi znakovi iz S se preslikaju u H na indeks 2 i 7. Na Slici 7.3 je prikazana ilustracija rješenja. Vremenska složenost operacija Primjetite kako dinamičke operacije nad hash tablicom ovise o 2 stvari: 1. koliko je hash funkcija "dobra" i 2. operacije nad povezanom listom. U najgorem slučaju, ako neka hash funkcija koju smo odabrali "loše" hešira ključeve može se dogoditi da svi

66 Asocijativna polja U 2 z p f S a u f z p k h(k) = k mod m 7 u k a m = 10 Slika 7.2: Heširanje gdje se kolizije rješavaju ulančavanjem. Znakovnim ključevima pridružuju se cjelobrojne vrijednosti {`a',`f',`k',`p',`u',`z'} {97, 117, 102, 122, 107, 112} po ASCII tablici. Za svaki indeks od H prikazana je povezana lista heširanih ključeva koji imaju koliziju (radi preglednosti parovi (k i, D i ) su prikazani samo ključevima k i ). Ključevi su ubacivani po abecednim redom. ključevi iz S završe u jednom indeksu i u tom slučaju pretraživanje može trajati O(n) vremena gdje S = n. Operacije ubacivanja elementa se uvijek može napraviti u O(1) vremenu. Teorem 7.3.1 ([1]). Uz pretpostavku uniformnog heširanja, a) operacija Insert zahtjeva O(1) vremena kako bi ubacila neki element x s ključem iz S b) operacija Search i Delete zahtjeva asimptotski O(1 + α) vremena u prosjeku kako bi pronašla odnosno izbrisala element x s ključem iz S. gdje je skup ključeva S veličine n, hash tablica veličine m, α = n/m i kolizije se rješavaju ulančavanjem. Dokaz. Formalan dokaz može se naći u [1], ovdje ćemo ga iznjeti intuitivno. Dakle, može se pokazati u prosječnom slučaju, ukoliko imamo hash funkciju koja uniformno raspoređuje ključeve unutar tablice T da je onda vremenska složenost pretraživanja O(1 + α), α = n/m, S = n. Intuitivno, neka hash funkcija je "dobra" ako neki ključ k U ima istu šansu da odabere bilo koji indeks od H. Nadalje, u prosječnom slučaju, svaki indeks pokazuje na listu od prosječno α = n/m elemenata, pa je pretraživanje onda: O(1) za računanje hash vrijednosti i O(n/m) za pretraživanje liste. 7.4 Hash funkcije Kao što smo ranije rekli, jedan od ključnih pitanja koje čine temelj efikasnosti strukture podataka rječnika je odabir dobre hash funkcije. Možemo reći da je neka hash funkcija dobra ukoliko zadovoljava pretpostavku jednostavnog uniformnog preslikavanja: svaki ključ ima jednaku vjerovatnost da se hešira u bilo koji od m indeksa. Ponekad je tu pretpostavku teško održati iz razloga što ne znamo iz koje distribucije dolaze ključevi. Kroz praksu su dizajnirane klase funkcija koje daju dobre rezultate koje ćemo ih ovdje spomenuti.

7.5. Probiranje u otvorenom adresiranju 67 Metoda dijeljenja Metoda definira hash funkciju na temelju jednostavne modularne aritmetike: za dani ključ k i m indeksa, preslikavanje je definirano s h(k) = k mod m U praksi se izbjegavaju neke vrijednosti za m. Točnije, m se bira takav da nije blizu prave potencije broja 2. Metoda množenja Metoda koje prvo pomnoži ključ k s nekom frakcionalnom vrijednošću 0 < A < 1 i uzme frakcionalni dio od ka. Zatim pomnoži se s m i uzme najveće manje cijelo od te vrijednosti. Drugim riječima, h(k) = m(ka mod 1), ka mod 1 = ka ka U praksi, treba odrediti dobar A tako da preslikavanje pretpostavlja uniformno preslikavanje. Npr. A = ( 5 1)/2 se pokazalo da nešto bolje pokazuje svojstvo uniformnosti neko bilo koji drugi A. Primjer 7.2. Demonstrirajte operacije ubacivanja ključeva 61, 62, 63, 64 i 65 u hash tablicu veličine m = 1000 gdje se kolizije rješavaju ulančavanjem, za danu hash funkciju h(k) = m(ka mod 1), gdje je A = ( 5 1)/2. Rješenje. Rješenje ćemo iznjeti bez ilustracije. Dovoljno je pokazati u koje se ključeve hešira skup S. Dakle, h(61) = 1000 (61 ( 5 1)/2 61 ( 5 1)/2 ) = 700 Ostale vrijedosti: h(62) = 318, h(63) = 936, h(64) = 554, h(65) = 172. Svaki indeks i {0, 1,..., 999} tablice H sadrži pokazivač ili na nil ili na povezanu listu koja sadrži jedan ključ iz S. 7.5 Probiranje u otvorenom adresiranju Kad je skup ključeva reda veličine tablice T ( S < m), a ključevi mogu biti bilo koje vrijednosti iz univerza U u praksi se koristi metoda probiranja u otvorenom adresiranju. Ideja proširuje koncept direktnog adresiranja koristeći netrivijalan način heširanja. U ovom pristupu elemente direktno spremamo u tablicu. U slučaju kolizije hash vrijednosti ideja je da napravimo novo računanje hash vrijednosti koje zovemo probiranje. Drugim riječima, heširanje s probiranjem je funkcija dana s h : U {0, 1, 2,..., m 1} {0, 1, 2,..., m 1} s uvjetom da niz probiranja {h(k, 0), h(k, 1),..., h(k, m 1)} čini neku od permutacija skupa {0, 1,..., m 1}.

68 Asocijativna polja Hash-Insert(H, x) 1 i 0 2 repeat j h(key[x], i) 3 if H[j] = nil or H[j] = deleted 4 then H[j] x 5 return 6 else i i + 1 7 until i = m 8 return error "hash table overflow" Pretraživanje elementa s ključem k: Hash-Search(H, k) 1 i 0 2 repeat j h(k, i) 3 if H[j] = k 4 then return j 5 i i + 1 6 until H[j] = nil or i = m 7 return Nil Brisanje elementa x iz hash tablice: Hash-Delete(H, x) 1 j Hash-Search(H, x) 2 if j = nil 3 then H[j] = deleted Kako bi se osiguralo uniformno heširanje, odnosno garancija da je h(k, 0), h(k, 1),..., h(k, m 1) zaista permutacija od 0, 1,..., m 1 za svaki ključ k S, definiramo klase hash funkcija koje u većoj mjeri postižu to svojstvo. Linearno probiranje Za danu hash funkciju h : U {0, 1,..., m 1} koju zovemo pomoćna hash funkcija definiramo linearno probiranje kao h(k, i) = (h (k) + i) mod m, i = 1, 2,..., m 1 Funkcija je lagana za implementirati, ali pati od problema primarnog klasteriranja, odnosno, porastom probiranja opada vjerovatnost odabira dostupnog indeksa što poveća prosječno vrijeme pretraživanja.

7.5. Probiranje u otvorenom adresiranju 69 Kvadratično probiranje Kvadratično probiranje koristi probiranje oblika h(k, i) = (h (k) + c 1 i + c 2 i 2 ) mod m, i = 0, 2,..., m 1. gdje su c 1, c 2 = 0 pomoćne konstante. Ovo probiranje radi u praksi bolje nego linearno. Problem vezan uz kvadratično probiranje je sekundarno klasteriranje, odnosno, situacija kada 2 različita ključa imaju inicijalno isti indeks u tablici, onda je i njihov niz probiranja isti, dakle h(k, 0) = h(l, 0) implicira h(k, i) = h(l, i). Dvostruko probiranje Predstavlja najbolju metodu dostupnu za heširanje s otvorenim adresiranjem jer dosta dobro aproksimira svojstvo uniformnog heširanja. Dvostruko heširanje koristi hash funkciju oblika: gdje su h 1, h 2 pomoćne hash funkcije. h(k, i) = (h 1 (k) + ih 2 (k)) mod m, i = 0, 2,..., m 1 Primjer 7.3. Demonstrirajte ubacivanje ključeva 14, 50, 69, 72, 79, 98 u tablicu veličine m = 13 otvorenim adresiranjem koristeći strategiju dvostrukog probiranja gdje je hash funkcija dana h(k, i) = (h 1 (k) + ih 2 (k)) mod m i pomoćne hash funkcije su h 1 (k) = k mod 13, h 2 (k) = 1 + (k mod 11). Rješenje. Izračunajmo za početak hash vrijednosti ključeva. Primjetite kako prvo probiranje (i = 0) koristi h 1 hash funkciju. U slučaju kolizije potrebljava se hash funkcija h 2. h(14, 0) = (14 mod 13) mod 13 = 1 h(50, 0) = 11 h(69, 0) = 4 h(72, 0) = 7 h(79, 0) = 1 h(79, 1) = (14 mod 13 + 1 (1 + (79 mod 11)) mod 13 = 1 h(79, 2) = 7 h(79, 3) = 10 h(98, 0) = 7 h(98, 1) = 5 koje se hešira u tablicu H na način prikazano na slici Vremenska složenost operacija Analiza vremenske složenosti operacija nad hash tablicom s probiranjem u otvorenom adresiranju temelji rezultate na faktoru opterećanja α = n/m što je u ovom slučaju α 1 jer n m. Kao i kod hash tablice, razlikujemo uspješno i neuspješno pretraživanje. Neuspješno pretraživanje predstavlja pretraživanje do zadnjeg mogućeg probiranja na kojem se nalazi prazo mjesto. Sva prijašnja probiranja heširala su se na zauzeto mjesto. Uspješno pretraživanje predstavlja isti postupak kao i ubacivanje: probiraj dok ne dođeš to slobodnog mjesta. Broj probiranja varira od 1 do m 1.

70 Asocijativna polja U h(14, 0) (14, D 1 ) 0 1 2 3 S 14 50 72 69 79 98 h(69, 0) h(79, 3) h(98, 1) (69, D 3 ) (98, D 6 ) (72, D 4 ) 4 5 6 7 8 h(72, 0) 9 h(50, 0) (79, D 5 ) 10 (50, D 2 ) 11 12 m = 13 Slika 7.3: Heširanje otvorenim adresiranjem s probiranjem kolizije rješava tako da više puta računa hash vrijednost dok ne nađe slobodno mjesto. Na slici ključevi 79 i 98 za napravili barem još jedno probiranje. U tablici se direktno spremaju ključevi k i sa satelitskim podacima D i. Teorem 7.5.1. U hash tablici s probiranjem u otvorenom adresiranju s faktorom opterećenja α = n/m < 1 uz pretpostavku uniformnog heširanja, vrijede sljedeći rezultati: (a) vrijeme neuspješne operacije Hash-Search i Hash-Insert je ovisno o prosječnom broju probiranja koji je najviše 1/(1 α) u prosjeku što implicira O(1/(1 α)) prosječnu vremensku složenost. (b) vrijeme uspješne operacije Hash-Search je ovisno o broju probiranja koje je najviše O(1/α ln 1/(1 α)) u prosjeku što implicira 1/α ln 1/(1 α) prosječnu vremensku složenost. Interpretacija teorema: Formalni dokaz se može naći u [1]. Ukoliko je α konstantna teorem predviđa da neuspješno pretraživanje traje O(1) vrijeme. Npr. ukoliko je hash tablica napola puna, prosječni broj probiranja u neuspješnog pretraživanja je najviše 1/(1 0.5) = 2. Ukoliko je 90% puno prosječni broj proba je najviše 1/(1 0.9) = 10 7.6 Implementacija rječnika Asocijativno polje je uobičajena struktura podataka implementirana u mnogim programskim jezicima: npr. u Pythonu postoji kao ugrađeni tip, dok skriptni jezik Asocijativno polje u C++ C++ poznaje asocijativno polje kao predložak map u STL-u koji je dan prototipom: template < class Key, class T, class Compare = less <Key >, class Allocator = allocator <pair < const Key,T> > > class map ;

7.6. Implementacija rječnika 71 gdje je Key tip podatka ključa k T tip podataka strukture podatka u paru (x, D) Compare funkcija koja definira uspoređivanje između ključeva Allocator predstavlja alokator za model alokacije objekta Primjer: # include < iostream > # include <map > using namespace std ; Listing 7.1: C++ map primjena int main () { map < char, int > mymap ; map <char, int >:: iterator it ; pair < map < char, int >:: iterator, bool > ret ; // ubacivanje u map objekt mymap. insert ( pair < char, int >( 'a ',100) ); mymap. insert ( pair < char, int >( 'z ',200) ); ret = mymap. insert ( pair < char, int >( 'z ',500) ); if ( ret. second == false ) { cout << " element 'z ' vec postoji "; cout << " s vrijednoscu " << ret. first - > second << endl ; } // drugo ubacivanje it = mymap. begin () ; mymap. insert ( it, pair <char, int >( 'b ',300) ); // max efficiency inserting mymap. insert ( it, pair <char, int >( 'c ',400) ); // no max efficiency inserting // trece ubacivanje map < char, int > anothermap ; anothermap. insert ( mymap. begin (), mymap. find ( 'c ')); // ispis elemenata asocijativnog polja mymap cout << " mymap contains :\ n"; for ( it = mymap. begin () ; it!= mymap. end () ; it ++ ) cout << (* it ). first << " => " << (* it ). second << endl ; cout << " anothermap sadrzi :\ n"; for ( it= anothermap. begin () ; it!= anothermap. end () ; it ++ ) cout << (* it ). first << " => " << (* it ). second << endl ; } return 0; Ovisno o primjeni, možemo definirati vlastitu verziju asocijativnog polja. Rječnik možemo implementirati koristeći polje veličine m. U slučaju ulančavanja polje sadrži pokazivače na liste objekata. Unutar klase definiramo hash funkciju. Sljedeća klasa opisuje rječnik čiji ključevi predstavljaju stringove u C++:

72 Asocijativna polja class data ; // klasa koja definira parove (s, D) class { map public : map () {}; Insert ( string s, data & D); Delete ( string s); Search ( string s); data operator [] ( string s) protected : DDList * T; unisgned int m; float hash ( int k) float ; } U listingu su istaknute 2 klase: 1. klasa predstavlja tip podatka koje želimo držati u rječnik, a 2. klasa je protip za implementaciju rječnika. Od posebnog je značaja operator data map :: operator [] ( string s) koje za dani ključ s nalazi element x = (s, D) i vraća D. Zadaci Zadatak 7.1. 1. Neka su dani stringovi "org","rog","gor". Pokažite kako se heširaju ti stringovi u tablicu veličine m = 2 p 1 gdje je k ključ interpretiran iz danih stringova koristeći p-radix notaciju Radix p. 2. Pokažite općenito: ukoliko je x string i y neka permuatacija od x tada ključevi k = radix p (x), l = radix p (y) se heširaju u isti indeks, odnosno h(k) = h(l). Zadatak 7.2. Koristeći prethodni prototip za rječnik implementirajte u C++ svoju verziju rječnika. Osim standardnih operacija neka klasa sadrži metode koje vraćaju listu ključeva s i metodu koja vraća samo elemente rječnika D.