Presentation laddar. Vänta.

Presentation laddar. Vänta.

Hashing / Hash tabeller -- Kapitel 20. Hash? Varför en annan datastruktur? Konstant tid för både insert- och find- operationer.

Liknande presentationer


En presentation över ämnet: "Hashing / Hash tabeller -- Kapitel 20. Hash? Varför en annan datastruktur? Konstant tid för både insert- och find- operationer."— Presentationens avskrift:

1 Hashing / Hash tabeller -- Kapitel 20

2 Hash? Varför en annan datastruktur? Konstant tid för både insert- och find- operationer

3 Hash? Insert ”Daniel” =18 Find

4 Hashfunktioner! Hash functioner använder associerade “key” ( som kan vara data i sig ) för att få fram datan. Hash funktionerna är olika för olika sorts data.  Integers  Images  Strings Etc…

5 Hashing integers? Tänk 16bit int => 0 – 65 535 Skapa int[] vec = new int[65536]; Add i => vec[i]++; Sök value j => Is vec[j] > 0? Ta bort value k => vec[k]--; Men för en... Java int : 32bit 44 billion items => impractical!

6 Exempel av hash funktion D D a a n n i i e e l l ”Daniel” 6897110105101108 +++++= 589

7 Men... Hur unik är den?  hashfunc(”Daniel”) → 589  hashfunc(”leinaD”) → 589 Bättre lösning men….!  hashfunc(”TestValue”) → 129310392  Wrapp värdet till ett visst intervall Vilken? Arraystorleken…

8 En bättre hash funktion Ett bättre sätt att beräkna hash värdet Om vi har en text sträng av längd n+1 och alla tecken har index A n, A n-1,...,A 0 gör s = A n X n + A n-1 X n-1 +...+ A 0 X 0 = = ((A n )X + A n-1 )X +...+ A 0 Använd hashValue = s % array.length

9 Och då...... For example: ”Danne” (((’D’)128 + ’a’)128 + ’n’)128 + ’n’)128 + ’e’ = (((68)128 + 97)128 + 110)128 + 110)128 + 101 = 18 458 851 173 hashValue = 18 458 851 173 % array.length om length = 7919 (prim nummer) => hashValue = 18 458 851 173 % 7919 = 2690

10 Hur löser man kollision? Oavsätt hur unika keys en hash- funktionen tar fram, kollision alltid inträffas. Terminology  Load factor

11 Lösningar Linear probing ( undersökning ??) Quadratic probing Double hashing Separate chaining

12 Linear probing Sök fram till näst lediga platsen. hashfunc ( ) 10 18 X=18X+1,X+2,X+3,X+4,X+5,...

13 Linear probing Fenomen kallat: Primary clusters

14 Linear probing Bygger upp kluster  Påverkar exekveringstiden för insert () och find()!

15 Quadratic probing Försök undvika“primary clusters “ Snabare en linjär Kvadratisk inkrementation av undersökning avståndet X=18X+1 2,X+2 2,X+3 2,X+4 2,X+5 2,...

16 Quadratic probing  Garantera att hitta fria platser om de finns 1 2 = 12 2 = 43 2 = 9

17 Double hashing Använder en till hash funktion för att hitta fri plats. X = hash(obj); X2 = hash2(obj); X=18, X2=7X+1*X2,X+2*X2,X+3*X2,X+4*X2,... X=18, X2=718+1*7,18+2*7,17+3*7,18+4*7,...

18 Double hash probing 1*3= 32*3= 63*3 = 9 Hash2() = 3 Andra hash-funktionene Får inte returnera 0!

19 Separate chaining Varje hash position har en länkad lista. Påverkar inte andra värde, probing görs bara i listan. Varje element I tabellen är en länkad lista.

20 Separate chaining H H H H H H H H H H H H H H H H H H Insert

21 Jämförelse Linear probing  Enkel  Kan resultera i linjär söktid Quadratic probing  Kräver Load factor < 0.5 annars rehashing ??  Kräver prim tal för array storleken Separate chaining  LF < 1  Ingen dubblering, länkade listor är dinamiska !  Kan leda till linjär sökning men I verklighetet ganska kort Double hash probing  Eliminerar kluster

22 Implementation Quadratic prob.... Object[] list = new Object[size]; // Prime length... int hash(Object o) { int start= Math.abs(o.hashCode() % list.length); int quadNbr = 0; int index = start; while(list[index] != null) { index = start + Math.pow(++quadNbr, 2); } return pos; }


Ladda ner ppt "Hashing / Hash tabeller -- Kapitel 20. Hash? Varför en annan datastruktur? Konstant tid för både insert- och find- operationer."

Liknande presentationer


Google-annonser