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

Like dokumenter
INF2220: Forelesning 3

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

INF2220: Forelesning 3

Hashing. INF Algoritmer og datastrukturer HASHING. Hashtabeller

INF1020 Algoritmer og datastrukturer

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

INF Algoritmer og datastrukturer

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

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

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

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

INF1010 Hashing. Marit Nybakken 8. mars 2004

Hashing: Håndtering av kollisjoner

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

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

UNIVERSITETET I OSLO

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

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

Notater til INF2220 Eksamen

Datastrukturer for rask søking

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

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

INF Algoritmer og datastrukturer

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

INF2220: Forelesning 2

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

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

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

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

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

UNIVERSITETET I OSLO

PG4200 Algoritmer og datastrukturer Forelesning 9

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

Liste som abstrakt konsept/datatype

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Pensum: fra boken (H-03)+ forelesninger

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

Obligatorisk oppgave 1 INF1020 h2005

UNIVERSITETET I OSLO

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

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

Pensum: fra boken (H-03)+ forelesninger

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

INF1000 HashMap. Marit Nybakken 2. november 2003

INF2220: Forelesning 2

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

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

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

IN Algoritmer og datastrukturer

Innhold. Innledning 1

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

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

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

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

Semantisk Analyse del III

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

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

UNIVERSITETET I OSLO

b) 10 2 = 20 c) 5 1 = 5.

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

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

INF Algoritmer og datastrukturer

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

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

INF Algoritmer og datastrukturer

Binær heap. En heap er et komplett binært tre:

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

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

Definisjon: Et sortert tre

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

AlgDat 12. Forelesning 2. Gunnar Misund

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

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

Flerveis søketrær og B-trær

Eksamen iin115 og IN110, 15. mai 1997 Side 2 Oppgave 1 Trær 55 % Vi skal i denne oppgaven se på en form for søkestrukturer som er spesielt godt egnet

Uke 5 Disjunkte mengder

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

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

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

Algoritmer og Datastrukturer IAI 21899

Post-it spørsmål fra timen (Arv og subklasser)

Algoritmer og Datastrukturer

2 Om statiske variable/konstanter og statiske metoder.

Litt om Javas class-filer og byte-kode

INF120: Oblig 3. Yngve Mardal Moe

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

KONTINUASJONSEKSAMEN

UNIVERSITETET I OSLO

Løsningsforslag til eksamen i PG4200 Algoritmer og datastrukturer 10. desember 2014

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

INF1010 siste begreper før oblig 2

INF Algoritmer og datastrukturer

København 20 Stockholm

Oppgave 1. Sekvenser (20%)

PG4200 Algoritmer og datastrukturer Forelesning 7

INF2220: Time 4 - Heap, Huffmann

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

EKSAMENSOPPGAVE. IAI20102 Algoritmer og datastrukturer

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

Transkript:

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

Map og hashing Ett minutt for deg selv: Hva vet du om maps/dictionarys og hashing fra tidligere? 2

ABSTRAKTE DATATYPER 3

Abstrakte datatyper En ADT består av: Et sett med objekter. Spesifikasjon av operasjoner på disse. Eksempler: ADT: binært søketre Operasjoner: innsetting, søking, fjerning, ADT: mengde Operasjoner: union, snitt, finn, ADT: map Operasjoner: containskey, get, put,

Hvorfor bruke ADTer? ADTer skiller det som er viktig (funksjonaliteten) fra detaljene (den konkrete implementasjonen). Dermed kan vi: Gjenbruke ADTen i andre programmer. Enklere overbevise oss om at programmet er riktig. Forandre innmaten (kodingen) av ADTen uten å forandre resten av programmet fordi grensesnittet er det samme. Lage modulære programmer. I Java er det naturlig å spesifisere en ADT som et interface. 5

MAP 6

Map ADT Samling (nøkkel,verdi)-par. Nøklene må være unike. Viktigste operasjoner: containskey(key): returnerer true hvis key finnes som nøkkel get(key): returnerer verdien assosiert med key put(key,value): legger til et nytt nøkkel/verdi-par keyset(): returnerer alle nøklene (som et sett) values(): returnerer alle verdiene SortedMap: Nøklene er organisert i sortert orden. 7

Maps To minutter sammen: Hvordan stemmer det du nå har hørt med det du trodde fra før? Hva lurer dere på nå? 8

HASHING 9

Hashing innledende eksempel Anta at en bilforhandler har 50 ulike modeller han ønsker å lagre data om. Hvis hver modell har et entydig nummer mellom 0 og 49 kan vi enkelt lagre dataene i en array som er 50 lang. Hva hvis numrene ligger mellom 0 og 49 999? Array som er 50 000 lang: Sløsing med plass! Array som er 50 lang: Søking tar lineær tid

Hashtabeller Ideen i hashing er å lagre elementene i en array (hashtabell). la verdien til elementet x (eller en del av x, da kalt nøkkelen til x), bestemme plasseringen (indeksen) til x i hashtabellen. Egenskaper til en god hash-funksjon: Rask å beregne. Kan gi alle mulige verdier fra 0 til tablesize - 1. Gir en god fordeling utover tabellindeksene. x hash(x) 0: 1: 2:... 11

Idealsituasjonen 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, 1 000, 2 000,, 48 000, 49 000 kan data om modell i lagres på indeks i/1 000 i en tabell som er 50 stor. Problem: Hva hvis modell 4 000 får nytt nummer 3 999? 12

Eksempel: ideell situasjon Input: 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 Hash-funksjon: hash(x,tablesize) = x 0: 0 0: 1: 2: 3: 4: 5: 6: 1 4 9 16 25 36 Hva hvis hash-funksjonen hadde vært hash(x,tablesize) = x mod tablesize istedenfor? 1: 2: 3: 4: 5: 6: 7: 49 7: 8: 64 8: 9: 81 9: 13

Hashtabell ADT En hashtabell tilbyr innsetting sletting søking med konstant gjennomsnittstid. Men: operasjoner som finnminste og skrivsortert har ingen garantier. 14

Når bruker vi hashtabeller? Brukes gjerne når vi først og fremst ønsker et raskt svar på om et gitt element finnes i datastrukturen eller ikke. Eksempler: Kompilatorer: Er variabel y deklarert? Stavekontroller: Finnes ord x i ordlisten? Spill: Har jeg allerede vurdert denne stillingen via en annen trekkrekkefølge? XML parsering: Nøkler blir attributtnavn, verdi blir innhold. Nesten alle scriptspråk has hash som del av språket. (Perl, Python, Ruby, PHP, ) 15

Hashing: problemstillinger Hvordan velge hash-funksjon? Ofte er nøklene strenger. Hvordan håndtere kollisjoner? Hvor stor bør hash-tabellen være? 16

Hash-funksjoner Eksempel: Heltall som nøkler Begrenset antall tabellindekser La hash-funksjonen være hash(x,tablesize) = x mod tablesize Dette gir jevn fordeling for tilfeldige tall. Pass på at ikke nøklene har spesielle egenskaper: Hvis tablesize = 10 og alle nøklene slutter på 0 vil alle elementene havne på samme indeks! Huskeregel: La alltid tabellstørrelsen være et primtall. 17

Strenger som nøkler: funksjon 1 Vanlig strategi: ta utgangspunkt i ascii/unicodeverdiene til hver bokstav og gjør noe lurt. Funksjon 1: Summer verdiene til hver bokstav. int hash1(string key, int tablesize) { int hashval = 0; for (int i = 0; i < key.length(); i++) { hashval += key.charat(i); } } return (hashval % tablesize); Fordel: Enkel å implementere og beregne. Ulempe: Dårlig fordeling hvis tabellstørrelsen er stor. 18

Strenger som nøkler: funksjon 2 Funksjon 2: Bruk bare de tre første bokstavene og vekt disse. int hash2(string key, int tablesize) { int hashval = key.charat(0) + 27 * key.charat(1) + 729* key.charat(2); } return (hashval % tablesize); Fordel: Grei fordeling for tilfeldige strenger. Ulempe: Vanlig språk er ikke tilfeldig! 19

Strenger som nøkler: funksjon 3 Funksjon 3: i=0 keysize-1 key[keysize-i-1] * 37 i int hash3(string key, int tablesize) { int hashval = 0; for (int i = 0; i < key.length(); i++) { hashval = 37*hashVal + key.charat(i); } } return Math.abs(hashVal % tablesize); Fordel: Enkel og relativt rask å beregne. Stort sett bra nok fordeling. Ulempe: Beregningen tar lang tid for lange nøkler. 20

Hash-funksjoner: Oppsummering Må (i hvert fall teoretisk) kunne gi alle mulige verdier fra 0 til tablesize - 1. Må gi en god fordeling utover tabellindeksene. Tenk på hva slags data som skal brukes til nøkler. 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. 21

hashcode i Java Alle Java-klasser er subklasser av java.lang.object, som inneholder metoden int hashcode() som typisk returnerer minneadresse konvertert til int. Men: Objekter vi regner som like (via equals) må ha samme hashverdi. 22

Kollisjonshåndtering Hva gjør vi når 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. 23

Åpen hashing (Separate chaining) 0: 1: 2: 0 81 1 Forventer at hashfunksjonen er god, slik at alle listene blir korte. 3: 4: 5: 6: 7: 8: 9: 64 25 36 49 4 16 9 Load-faktoren er antall elementer i hashtabellen i forhold til tabellstørrelsen. For åpen hashing ønsker vi 1.0 24

Lukket hashing åpen adressering Prøver alternative indekser h 0 (x), h 1 (x), h 2 (x), inntil vi finner en som er ledig. h i er gitt ved h i (x) = (hash(x) + f(i)) mod tablesize slik at f(0) = 0. Merk at vi trenger en større tabell enn for åpen hashing generelt ønsker vi her 0.5 Skal se på tre mulige strategier (valg av f): Lineær prøving Kvadratisk prøving Dobbel hashing 25

Lineær prøving Velger f til å være en lineær funksjon av i, typisk f(i) = i Eksempel: Input: 89, 18, 49, 58, 69 Hash-funksjon: hash(x,tablesize) = x mod tablesize 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 26

Kvadratisk prøving Velger f til å være en kvadratisk funksjon av i, typisk f(i) = i 2 Eksempel: Input: 89, 18, 49, 58, 69 Hash-funksjon: hash(x,tablesize) = x mod tablesize 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 27

Dobbel hashing Bruker en ny hash-funksjon for å løse kollisjonene, typisk f(i) = i * hash 2 (x), med hash 2 (x) = R (x mod R) hvor R er et primtall mindre enn tablesize. Eksempel: Input: 89, 18, 49, 58, 69 Andre hash-funksjon: hash 2 (x) = 7 (x mod 7) 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 28

Rehashing 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 hver element i den opprinnelige tabelln, 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/2 innsettinger siden forrige rehashing). 29

Utvidbar hashing Brukes spesielt når internminnet blir for lite, og det vesentligste blir antall diskoperasjoner. Anta at vi Skal lagre N elementer, der N varierer over tid. Kan lagre maksimalt M elementer i en diskblokk. Problemet med vanlig hashing er at Kollisjoner kan føre til at find(x) må undersøke mange diskblokker selv om hashfunksjonen distribuerer elementene godt. Rehashing blir veldig kostbart. 30

Løsning Lar hash-funksjonen via en katalog angi hvilken diskblokk et element x befinner seg i (hvis det finnes). Dermed trenger find(x) bare to diskaksesser (og bare en aksess dersom katalogen kan lagres i internminnet). 31

Utvidbar hashing: eksempel D = 2 00 01 10 11 d = 2 d = 2 d = 2 d = 2 M = 4 000100 001000 001010 001111 010101 101001 101100 101101 101111 111000 110101 Forenklet tegning, hvor vi for hvert element bare lagrer hashverdien til elementet (som 6-sifret binærtall). 32

Utvidbar hashing Katalogen har 2 D indekser. Hver diskblokk har plass til M elementer. For hver diskblokk L lagrer vi et tall d L D. Invariant: Det garanteres at alle elementene i L har minst de d første bitene felles. Dersom d L = D vil nøyaktig en indeks i katalogen peke på diskblokk L. Dersom d L < D vil to eller flere indekser i katalogen peke på L. Over tid forventer vi at ca 69% av hver diskblokk er fylt opp. 33

Innsettingsalgoritme 1. Beregn hash(x) og finn riktig diskblokk L ved å slå opp i katalogen på de D første sifrene i hashverdien. 2. Hvis det er færre enn M elementer i L, sett x inn i L. 3. Hvis L derimot er full, sammenlign d L med D: a) Dersom d L < D splitter vi L i to blokker L 1 og L 2 : i. Sett d L 1 = d L2 = d L + 1. ii. Gå gjennom elementene i L og plasser dem i L 1 eller L 2 avhengig av verdien på de d L + 1 første sifrene. iii. Prøv igjen å sette inn x (gå til punkt 2). b) Dersom d L = D: i. Doble katalogstørrelsen ved å øke D med 1. ii. Fortsett som ovenfor (splitt L i to blokker osv.) 34

Innsetting: eksempel D = 2 00 01 10 11 d = 1 d = 2 d = 2 M = 4 000100 001000 001010 010101 100001 101100 101101 101111 110101 111000 35

Java s HashMap Klassen java.util.hashmap: Implementerer en hashtabell som mapper nøkler til verdier. Implementerer grensesnittet Map (men ikke SortedMap). Bruker åpen hashing. Default tabellstørrelse 16. Default load faktor < 0.75 rehashing hvis denne overskrides. 36

Neste forelesning: 14. september PRIORITETSKØ OG HEAP HUFFMAN 37