INF2220: Forelesning 3

Like dokumenter
INF2220: Forelesning 3

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

Hashing. INF Algoritmer og datastrukturer HASHING. Hashtabeller

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

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

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

INF2220: Forelesning 2

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

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

INF2220: Forelesning 2

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

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

INF2220: Gruppe me 2. Mathias Lohne Høsten 2017

Hashing: Håndtering av kollisjoner

Notater til INF2220 Eksamen

INF1010 Hashing. Marit Nybakken 8. mars 2004

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

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

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

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

Definisjon: Et sortert tre

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

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

Definisjon av binært søketre

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

UNIVERSITETET I OSLO

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

Datastrukturer for rask søking

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

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

Uke 5 Disjunkte mengder

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

INF Algoritmer og datastrukturer

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

PG4200 Algoritmer og datastrukturer Forelesning 7

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

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

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

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

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

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

Lars Vidar Magnusson

UNIVERSITETET I OSLO

Binære trær: Noen algoritmer og anvendelser

Selv-balanserende søketrær

Lars Vidar Magnusson

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

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

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

Balanserte binære søketrær

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

INF Algoritmer og datastrukturer

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

IN Algoritmer og datastrukturer

INF2220: Time 4 - Heap, Huffmann

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

KONTINUASJONSEKSAMEN

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

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

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

Et eksempel: Åtterspillet

Obligatorisk oppgave 1 INF1020 h2005

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

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

PG 4200 Algoritmer og datastrukturer Innlevering 2

UNIVERSITETET I OSLO

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

INF Algoritmer og datastrukturer

Pensum: fra boken (H-03)+ forelesninger

Liste som abstrakt konsept/datatype

INF Algoritmer og datastrukturer

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

INF Algoritmer og datastrukturer

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Trær. En datastruktur (og abstrakt datatype ADT)

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

Pensum: fra boken (H-03)+ forelesninger

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

Object [] element. array. int [] tall

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

Disjunkte mengder ADT

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

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

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

PG4200 Algoritmer og datastrukturer Forelesning 9

PQ: HEAP. Heap. Er disse heap er? Hvordan implementere heap:

INF1000 HashMap. Marit Nybakken 2. november 2003

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Algoritmer og Datastrukturer IAI 21899

Et eksempel: Åtterspillet

Innhold. Innledning 1

INF1010 siste begreper før oblig 2

UNIVERSITETET I OSLO

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

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

INF1010 Binære søketrær ++

Transkript:

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

REPETISJON: ALGORITMER OG STOR O 2

REPETISJON RØD-SVARTE TRÆR 7

Rød-svarte trær Et rød-svart tre er et binært søketre der hver node er farget enten rød eller svart slik at: 1. Roten er svart. 2. Hvis en node er rød, må barna være svarte. 3. Enhver vei fra en node til en null-peker må inneholde samme antall svarte noder. Disse reglene sikrer at høyden på et rød-svart tre er maksimalt 2*log 2 (N+1)!

Oppgave Farg nodene i følgende tre slik at det blir et rød-svart tre: 9 4 36 1 25 49 16 Sett inn tallet 64 på riktig plass og med riktig farge. Forsøk så å sette inn tallet 81. 9

Zig rotasjon P G S X A B C + symmetrisk tilfelle 10

Zig rotasjon G P S X P G X C A S A B B C + symmetrisk tilfelle 11

Zig-zag rotasjon P G S X C A B1 B2 + symmetrisk tilfelle 12

Zig-zag rotasjon P G S P X G A X C A B1 B2 S C B1 B2 + symmetrisk tilfelle 13

Case 1: The current node N is at the root of the tree 14

Case 2: The current node's parent P is black, so property 4 (both children of every red node are black) is not invalidated. In this case, the tree is still valid 15

Case 3: Both the parent P and the uncle U are red 16

Case 5: The parent P is red but the uncle U is black, the current node N is the left child of P, and P is the left child of its parent G. 17

Case 4: The parent P is red but the uncle U is black; also, the current node N is the right child of P, and P in turn is the left child of its parent G. 18

Antall operasjoner O( log n)

REPETISJON: B-TRÆR 20

B-trær En annen type søketrær. Brukes først og fremst når ikke hele treet får plass i internminnet. Har stor bredde (hver node har mange barn). Er balansert. De øverste nivåene lagres i internminnet, resten på disk. Brukes særlig i databasesystemer. Merk: Lærebokens (og våre) B-trær kalles vanligvis B + -trær. Tradisjonelle B-trær har data(pekere) i alle noder.

