Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: functie hash  (Citit de 3588 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
fireatmyself
Nu mai tace
*****

Karma: 36
Deconectat Deconectat

Mesaje: 492



Vezi Profilul
« : Octombrie 23, 2007, 13:37:19 »

de 2 zile tot caut (pe net) o functie hash ce intoarce valori pana in 2^22 si care sa aiba o probabilitate cat mai mica de a produce coliziuni. ma poate ajuta cineva?
Memorat

Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
pauldb
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« Răspunde #1 : Octombrie 23, 2007, 16:44:34 »

Cauta despre Bernstein Hash.
Memorat

Am zis Mr. Green
astronomy
Nu mai tace
*****

Karma: 204
Deconectat Deconectat

Mesaje: 492



Vezi Profilul
« Răspunde #2 : Octombrie 23, 2007, 20:32:16 »

Din ce am constatat eu pentru siruri merge foarte bine rabin-karp, adica consideri sirul un numar intr-o baza si il calculezi modulo cateva numere prime mari (2 numere prime sunt arhisuficiente si nu mai trebuie sa tratezi coliziunile). Apoi daca vrei sa faci toate operatiile (inserare, cautare si stergere) pe numere intregi cred ca merge foarte bine "double-hashing" (tehnica care apare si in articolul de pe infoarena), aloci static la inceput 2 tabele de hash si bagi elementul curent in tabelul unde ai cat mai putine elemente ce au cheia egala cu cheia elementului curent (functia de hash tot f(x)=x%mod). Nustiu ce sa spun despre hash`uri pe numere reale, nu am incercat niciodata.
Memorat
gcosmin
Nu mai tace
*****

Karma: 205
Deconectat Deconectat

Mesaje: 307



Vezi Profilul
« Răspunde #3 : Octombrie 23, 2007, 21:31:11 »

o functie buna de hash pe care o stiu (pentru numere intregi):

iei un numar impar mare random la inceput si functia de hash pentru x e cam asa:
(x * nr) >> (32 - nrb) (unde nrb e cati biti semnificativi vrei sa pastrezi (in cazul tau 22))
nu te intereseaza daca da overflow, asta e Smile

e mult mai rapida in cazul in care accesezi de multe ori functia de hash pentru ca nu are modul (%) care ia mult timp.
cu ajutorul ei am reusit sa fac problema secv5 sa intre in timp  Tongue
Memorat
DITzoneC
Nu mai tace
*****

Karma: 301
Deconectat Deconectat

Mesaje: 962



Vezi Profilul
« Răspunde #4 : Octombrie 23, 2007, 21:43:15 »

Nu merge si mai bine daca in loc de impar iei prim ? (adica sa ai mai putine coliziuni)
De obicei numerele prime fac magie pe hash-urile astea Smile
« Ultima modificare: Octombrie 23, 2007, 21:45:36 de către Adrian Diaconu » Memorat
gcosmin
Nu mai tace
*****

Karma: 205
Deconectat Deconectat

Mesaje: 307



Vezi Profilul
« Răspunde #5 : Octombrie 23, 2007, 21:54:30 »

habar n-am daca merge mai bine  Very Happy
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #6 : Octombrie 23, 2007, 23:07:19 »

Functia asta e aia pe care ne-a zis-o Mircea (si pe care eu nu am tinut-o minte)?
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
fireatmyself
Nu mai tace
*****

Karma: 36
Deconectat Deconectat

Mesaje: 492



Vezi Profilul
« Răspunde #7 : Octombrie 23, 2007, 23:15:19 »

multumesc mult pentru sfaturi.

Adi: de obicei eu folosesc trei numere prime pentru hashul acela, nu doua. probabilitatea de coliziune fiind ceva 1/(p1*p2*p3) (poate gresesc?). problema era sa pot cauta in O(1) o informatie din hash.

Cosmin: eu am gasit pe net o functie de tipul celei care ai zis-o tu:

presupunand ca vreau sa comprim un sir de caractere 's':

Cod:
hash = 65599;
for (i = 0; i < len_s; i++)
    hash = s[i]-'0'+hash*65599 /* sau varianta rapida hash = s[i]-'0'+(hash<<6)+(hash<<16)-hash */

fie, aici se poate introduce si o siftare pe biti ca sa nu sara de 2^22.

am incercat acest lucru la problema Ograzi, dar iau doar 90. sa aiba multe coliziuni functia mea?
« Ultima modificare: Octombrie 23, 2007, 23:20:36 de către Bogdan A. Stoica » Memorat

Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
DITzoneC
Nu mai tace
*****

Karma: 301
Deconectat Deconectat

Mesaje: 962



Vezi Profilul
« Răspunde #8 : Octombrie 23, 2007, 23:25:31 »

Incearca sa tratezi cumva si coliziunile. In articolul de pe site sunt prezentate mai multe solutii pentru asta.
Memorat
fireatmyself
Nu mai tace
*****

Karma: 36
Deconectat Deconectat

Mesaje: 492



Vezi Profilul
« Răspunde #9 : Octombrie 23, 2007, 23:26:47 »

n-am vazut ca exista articol pe site  Whistle

pana la urma nu m-am lamurit. care e mai buna? cu nr impar sau cu nr prim?
Memorat

Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
DITzoneC
Nu mai tace
*****

Karma: 301
Deconectat Deconectat

Mesaje: 962



Vezi Profilul
« Răspunde #10 : Octombrie 23, 2007, 23:29:53 »

Cum majoritatea numerelor prime sunt si impare ... nu risti nimic luand unul prim Smile
Memorat
gcosmin
Nu mai tace
*****

Karma: 205
Deconectat Deconectat

Mesaje: 307



Vezi Profilul
« Răspunde #11 : Octombrie 24, 2007, 06:09:42 »

Functia asta e aia pe care ne-a zis-o Mircea (si pe care eu nu am tinut-o minte)?

dap  Tongue
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines