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

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

INF Algoritmer og datastrukturer

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

Hashing. INF Algoritmer og datastrukturer HASHING. Hashtabeller

INF1020 Algoritmer og datastrukturer

INF2220: Forelesning 3

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

INF2220: Forelesning 3

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

INF1010 Hashing. Marit Nybakken 8. mars 2004

Hashing: Håndtering av kollisjoner

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

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

Hashfunksjoner. Hashfunksjonen beregner en indeks i hashtabellen basert på nøkkelverdien som vi søker etter

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

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

INF Algoritmer og datastrukturer

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Dagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner

INF Algoritmer og datastrukturer

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

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

Datastrukturer for rask søking

INF Algoritmer og datastrukturer

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

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

UNIVERSITETET I OSLO

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

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

PG4200 Algoritmer og datastrukturer Forelesning 9

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

Obligatorisk oppgave 1 INF1020 h2005

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

Liste som abstrakt konsept/datatype

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

Parallelle og distribuerte databaser del III

UNIVERSITETET I OSLO

Notater til INF2220 Eksamen

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

Pattern matching algorithms. INF Algoritmer og datastrukturer. Lokalisering av Substrenger. Brute force

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

Pensum: fra boken (H-03)+ forelesninger

AlgDat 12. Forelesning 2. Gunnar Misund

IN Algoritmer og datastrukturer

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

INF Algoritmer og datastrukturer

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

Pensum: fra boken (H-03)+ forelesninger

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

Algoritmer og Datastrukturer IAI 21899

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

Obligatorisk oppgave 1 i INF 4130, høsten 2008

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

Uke 5 Disjunkte mengder

Datastrukturer. Stakker (Stacks) Hva er en datastruktur? Fordeler / Ulemper. Generelt om Datastrukturer. Stakker (Stacks) Elementære Datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

INF2220: Forelesning 2

Ordliste. Obligatorisk oppgave 1 - Inf 1020

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

Python: Oppslagslister (dictionaries) og mengder 3. utgave: Kapittel 9

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

Indeksering. Konvensjonelle indekser B-trær og hashing Flerdimensjonale indekser Trestrukturer Hashliknende strukturer Bitmapindekser

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

UNIVERSITETET. Indeksering. Konvensjonelle indekser B-trær og hashing Flerdimensjonale indekser Hashliknende strukturer.

Plan for dagen. Vprg 4. Dagens tema - filbehandling! Strømmer. Klassen FilLeser.java. Tekstfiler

INF1010 notat: Binærsøking og quicksort

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Obligatorisk oppgave 1 i INF 4130, høsten 2009

INF Algoritmer og datastrukturer

UNIVERSITETET. Indeksering. Hvordan finne et element raskt? Vera Goebel, Ellen Munthe-Kaas

UNIVERSITETET I OSLO. Indeksering. Hvordan finne et element raskt? Institutt for Informatikk. INF Ellen Munthe-Kaas

Indeksering. Konvensjonelle indekser B-trær og hashing Flerdimensjonale indekser Treliknende strukturer Hashliknende strukturer Bitmapindekser

Læringsmål for forelesningen

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Stack. En enkel, lineær datastruktur

Innledning. IN2010/INF Algoritmer og datastrukturer. Tirsdag 27. november 2018 Kl (4 timer)

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Unntak (exceptions) (Kap 6) Dictionaries (Kap. 9) Terje Rydland - IDI/NTNU

Søking i strenger. Prefiks-søking Naiv algoritme Knuth-Morris-Pratt-algoritmen Suffiks-søking Boyer-Moore-algoritmen Hash-basert Karp-Rabin-algoritmen

INF1000 HashMap. Marit Nybakken 2. november 2003

EKSAMEN. Emne: Algoritmer og datastrukturer

Grunnleggende Datastrukturer

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Disjunkte mengder ADT

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

Indeksering. Konvensjonelle indekser B-trær og hashing Flerdimensjonale indekser Trestrukturer Hashliknende strukturer Bitmapindekser

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

PG4200 Algoritmer og datastrukturer Forelesning 7

Obligatorisk oppgave 5: Labyrint

Turingmaskiner.

Transkript:

Maps og Hashing INF0 - Algoritmer og datastrukturer HØSTEN 00 Institutt for informatikk, Universitetet i Oslo INF0, forelesning : Maps og Hashing Map - Abstrakt Data Type (kapittel.) Hash-funksjoner (kapittel..) hashcode (kapittel..) Kollisjonshåndtering (kapittel..) Åpen hashing Lukket hashing (== Åpen addressering) Rehashing (kapittel..) Kapittel. -. ikke pensum Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Map - ADT Map vs Array Ideen bak interfacet Map<K,V> V:SomeObject Array - Nøkler er heltall Maps - Nøkler er objekter K:A K:B V:AnotherObject Array - Raske oppslag Maps - Vi må lage raske oppslag Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning /

Hashing Anta at en bilforhandler har 0 ulike modeller han ønsker å lagre data om. Hvis hver modell har et entydig nummer mellom 0 og kan vi enkelt lagre dataene i en array som er 0 lang. Hva hvis numrene ligger mellom 0 og? Array som er 0 000 lang: sløsing med plass! Array som er 0 lang: søking tar lineær tid... Ideen i hashing er å lagre elementene i en array (hashtabell), og la verdien til elementet x (eller en del av x, kalt nøkkelen til x) bestemme plasseringen (indeksen) til x i hashtabellen. tablesize = størrelsen på hashtabellen Hash-funksjon: Fra nøkkelverdier til tabellindekser Egenskaper til en god hash-funksjon: Rask å beregne Kan gi alle mulige verdier fra 0 til tablesize. Gir en god fordeling utover tabellindeksene. x hash(x) Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Idealsituasjonen Eksempel: Ideell situasjon Perfekt situasjon: n elementer tabell med n plasser hash-funksjon slik at den er lett (rask) å beregne forskjellige nøkkelverdier gir forskjellige indekser Eksempel: Hvis modellene er nummerert 0, 000, 000,..., 000, 000 kan data om modell i lagres på indeks i/ 000 i en tabell som er 0 stor. Problem: Hva hvis modell 000 får nytt nummer? Input: 0,,,,,,,,, Hash-funksjon: hash(x, tablesize) = x Hva hvis hash-funksjonen hadde vært hash(x, tablesize) = x mod tablesize istedenfor? 0 0 0 Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning /

