Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Hash tabele - resavanje kolizije i prosirivanje po potrebi

[es] :: Art of Programming :: Hash tabele - resavanje kolizije i prosirivanje po potrebi

[ Pregleda: 3055 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Hash tabele - resavanje kolizije i prosirivanje po potrebi09.06.2008. u 17:57 - pre 193 meseci
skoro sam pokusao da napravim jednu hash tabelu po prvi put i iznenadilo me je koliko je to ustvari jednostavno, evo te implementacije (FreeBASIC): http://www.freebasic.net/forum/viewtopic.php?t=11538

dakle u pitanju je niz od N bucketa i svaki od tih bucketa moze da sadrzi M itema, item je par (key, value).

poziciju (m, n) odredjujem pomocu hash vrednosti kljuca H i parametara M i N: (m, n) = (H mod M, H mod N). kao sto mozete da vidite u pitanju je standardan nacin...

e sad, ja nisam mnogo testirao ovu implementaciju ali ukoliko su M i N relativno mali brojevi (zaboravih da napomenem da su M i N uvek prosti brojevi) moguce je da ce doci do kolizije. ja znam kako da detektujem koliziju (posto cuvam i key vrednost jednostavim poredjenjem mogu da vidim da li je u pitanju drugaciji kljuc) ali me interesuju koji su nacini da se kolizija resi. gledao sam nesto na wikipediji ali mi nije bas najjasnije pa sam resio da pitam ovde na es-u, verovatno ima nekog ko se igrao sa hash tabelama.

i takodje interesuje me da li je prosirivanje hash tabele (znaci povecavanje M i N parametara) izvodljivo (a da ne moram da rehashiram sve) i koji su nacini da se to uradi?


hvala unapred
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Hash tabele - resavanje kolizije i prosirivanje po potrebi09.06.2008. u 18:59 - pre 193 meseci
Ako pod rehashiram podrazumevas prealokaciju po bucketima, ne mozes, promena M i N dovodi do preraspodele po bucketima i tu nema pomoci. A sto se tice resavanja kolizija, ima dosta nacina da to resis, neki su dati u wikipedi

Npr .NET to resava drugacije, u Hashtable implementaciji je M=1, sto ce reci svaki bucket ima samo jedan element i svi bucketi se prealociraju a inicijalni N je 11 i pri svakom prosirivanju se trazi prvi prime >= N*2. Kolizije se resavaju tako sto je hash uvek 31-bit, a 32-i bit se tretira kao kolizioni bit, ako je on postavljen to znaci da postoje dva ili vise elementa sa istim H mod N. Ako se dodaje element sa istim H mod N onda se dize 32-i bit postojecem elementu a fokus prelazi na (H mod N)+increment gde je inkrement = g(key, N) takav da je manji od N i veci od 1. Tako se ide u krug i dizu kolizioni bitovi (ako nisu dignuti) dok se ne naleti na slobodni bucket. Posto je N prime ne mozes da uletis u mrtvu petlju jer nikad neces ispitivati istu celiju dva puta, posto je maksimalni fill factor postavljen na 72% slobodna celija ce biti pronadjena u par koraka u najgorem slucaju. Kad bucket lista dostigne fill factor 0.72 hash tabela se uveca na onaj gornji prime >= N*2 i svi elementi se prealociraju iz stare u novu tabelu redom za svaki bucket koji je iskoriscen.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Hash tabele - resavanje kolizije i prosirivanje po potrebi11.06.2008. u 12:35 - pre 193 meseci
pod rehashiranjem sam mislio na kreiranje nove tabele i prebacivanje iz stare u novu, pesudo-kod:
Code:

function rehash(OldTable, M, N)

  NewTable is new hashtable(M, N)

  for each Item in OldTable

      H is hash of Item.Key

      NewTable[H mod M][H mod N] = Item.Value
    
  next
 
  OldTable = NewTable 

end function


ovo za .NET hashtabele mi zvuci zanimljivo ali nisam siguran da sam bas razumeo... buni me ovaj deo "...gde je inkrement = g(key, N) takav da je manji od N i veci od 1..." jel ima negde source toga (pozeljno da bude u c-u) ili neki pseudo-kod ili nesto slicno?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Hash tabele - resavanje kolizije i prosirivanje po potrebi14.06.2008. u 17:59 - pre 193 meseci
hashing se generalno smatra "skupom" operacijom tako da sve implementacije koje sam ja video obracunavaju has kljuca samo jednom pri dodavanju u tabelu/e. Tako da se u element bucketa smestaju tri informacije: key, value i hash(key). Samim tim pri prosirivanju tabele i bucketa nema ponovne kalkulacije hash-a samim tim ni rehashovanja.

Sto se tice g(key, n) sad sam na putu pa nemam radnu okolinu, ali ako ti se zuri pokreni Reflector i pronadju private metod unutar HashTable kalse koji se mislim zove initHash(object key, int bucketsize, out int ?, out int ?) ili nesto veoma slicno. Metod ako se dobro secam vraca 31 bit hasha objekta kao return value a kao drugi ili treci parametar vraca taj g(key, n) pa pogledaj implemetnaciju tog metoda. Ako ne uspes ja se vracam slecedeg cetvrtka pa mogu da ti okacim (a moze i neko drugi da ti okaci)
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Hash tabele - resavanje kolizije i prosirivanje po potrebi14.06.2008. u 22:27 - pre 193 meseci
hmm, nisam .Net developer i nemam taj Reflector, mada sam trazio nesto po source kodu mono-a ali nisam uspeo da pronadjem (iskren da budem nisam se bas nesto mnogo trudio, 16mb source koda je ipak mnogo da pronadjem source jedne fje a da pri tom nemam pojma gde bi trebao da trazim)

nisam u frci uopste, niti mi je ovo (hash tabele) potrebno za fax/neki projekat/posao vec jednostavno hocu da naucim malo o njima tako sto cu implementirati par razlicith vrsta hash tabela (gledao sam nesto o RB i AA stablima, jer su mi neki ljudi rekli da se asocijativni nizovi cesto implementiraju i pomocu stabala)...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Hash tabele - resavanje kolizije i prosirivanje po potrebi15.06.2008. u 10:33 - pre 193 meseci
Pogledaj ovaj clanak
About the Implementation of .Net Framework's HashTable

ovde ti je objasnjeno kako radi implementacija hash tabele u .NETu, h1 i h2 funkcije iz teksta se obracnavaju u initHash() metodi koju sam spomenuo. Ovde imas i matematicko objasnjenje kompleksnosti algoritma i kompletan sors Insert() metoda.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: Hash tabele - resavanje kolizije i prosirivanje po potrebi17.06.2008. u 13:02 - pre 193 meseci
ovo mi je trebalo, hvala puno! ne znam samo kako ja ovo nisam uspeo da nadjem na googlu...
 
Odgovor na temu

[es] :: Art of Programming :: Hash tabele - resavanje kolizije i prosirivanje po potrebi

[ Pregleda: 3055 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.