B-trær: eksempel 22 16 41 58 8,11,12 16,17 22,23,31 41,52 58,59,61 Dette treet har M=3 pekere fra hver indre node og L=3 dataelementer i hver løvnode. 22

B-trær: forenklet tegning Indre noder: oval Løvnoder: firkanter 22:- 16:- 41:58 8,11,12 16,17 22,23,31 41,52 58,59,61 23

Definisjon: B-trær av orden M 1. Alle data (eller pekere til data) er lagret i løvnodene. 2. Interne noder lagrer inntil M-1 nøkler for søking: nøkkel i angir den minste verdien i subtre i+1. 3. Roten er enten en løvnode eller har mellom 2 og M barn. 4. Alle andre indre noder har mellom M/2 og M barn. 5. Alle løvnoder har samme dybde. 6. Alle løvnoder har mellom L/2 og L dataelementer (eller datapekere). 24

Søking etter element x 1. Start i roten. 2. Så lenge vi ikke er i en løvnode: La nøkkel-verdiene bestemme hvilket barn vi skal gå til. 3. Let etter x i løvnoden. 25

Innsetting av element x 1. Let etter riktig løvnode for x (som for søking). 2. Dersom det er plass, sett inn x og oppdater nøkkelverdiene langs veien vi gikk. 26

Innsetting av element x 1. Let etter riktig løvnode for x (som for søking). 2. Dersom det er plass, sett inn x og oppdater nøkkelverdiene langs veien vi gikk. 3. Dersom løvnoden er full, deler vi den i to og fordeler de L+1 nøklene jevnt på de to nye løvnodene. 26

Innsetting av element x 1. Let etter riktig løvnode for x (som for søking). 2. Dersom det er plass, sett inn x og oppdater nøkkelverdiene langs veien vi gikk. 3. Dersom løvnoden er full, deler vi den i to og fordeler de L+1 nøklene jevnt på de to nye løvnodene. 4. Dersom splittingen medfører at foreldernoden får for mange, må den også splittes (osv oppover i treet). 26

Innsetting av element x 1. Let etter riktig løvnode for x (som for søking). 2. Dersom det er plass, sett inn x og oppdater nøkkelverdiene langs veien vi gikk. 3. Dersom løvnoden er full, deler vi den i to og fordeler de L+1 nøklene jevnt på de to nye løvnodene. 4. Dersom splittingen medfører at foreldernoden får for mange, må den også splittes (osv oppover i treet). 5. Dette kan medføre at vi til slutt må splitte roten i to (dersom roten får M+1 barn). Merk: Dette er det eneste som gjør at et B-tre vokser i høyden! 26

Insetting: eksempel M = L = 3 Sett inn 18, deretter 71 21:- 16:- 41:59 8,11,12 16,17 21,28, 31 41,52,58 59,61,70 27

Insetting: eksempel M = L = 3 Sett inn 18, deretter 71 21:59 16:- 70:- 41:- 8,11,12 16,17,18 21,28, 31 41,52,58 59,61 70,71 28

ABSTRAKTE DATATYPER 29

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. 31

MAP 32

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. 33

HASHING 34

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). hash(x) la verdien til elementet x (eller en del av x, da kalt x 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. 0: 1: 2:... 36

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? 37

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

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: 38

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: 38

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

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, ) 40

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

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. 42

Strenger som nøkler: funksjon 1 Vanlig strategi: ta utgangspunkt i ascii/unicode-verdiene 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. 43

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! 44

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. 45

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. 46

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. 47

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. 48

Åpen hashing (Separate chaining) 0 81 64 25 36 49 1 4 16 9 Forventer at hashfunksjonen er god, slik at alle listene blir korte. Load-faktoren λ er antall elementer i hash-tabellen i forhold til tabellstørrelsen. For åpen hashing ønsker vi λ 1.0 49

Å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 hash-tabellen i forhold til tabellstørrelsen. For åpen hashing ønsker vi λ 1.0 49

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 50

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 51

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: 51

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 52

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: 52

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) 53

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: 53

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). Amortised cost O(1) 54

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. 55

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). 56

Utvidbar hashing: eksempel D = 2 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). 57

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). 57

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. 58

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.) 59

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 60

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. 61

Data structure animation

Neste forelesning: 14. september PRIORITETSKØ OG HEAP 63