Hashtabell er en abstrakt datatype (ADT) Hashtabeller Hashing er en teknikk for å implementere denne ADTen. Størrelsen tablesize er en del av ADTen! Hovedproblemstillinger ved hashing Hvordan velge hash-funksjon? ofte er nøklene strenger Hvordan håndtere kollisjoner? Hvor stor bør hashtabellen være? I praksis Hash-funksjonen kan ikke mappe alle nøkler til ulike indekser. I stedet: hash-funksjonen bør gi en så jevn fordeling som mulig. En hashtabell tilbyr: innsetting sletting søking med konstant gjennomsnittstid. Vi får raske svar på om et element er med i datastrukturen Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning 0 / Når bruker vi Hashtabeller? Eksempler: kompilatorer: Er variabel y deklarert? stavekontroller: Finnes ord x i ordlisten? database spørringer: Nøkler mapper til kolonnenavn, verdi til innhold XML parsing: Nøkler blir attributtnavn, verdi blir innhold Nesten alle scriptespråk har hash som del av språket. (Perl, Python, Ruby, PHP... ) myhash = {; myhash[ key ] = "value"; Hash-funksjoner Eksempel Nøkler er heltall Begrenset antall tabellindekser La hash-funksjonen være hash(key) = key mod tablesize Gir jevn fordeling for tilfeldige tall. Hint: Pass på at ikke nøklene har spesielle egenskaper: Hvis tablesize = 0 og alle nøklene slutter på 0 vil alle elementene havne på samme indeks! Huskeregel: La alltid tabellstørrelsen være et primtall. Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning /

Strenger som nøkler Vanlig strategi: ta utgangspunkt i ascii/unicode-verdiene til hver bokstav og gjør noe lurt. Funksjon : Summer verdiene til hver bokstav. p u b l i c s t a t i c i n t hash ( S t r i n g key, i n t t a b l e S i z e ) { i n t hashval = 0 ; Funksjon : Bruk bare de tre første bokstavene og vekt disse. p u b l i c s t a t i c i n t hash ( S t r i n g key, i n t t a b l e S i z e ) { r e t u r n ( key. charat ( 0 ) + key. charat ( ) + key. charat ( ) ) % t a b l e S i z e ; f o r ( i n t i = 0 ; i < key. l e n g t h ( ) ; i ++) { hashval += key. charat ( i ) ; r e t u r n ( hashval % t a b l e S i z e ) ; Fordel: Grei fordeling for tilfeldige strenger. Ulempe: Vanlig språk er ikke tilfeldig! Fordel: Enkel å implementere og beregne. Ulempe: Dårlig fordeling hvis tabellstørrelsen er stor. Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Funksjon : keysize i=0 key[keysize i ] i p u b l i c s t a t i c i n t hash ( S t r i n g key, i n t t a b l e S i z e ) { i n t hashval = 0 ; f o r ( i n t i = 0 ; i < key. l e n g t h ( ) ; i ++) { hashval = hashval + key. charat ( i ) ; Hash-funksjoner: oppsummering Må (i hvert fall teoretisk) kunne gi alle mulige verdier fra 0 til tablesize. Må gi en god fordeling utover tabellindeksene. Tenk på hva slags data som skal brukes til nøkler. hashval = hashval % t a b l e S i z e ; i f ( hashval < 0) { hashval += t a b l e S i z e ; r e t u r n hashval ; Fødselsår kan gi god fordeling i persondatabaser, men ikke for en skoleklasse! Generelt: Bør være mange ganger tablesize før man gjør mod-operasjonen. Fordel: Enkel og relativt rask å beregne. Stort sett bra nok fordeling. Ulempe: Beregningen tar lang tid for lange nøkler. Ikke ta utgangspunkt i deler av nøklen som bare kan ta få av mulige verdier, for eksempel første siffer i datoen/månedsnummeret. Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning /

hashcode Kollisjonshåndtering Alle objekter i Java utvider klassen java.lang.object Object inneholder metoden: int hashcode() Trenger vi da tenke på implementasjon av hash funksjoner? hashcode() returnerer typisk minneaddresse konvertert til int Objekter vi anser for like må hashe til samme verdi De vil aldri ha samme minneaddresse Vi må også re-implementere equals i klassen vi bruker som nøkkel Hva gjør vi hvis to elementer hashes til den samme indeksen? Åpen hashing: Elementer med samme hashverdi samles i en liste (eller annen passende struktur). Lukket hashing: Dersom en indeks er opptatt, prøver vi en annen indeks inntil vi finner en som er ledig. Det finnes flere strategier for å velge hvilken annen indeks vi skal prøve. Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Åpen hashing ( Separate chaining ) Lukket hashing åpen adressering Elementer med samme hashverdi samles i en liste (eller annen passende struktur) Vi forventer at hash-funksjonen er god, slik at alle listene blir korte. Vi definerer load-faktoren, λ, til en hashtabell til å være antall elementer i tabellen i forhold til tabellstørrelsen. For åpen hashing ønsker vi λ.0. 0 0 Hvis hash-verdien allerede er brukt: Prøver alternative indekser h 0 (x), h (x), h (x),... inntil vi finner en som er ledig. h i er gitt ved: og slik at f (0) = 0. h i (x) = (hash(x) + f (i)) mod tablesize Merk at vi trenger en større tabell enn for åpen hashing generelt ønsker vi her λ < 0.. Skal se på tre mulige strategier (valg av f ): Lineær prøving Kvadratisk prøving Dobbel hashing Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning 0 /

Lineær prøving Dobbel hashing Velger f til å være en lineær funksjon av i, typisk f (i) = i. Input:,,,, Hash-funksjon: hash(x, tablesize) = x mod tablesize Kvadratisk prøving: La f være f (i) = i. 0 Bruker en ny hash-funksjon for å løse kollisjonene, typisk f (i) = i hash (x), med hash (x) = R (x mod R) hvor R er et primtall mindre enn tablesize. Eksempel. Input:,,,, Andre hash-funksjon: hash (x) = (x mod ) 0 Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Rehashing Java s Hashtable Hvis tabellen blir for full, begynner operasjonene å ta veldig lang tid. Mulig løsning: Lag en ny hashtabell som er omtrent dobbelt så stor (men fortsatt primtall!). Gå gjennom hvert element i den opprinnelige tabellen, beregn den nye hash-verdien og sett inn på rett plass i den nye hashtabellen. Dette er en dyr operasjon, O(n), men opptrer relativt sjelden (må ha hatt n/ innsettinger siden forrige rehashing). Klassen java.util.hashtable: Implementerer en hashtabell som mapper nøkler til verdier. Bruker åpen hashing ved kollisjon lagres verdiene i en bøtte (som blir gjennomsøkt sekvensielt) Default load faktor λ < 0., tradeoff tid/plass. Når load faktor passeres, flyttes alle elementene over i en større hashtabell ved rehashing Bjarne Holen (Ifi, UiO) INF0 H00, forelesning / Bjarne Holen (Ifi, UiO) INF0 H00, forelesning /

Hashing Oppsummering Hashtabell gir innsetting, sletting, og søking med konstant gjennomsnittstid Hvor stor bør hash-tabellen være: tablesize Hash-funksjon: jevn fordeling over indeksene 0 til tablesize. Kollisjoner: åpen vs. lukket hashing Bjarne Holen (Ifi, UiO) INF0 H00, forelesning /