Hashing og hashtabeller



Relaterede dokumenter
Hashing og hashtabeller

19 Hashtabeller. Noter. PS1 -- Hashtabeller. Hashing problemet. Hashfunktioner. Kollision. Søgning og indsættelse.

Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt.

Hashing. Ordbøger Hægtet hashing Hashfunktioner Lineær probering. Philip Bille

Hashing. Ordbøger Hægtet hashing Hashfunktioner Lineær probering. Philip Bille

Hashing. Hashing. Ordbøger. Ordbøger. Ordbøger Hægtet hashing Hashfunktioner Lineær probering. Ordbøger Hægtet hashing Hashfunktioner Lineær probering

Målet for disse slides er at beskrive nogle algoritmer og datastrukturer relateret til at gemme og hente data effektivt.

Merging og Hashing (del I)

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET EKSAMEN. Grundkurser i Datalogi. Algoritmer og Datastrukturer 1 (2003-ordning)

Datastrukturer (recap) Datastruktur = data + operationer herpå

Abstrakte datatyper C#-version

Tilgang til data. To udbredte metoder for at tilgå data: Sekventiel tilgang Random access: tilgang via ID (også kaldet key, nøgle) for dataelementer.

Tilgang til data. To udbredte metoder for at tilgå data: Sekventiel tilgang Random access: tilgang via ID (key, nøgle) for dataelementer.

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Grundlæggende Algoritmer og Datastrukturer. Hashing [CLRS, kapitel ]

Stakke, køer og lidt om hægtede lister - kapitel 16 og 17

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 7 n 1/ log n. (log n) 4

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 3/2. n logn (3/2) n. 2 3logn (3/2) n

Datastrukturer (recap)

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 23n log n. 4 n (log n) log n

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Danmarks Tekniske Universitet

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

DM502. Peter Schneider-Kamp

Datastrukturer (recap)

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen (bemærk at log n betegner totals logaritmen): n 2 (log n) 2 2.

Skriftlig eksamen i Datalogi

Stakke, køer og lidt om hægtede lister

Danmarks Tekniske Universitet

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Gerth Stølting Brodal. Hashing [CLRS, kapitel ]

Hashing. Hashing. Ordbøger. Ordbøger. Ordbøger Hægtet hashing Hashfunktioner Lineær probering. Ordbøger Hægtet hashing Hashfunktioner Lineær probering

Skriftlig eksamen i Datalogi

Eksempel: Skat i år 2000

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 7 n 1/2 2 n /n 3 2logn n 2 /logn

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

Løsning af møntproblemet

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Prioritetskøer ved»heap«, simulering

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Danmarks Tekniske Universitet

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Rekursion og dynamisk programmering

Mm8: Hash tables, Hashing and binary search trees - November 7, 2008

Tabeller (I) Tabeller

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Jacob Christiansen, Institut for MAtematik og DAtalogi, Syddansk Universitet, Odense

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Sekvenser af længde mellem 1 og 4 ord repræsenteres ved en klasse Segment, som uden grundlæggende ser således ud:

Skriftlig Eksamen Algoritmer og Datastrukturer (dads)

Danmarks Tekniske Universitet

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 6

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 2 2 n 1/n (logn) n. n 2

Opgave 1 (10%) I det følgende angiver log n 2-tals-logaritmen af n. Ja Nej. n+3n er O(2n)? n 6 er O(n 5 )? nlogn er O(n 2 /logn)? 4n 3 er O(3n 4 )?

Bits, bit operationer, integers og floating point

DM507 Algoritmer og datastrukturer

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 5. 5n 2 5 logn. 2 logn

Ugeseddel 4 1. marts - 8. marts

DM507 Algoritmer og datastrukturer

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 2 n (log n) 2. 3 n /n 2 n + (log n) 4

Klasser og nedarvning

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

DM507 Algoritmer og datastrukturer

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Danmarks Tekniske Universitet

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 4 n n 3n n 2 /logn 5 n n (logn) 3n n 2 /logn 4 n n 5 n

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 5n 4. logn. n 4n 5 n/logn. n n/logn 5n

1. Redegør for Lister, stakke og køer mht struktur og komplexitet af de relevante operationer

Forelæsning Uge 4 Torsdag

DM507 Algoritmer og datastrukturer

DATALOGISK INSTITUT, AARHUS UNIVERSITET

Kursusarbejde 3 Grundlæggende Programmering

Prioritetskøer og hobe. Philip Bille

Skriftlig Eksamen Algoritmer og Datastrukturer 1. Datalogisk Institut Aarhus Universitet

02105 Eksamensnoter. Lasse Herskind S maj Sortering 3

Oversættere, ugeopgave 3

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n+logn logn (logn) 7 (3/2) n

Danmarks Tekniske Universitet

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n n (log n) 2. n 2 + log n 3 n. n n (log n)

Søgemaskineprojekt. Analyse og implementering af en søgemaskine og en crawler til denne. Vejleder: Theis Rauhe

DM507 Algoritmer og datastrukturer

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 7 n 1 7 7/n. 7nlogn. 7n 7nlogn n7

