INF1010 Hashing. Marit Nybakken 8. mars 2004

Like dokumenter
INF2220: Forelesning 3. Map og hashing Abstrakte datatyper (kapittel 3.1) Map (kapittel 4.8) Hashing (kapittel 5)

INF2220: Forelesning 3

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

... HASHING. Hashing. Hashtabeller. hash(x)

Hashing. INF Algoritmer og datastrukturer HASHING. Hashtabeller

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

INF1020 Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Hashtabeller. Lars Vidar Magnusson Kapittel 11 Direkte adressering Hashtabeller Chaining Åpen-adressering

Kapittel 14, Hashing. Tema. Definere hashing Studere ulike hashfunksjoner Studere kollisjonsproblemet 17-1

Hashing: Håndtering av kollisjoner

PG4200 Algoritmer og datastrukturer Forelesning 9

INF2220: Forelesning 3

public interface Collec>on<V> { public void add(v value); public default V remove(v value) { return null;

INF1000 Behandling av tekster

INF1010 Sortering. Marit Nybakken 1. mars 2004

INF1000 HashMap. Marit Nybakken 2. november 2003

INF1000 oppgaver til uke 38 (17 sep 23 sep)

UNIVERSITETET I OSLO

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

UNIVERSITETET I OSLO

INF Løsning på seminaropppgaver til uke 8

INF1000. Marit Nybakken 10. februar 2004

INF Uke 10. Ukesoppgaver oktober 2012

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing. Børge Rødsjø

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

O(1) søking? Søking i sortert array og i søketrær: Optimalt søk som er O(1):

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

UNIVERSITETET I OSLO

Oblig4 - forklaringer. Arne og Ole Christian

MED TIDESTIMATER Løsningsforslag

O(log n) - søk. Søking i et balansert søketre med n elementer er alltid O(log n) Søkingen er basert på parvise sammenligninger av to og to verdier

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF1010 Rekursjon. Marit Nybakken 1. mars 2004

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

UNIVERSITETET I OSLO

Tillatte hjelpemidler: alle skrevne og trykte. Antall sider: 2 (+ 1 side vedlegg, bakerst). Oppgave 1 [25%]

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

INF1010 Tråder J. Marit Nybakken Motivasjon. Å lage en tråd

Enkle generiske klasser i Java

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

UNIVERSITETET I OSLO

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing

Løsningsforslag til eksamen i INF1000 våren 2006

Øvingsforelesning 2 - TDT4120. Grafer og hashing. Benjamin Bjørnseth

Obligatorisk oppgave 1 INF1020 h2005

Løse reelle problemer

Gjennomgang av eksamen H99

2 Om statiske variable/konstanter og statiske metoder.

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

UNIVERSITETET I OSLO

Forelesning inf Java 4

Forelesning inf Java 5

Ukeoppgaver INF1000: 12. feb 16. feb

UNIVERSITETET I OSLO

Forelesning inf Java 5

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

INF1000 Metoder. Marit Nybakken 16. februar 2004

INF1000 Prøveeksamen Oppgave 7 og 9

UNIVERSITETET I OSLO

Klasser, objekter, pekere og UML. INF gruppe 13

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

UNIVERSITETET I OSLO

INF1010 UML. Marit Nybakken 26. januar 2004

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Kapittel 9: Sortering og søking Kort versjon

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

TDT4100 Objektorientert programmering

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Generelle Tips. INF Algoritmer og datastrukturer. Åpen og Lukket Hashing. Hashfunksjoner. Du blir bedømt etter hva du viser at du kan

INF Algoritmer og datastrukturer

INF1000: Forelesning 6. Klasser og objekter del 1

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

UNIVERSITETET I OSLO

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Transkript:

INF1010 Hashing Marit Nybakken marnybak@ifi.uio.no 8. mars 2004 Til nå har vi trodd at en HashMap var en mystisk uendelig stor samleeske der vi på magisk vis kan putte inn objekter og ta ut objekter ved hjelp av nøkler. Men alle datastrukturer på implementeres på en eller annen måte ved hjelp av grunnleggende javakode. Nå skal vi se hvordan det er gjort når de smarte folka i Sun laga HashMap. Hashing En hashtabell kan implementeres ved hjelp av to arrayer. I den ene arrayen lagrer vi nøklene, i den andre lagrer vi de tilhørende objektene. Ligger nøkkelen til et objekt på indeks 21, ligger objektet også på indeks 21. For å bestemme hvilken indeks som skal brukes, tar vi nøkkelen, som som oftest er et String-objekt, og kjører den gjennom en hashfunksjon som returnerer et heltall. En slik hashfunksjon kan lages på mange forskjellige måter. Vi kan summere ascii-verdien til bokstavene. Vi kan bruke minneadressen til String-objektet. Vi kan ta solas posisjon i forhold til Merkur i det objektet ble opprettet og multiplisere dette med antall fødte barn i Jugoslavia i etterkrigsårene. Uansett så søker vi en funksjon som gir oss indekser spredt utover hele tabellen og der to ulike nøkler gir to ulike indekser så langt det lar seg gjøre. 1

Figur 1: En hashtabell er to arrayer hashcode I java er det slik at alle objekter har sin egen hashkode som vi kan få tak i ved å kalle funksjonen hashcode i objektet. Derfor slipper vi å stusse på hvordan vi skal skrive vår egen hashfunksjon før i INF1020. hashcode funker slik: gir alltid det samme heltallet for det samme objektet gir alltid det samme heltallet for to forskjellige objekter som er like i følge equals-metoden. Det er derfor tekststrenger fungerer så fint som nøkler, equals gir true hvis den sammenligner to String-objekter med den samme teksten inni, selv om objektene er forskjellige. Det samme gjelder objekter av klassen Integer, de ser på tallet inni objektet og ikke pekerlikhet. Hashkoden kan være et kjempestort tall, og til og med et negativt tall. class TesteHashkode { 2

Figur 2: Ta et objekt og få ut en arrayindeks public static void main(string [ ] args) { String a = "banantre"; String b = "salte bjørner"; String c = "banantre"; System.out.println(a + " sin hashkode er " + a.hashcode()); System.out.println(b + " sin hashkode er " + b.hashcode()); 10 System.out.println(c + " sin hashkode er " + c.hashcode()); } } D:\komp\hashing>java TesteHashkode banantre sin hashkode er 1867554901 salte bj rner sin hashkode er 250890568 banantre sin hashkode er 1867554901 20 Det er derfor vanlig å bruke indeksen hashkode % tabellstørrelse. Tabellstørrelse bør være primtall, det gir best spredning. Kollisjonshåndtering Det kan godt hende at teksten snømus og teksten salte bjørner gir nøyaktig den samme hashkoden og derfor den samme indeksen i objektarrayen. Hvis 3

Figur 3: Separate chaining nøkkelen snømus kommer først og tar opp plassen, hvor skal da objektet med nøkkelen salte bjørner puttes hen? Plassen er jo opptatt. Dette kalles en kollisjon, og metodene for å håndtere slik styggedom kalles kollisjonshåndtering. Det virkelig vriene med å lage gode hashtabeller er å finne ut hva man skal gjøre ved kollisjoner. Her er noen strategier Separate chaining Denne teknikken går ut på at hver tabellplass har en liste over alle objektene som hashet hit (fikk denne indeksen ut fra nøkkelen). Dette kan typisk være en linket liste, der hvert objekt har en peker til det neste objektet i listen (linkede lister kommer litt senere i pensum, men det er bare objekter som hektes sammen vha pekere til en liste, omtrent som når du kjeder deg og hekter sammen binderser til en kjede). Se figur 3. Når objektet skal hentes ut søker vi bare gjennom alle objektene i listen på tabellplassen. Ganske greit å gjennomføre, men det går tregere fordi vi må opprette plass til neste element i lista hele tiden. Vi må også implementere en ekstra datastruktur. 4

Open adressing Figur 4: Linear probing Open adressing går ut på at vi prøver nye celler hvis den vi ønsket var opptatt. Å prøve ut nye celler må selvfølgelig foregå etter et bestemt mønster, slik at det er mulig å finne igjen objektet. Linear probing Her finner vi neste celle ut i fra en lineær funksjon. Ofte er dette bare å hoppe nedover tabellen steg for steg til vi finner en som ikke er opptatt. Se figur 4. Denne teknikken skaper noe som kalles for primary clustering. Dette er store blokker med opptatte celler etter hverandre, selv når tabellen er realtivt tom. Vi får altså da ikke den spredningen i tabellen vi er ute etter. Hvis enda 5

Figur 5: Objektene har hopa seg sammen 6

Figur 6: Quadratic probing et objekt hasher inn i blokken, må den bruke mange forsøk på å finne en ledig celle og blokken blir i tillegg større. Se figur 5. Quadratic probing Her søker vi etter en ledig celle ut i fra en kvadratisk funksjon. Funksjonen er gjerne i 2, hvilket vil si at vi først sjekker cellen 1 plass unna, deretter cellen 4 plasser unna (2 2 ), så 9 (3 2 ), osv, helt til vi finner en ledig. Se figur 6. Her slipper man blokk-fenomenet, men hashtabellen bør maksimalt bli halvfull før vi må gjøre den større. Vi er faktisk ikke garantert å finne en ledig celle lenger når den er over halvfull. Dette er jo ikke spesielt god utnyttig av plassen. 7

Double hashing Med double hashing finner vi en ny plass ut i fra en ny hashfunksjon hvis plassen vi hashet til var opptatt. Det kalles dobbelhashing fordi vi hasher en hashkode. Hvis den første tabellplassen vi kom frem til var x, prøver vi først på plass nyhashfunksjon(x), deretter 2*nyHashfunksjon(x), helt til vi finner en ledig plass. Rehashing Når tabellen blir for full må vi lage oss en ny og større tabell. Da lager vi først en tabell omtrent 2 ganger så stor som den gamle. Deretter går vi igjennom alle objektene i den gamle tabellen, beregner ny tabellplass i den nye tabellen og flytter objektene over. Dette kalles rehashing fordi vi må beregne hashkode på nytt for alle objektene i den gamle tabellen, siden indeksen er avhengig av tabellstørrelsen. Dette tar selvfølgelig ganske lang tid, men heldigvis så skjer det ikke så ofte. Spørsmålet er når vi skal rehashe. Følgende strategier er mulige: Når tabellen er halvfull (quadratic probing kan feile, men kanskje litt vel tidlig?) Når vi feiler når vi prøver å putte inn et objekt (kanskje litt sent?) Når vi når en bestemt load factor. Det siste blir en gylden middelvei. Vi kan for eksempel velge å rehashe når bare 20% av plassene er ledige. 8