Skriftlig Eksamen Algoritmer og Datastrukturer 1. Datalogisk Institut Aarhus Universitet. Mandag den 22. marts 2004, kl

Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden.

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Transkript:

Datastrukturer & Algoritmer, Datalogi C Forelæsning 12/11-2002 Hashing og hashtabeller Teknik til at repræsentere mængder Konstant tid for finde og indsætte men ingen sortering af elementerne Specielt udviklet til Meget stort udfaldsrum... hvor faktiske mængder er relativt små i forhold til udfaldsrum Standardeksempel nr. 1: Udfaldsrum = mængden af alle mulige navne på variable, klasser... Faktisk mængde = mængden af alle navne i et bestemt Javaprogram Dagens program Indledningsøvelse: repræsentation af mængder over små udfaldsrum Princippet i Hashing: Om hashingfunktioner Kollisioner, dvs. to forskellige objekter hasher til samme tal Løsning på problemet 0: Hægtede lister Løsning på problemet 1: Lineær afprøvning Løsning på problemet 2: Kvadratisk afprøvning Kort om implementation i Javas API o Med en lille afstikker om at heltal i Java er skøre (1)

Hashing??? Ordbogsopslag: hash v.t. (VP 1, 10 with up) chop or cut up (meat) into small pieces. n. 1. [U] (dish of) cooked meat,~ed and re-cooked. 2. (fig.) make a ~ of sth., do it very badly, make a mess of it. settle sb. s ~, deal with him in such a way that he gives no more trouble. Teknik til repræsentation af mængder over Meget stort udfaldsrum... hvor faktiske mængder er relativt små i forhold til udfaldsrum Ideen: at afbilde stort adresserum over i et lille: X h h(x) et tal mellem 0 og max (2)

Indledende øvelse: Repræsentation af mængder over små udfaldsrum Pascal (Wirth, ca. 1974) type fisk = (torsk, sild, rødspætte, kuller, kulmule, fjæsing, gråsej, pighvar, slethvar, laks, ørred, tobis); var nogle_fisk, flere_fisk, endnu_flere_fisk : set of fisk; nogle_fisk := [torsk..kuller, tobis, slethvar]; flere_fisk := [torsk, rødspætte..fjæsing, laks, slethvar]; endnu_flere_fisk := nogle_fisk + flere_fisk; // foreningsmgd nogle_fisk U flere_fisk Compiler tildeler hvert symbol et nummer torsk -> 0 sild -> 1... tobis -> 11 En mængde er en bitvektor, f.eks. nogle_fisk = 111100001001 flere_fisk = 101111000100 endnu_flere_fisk = 111111001101 + eller U implementeret ved bitvis logisk eller OBS: Java understøtter bitvise operationer, så princippet kan eftergøres men man må selv lege compiler! Forslag: static final int torsk = 1; static final int sild = 2; static final int rødspætte = 4; static final int kuler = 8; int nogle_fisk = torsk+sild+rødspætte+kuller+tobis+slethvar; endnu_flere_fisk = nogle_fisk flere_fisk; //bitvis eller (3)

Princippet i Hashing: Komprimere adresserum vha hashfunktion X h h(x) et tal mellem 0 og max Og bruge princippet fra bitvektoren: 1 jeg er med; 0 jeg er ikke med. Problem: Kollision, når to elementer hasher til samme værdi $ x, y: x y /\ h(x)=h(y) Hvad betyder bit(7)=1?? (4)

En mulig løsning på problemet, hægtet liste af objekter: Objekt X Objekt Y X Y /\ h(x) = h(y) Nu ikke bitvektor men array 0..max af hægtede lister af objekter (dvs. repræsentation af objekter i den store mængde (udfaldsrummet). Ikke populær da det giver ekstra arbejde med at forfølge referencer hver gang, selv når tabellen er stort set tom! De sædvanlige løsninger på problemet: Hvis pladsen er optaget så find en anden plads i tabellen (efter fast algoritme): Objekt X Objekt Y Af finde Y i tabellen: Hvis tabel( h(y) ) tom, så er Y ikke med; Hvis tabel( h(y) ) refererer til objekt Y så OK; Hvis tabel( h(y) ) refererer til objekt X ( Y) så prøv andet steds...; (5)

Kunsten at finde en anden plads i tabellen Den oplagte metode: Linear probing Prøv næste ubrugte celle: Antag h(x) = h(y) = 117 h(z) = 118 h(æ) = 117 117: X 117: X 118: 118: Y 119: 119: 120: 120:...... 117: X 117: X 118: Y 118: Y 119: Z 119: Z 120: 120: Æ...... Fordele: Virker altid indtil tabellen er helt fuld Ulemper: Der dannes klumper. Dvs. for mange indsætte og finde kolliderer flere gange! (Kræver et matematisk argument, som vi springer over) (6)

Den mest udbredte strategi: Quadratic probing hvis plads h(y) er ledig placér Y der; ellers {i = 1; hvis plads (h(y) + i 2 )%tabelstørrelse ledig, så placér Y der; ellers {i++; goto } ; } Hvad får vi ud af det? En matematiker kan bevise: Klumpningsgraden mindre Hvis tabelstørrelse er et primtal, så besøges halvdelen af alle celler i værste fald Dvs. fyldningsgrad på 50% eller derover er ikke godt! Tag det som et kuriøst faktum; ikke eksamenspensum at redegøre for det!! NB: Bogen gør et nummer ud af at optimere beregningen så multiplikation og modulo operation undgås 0 2 = 0 1 2 = 0 + 1 = 1 2 2 = + 3 = 4 3 2 = + 5 = 9 4 2 = + 7 = 16... dvs. nu følgende kode: currentpos += 2 * ++collisionnum -1; if (currentpos>= array.length) currentpos -= array.length; OBS-OBS-OBS: En god compiler oversætter 2 * til højreskift En god compiler oversætter -1 til én maskininstruktion DEC <register> (7)

Om hashfunktionen Faktum vi må leve med: Kollisioner kan ikke undgås Krav til god hashfunktion skal sprede sig så godt som muligt over hele intervallet o ramme alle celler o og ca. lige meget o og det for en typisk mængde af objekter. skal kunne beregnes effektivt Eksempel på dårlig hashfunktion; tablesize = to-talspotens int hash(string key, int tablesize) { int hashval = 0; for (int i = 0; i < key.length(); i++) hashval = (hashval * 256 + key.charat(i)) % tablesize; return hashval} Læs i bogen i afsnit 20.2 om at primtal er gode, men der er meget meget meget mere i historien om, hvad der gør en hashfunktion god! For at forstå det, skal vi lige have en foredrag om heltal i Java som er uden kontrol for overflow!!! (8)

Hvad er overflow? Eksempel: Regning med tal op til 4 cifre 0020 0500 + 0099 + 0499 ======== ======== 0119 9999 0502 + 0503 ========???? En elektronisk dims kunne måske vise give 0502 + 0503 ======== Svarer til OVERFLOW kontrol EEEE En dum mekaniske dims med fire hjul med hver 10 cifre vil sandsynligvis vise 0502 + 0503 ======== Uden OVERFLOW kontrol 1 0005 (9)

Eksempel med 4-bits aritmetik hvor bit længst til venstre er fortegn f.eks. 0100 4 10 1001 1 10 1) 2) 0010 0111 + 0011 + 0111 ======== ======== 0101 0 1110 Med overflowkontrol: Eksempel 2 giver anledning til fejlmeddelelse Uden overflowkontrol: Eksempel 2 regner forkert: 7 + 7 = 6!!!! (ralle) Java s heltal opfører sig ca. på den måde: public final class OverFlowTest { public static void main( String [ ] args ) { int n = 0;int i; n = 2147483647; // maximal int System.out.println("n " + n); n = n+17; System.out.println("n " + n); for(i=0; i< 2147483647; i=i+100000) {n=n+1;} System.out.println("SLUT); } } n 2147483647 n -2147483632 ^C Programmet gik i løkke pga. overflow og manglende overflowcheck (10)

Om hashing i Java API Standardklasser for HashSet ~ svarende til de hashede mængder vi har set HashMap ~ afbildning repræsenteret som hashede mængder, hvor vi for en objekt X, i tabellen finder ref. til objekt [fra X, til Værdi ] Bemærk at den generelle klasse Object har metode hashcode() som returnerer bare-et-eller-andet-heltal. For at kunne bruge HashMap og HashSet på sine egne objekter må man alså huske at skrive en hascode() metode (11)

Eksempel på indbygget hashcode() for tekststrenge: public final class HaCo { public static void printhash(string s) {System.out.println(s + ": " + s.hashcode());} public static void main( String [ ] args ) { printhash("a"); printhash("b"); printhash("c"); printhash("aa"); printhash("ab"); printhash("ac"); printhash("ba"); printhash("der var en gang en mand"); printhash("han boede i en spand"); printhash("hsdjazd noperun fgkdfgo krpot, krpot, poylgkrs okerpil mkdfg!"); }} a: 97 b: 98 c: 99 aa: 3104 ab: 3105 ac: 3106 ba: 3135 Der var en gang en mand: -904611645 Han boede i en spand: -1964416372 Hsdjazd noperun fgkdfgo krpot, krpot, poylgkrs okerpil mkdfg!: -505073700 Både positive og negative tal returneres Dvs. implementation af hashtabel skal teste >= 0 og tage modulo (%) tabelstørrelse (12)

Implementation af Java.util s HashSet og HashSet: Baseret på quadratic probing med primtal som tabellængde Re-hashing, hvis tabel bliver halvt fuld, så fordobles tabellen (rundet op til næste primtal) Sletning foretages ved at indsætte en boolean i hver celle active = true ~ som vi forventer active = false ~ pågældende felt har været indsat, men slettet igen (og skal ignoreres) Nødvendig pga. probing da ægte sletning for bøvlet! Ellers ingen overraskelser, kig på koden i afsnit 20.4.1. ~ Tak for Deres opmærksomhed ~ (13)