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

Like dokumenter
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

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

INF1020 Algoritmer og datastrukturer

Hashing. INF Algoritmer og datastrukturer HASHING. Hashtabeller

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

INF2220: Forelesning 3

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

Hashing: Håndtering av kollisjoner

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

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

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

INF Algoritmer og datastrukturer

Alle hele tall g > 1 kan være grunntall i et tallsystem.

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

Konvertering mellom tallsystemer

Alle hele tall g > 1 kan være grunntall i et tallsystem.

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

INF2220: Forelesning 3

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

Obligatorisk oppgave 1 INF1020 h2005

Norsk informatikkolympiade runde

UNIVERSITETET I OSLO

Modulo-regning. hvis a og b ikke er kongruente modulo m.

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

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017

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

Største felles divisor. (eng: greatest common divisors)

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Diskret matematikk tirsdag 13. oktober 2015

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

UNIVERSITETET I OSLO

Kapittel 2 TALL. Tall er kanskje mer enn du tror

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

Eksamensoppgave i IFUD1025 Programmering i Java

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

Rekker (eng: series, summations)

INF1010 Hashing. Marit Nybakken 8. mars 2004

7) Radix-sortering sekvensielt kode og effekten av cache

Ordliste. Obligatorisk oppgave 1 - Inf 1020

Rekker (eng: series, summations)

Relativt primiske tall

UNIVERSITETET I OSLO

TDT4110 IT Grunnkurs Høst 2015

Tall. Posisjons-tallsystemer. Representasjon av heltall. Tall positive, negative heltall, flytende tall. Tekst ASCII, UNICODE XML, CSS

Øvingshefte. Tall tallsystemet vårt

TDT4105/TDT4110 Informasjonsteknologi grunnkurs:

Notater til INF2220 Eksamen

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

Norsk informatikkolympiade runde

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

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

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2016

Del 2 Tabeller, arrays, strenger

INF1040 Oppgavesett 1: Tallsystemer og binærtall

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

Tema. Beskrivelse. Husk!

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2014

Teori og oppgaver om 2-komplement

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

Algoritmer og Datastrukturer IAI 21899

Turingmaskiner.

KONTROLLSTRUKTURER. MAT1030 Diskret matematikk. Kontrollstrukturer. Kontrollstrukturer. Eksempel (Ubegrenset while-løkke)

Forelesning 2. Flere pseudokoder. Representasjoner av tall. Dag Normann januar 2008 KONTROLLSTRUKTURER. Kontrollstrukturer. Kontrollstrukturer

Øvingsforelesning 5. Binær-, oktal-, desimal- og heksidesimaletall, litt mer tallteori og kombinatorikk. TMA4140 Diskret Matematikk

Eksamensoppgave i IFUD1025 Programmering i Java og IINI4013 Programmering i Java

TDT4105 Informasjonsteknologi grunnkurs: Uke 42 Strenger og strenghåndtering

Oblig3Pi- en matematisk rettet obligatorisk oppgave nr. 3 (av 4) i INF1000 ett av to alternativer for oblig 3.

Mer om representasjon av tall

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

Kva er klokka? Kva er klokka? Kva er klokka?

TDT4105/TDT4110 Informasjonsteknologi grunnkurs:

Norsk informatikkolympiade runde

INF2220: Forelesning 2

TALL. 1 De naturlige tallene. H. Fausk

Backtracking som løsningsmetode

Husk å registrer deg på emnets hjemmeside!

INF1010 Sortering. Marit Nybakken 1. mars 2004

Oppsummering av Uke 3. MAT1030 Diskret matematikk. Binære tall. Oppsummering av Uke 3

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

TDT4102 Prosedyreog objektorientert programmering Vår 2016

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Tall. Ulike klasser tall. Læringsmål tall. To måter å representere tall. De naturlige tallene: N = { 1, 2, 3, }

Tall. Binære regnestykker. Binære tall positive, negative heltall, flytende tall

UNIVERSITETET I OSLO

Datastrukturer for rask søking

Leksjon 2. Setninger og uttrykk

Matematikk for IT, høsten 2016

Leksjon 2. Setninger og uttrykk

LO118D Forelesning 4 (DM)

1.8 Binære tall EKSEMPEL

EKSAMEN. Emne: Algoritmer og datastrukturer

Rasjonale potenser. For å finne side av kvadrat med gitt areal A løser vi likning x 2 = A.

Forside. MAT INF 1100 Modellering og beregninger. Mandag 9. oktober 2017 kl Vedlegg (deles ut): formelark. Tillatte hjelpemidler: ingen

Hva er det største tallet du kan lage med disse sifrene?

Python: Variable og beregninger, input og utskrift. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Løsningsforslag for utvalgte oppgaver fra kapittel 3

Algoritmer og datastrukturer A.1 BitInputStream

Transkript:

Hashfunksjoner

Hashfunksjoner Hashfunksjonen beregner en indeks i hashtabellen basert på nøkkelverdien som vi søker etter Hash: «Kutte opp i biter og blande sammen» Perfekt hashfunksjon: Lager aldri kollisjoner Alle elementer får en unik indeks Kan bare lages i tilfeller der alle data er kjent

Effektive hashfunksjoner Krav til en effektiv hashfunksjon: Beregning av hashverdien må være rask og O(1) Sprer hashverdiene jevnt i hashtabellen Gir et lite antall kollisjoner Utvikling av effektive hashfunksjoner er ikke en «eksakt vitenskap»: Antall kollisjoner avhenger både av datasettet og av lengden på hashtabellen Baserer seg i stor grad på heuristikk og empiri

Hashfunksjoner og hashlengde Hashlengde: Antall elementer i hashtabellen Hashfunksjonen beregner en indeks i hashtabellen: Verdien som returneres må være større eller lik 0 (null) og mindre enn hashlengden Beregner en verdi h basert på nøkkelverdien Returnerer resten ved heltallsdivisjon av h med hashlengden: h % hashlengde Vi vil alltid få bedre spredning og færre kollisjoner hvis hashlengden er et primtall: F.eks. er 997 og 1009 bedre hashlengder enn 1000

Noen typer hashfunksjoner Avkorting Sammenslåing / Folding Midten-av-kvadratet Bytte av tallsystem Utplukk og ombytting Basert på lengde av nøkkelverdi

Hashfunksjon: Avkorting (truncation) «Klipper» bare ut en del av nøkkelverdien Eksempel, nøkkelverdi er en streng: Bruk de k første bokstavene, tolket som siffer Eksempel, nøkkelverdi er et heltall: Bruk de k siste sifferne Finnes med heltallsdivisjon: nøkkelverdi % 10 k Fordel: Rask beregning av hashverdi Ulempe: Fordeler ujevnt, gir mye kollisjoner i tabellen

Eksempel: Hashing med enkel avkorting hashlengde = 8 hash(key) = key % hashlengde hash(36) = 36 % 8 = 4 hash(18) = 18 % 8 = 2 hash(72) = 72 % 8 = 0 hash(43) = 43 % 8 = 3 hash(6) = 6 % 8 = 6 0 72 1 2 18 3 43 4 36 5 6 6 7

Hashfunksjon: Sammenslåing / Folding Del opp nøkkelverdien i flere «småbiter» Slå sammen «småbitene», med f.eks. aritmetiske operasjoner, til en hashverdi Eksempel: Nøkkelverdi: 625381194 Lengde av hashtabell (hashlengde) 1000 Hashverdi: (625 + 381 + 194) % 1000 = 100 Folding sprer bedre enn avkorting

Enkel folding av tekststrenger int hash(string S) { int h = 0; for (int i = 0; i < S.length(); i++) h += (int)(s.charat(i)); return h % hashlengde; } Noen verdier med hashlengde = 1009 : hash("vw Karmann Ghia") = 317 hash("porsche 356A") = 979 hash("alfa Romeo Spider") = 556 hash("renault Floride") = 463

Problem: Enkel folding sprer dårlig I eksemplet på forrige side vil de fleste hashverdiene havne i et relativt lite intervall noen hundre opp til et par tusen for tekst-strenger av begrenset lengde Ubrukelig for store datasett med millioner av data For å spre bedre kan vektet folding brukes: Gi tegnene en vekt basert på posisjon Tolker strengen noe tilsvarende som et desimalt tall, der hvert tegn er et siffer som angir antallet av en potens av 10

Eksempel: Vektet folding av tekststrenger Tolk f.eks. 4 og 4 tegn i strengen som «desimale tall»: VW_Karmann_Ghia Beregn: ((V + W*10 + _*100 + K*1000) + (a + r*10 + m*100 + a*1000) + (n + n*10 + _*100 + G*1000) + (h + i*10 + a*100)) % hashlengde Gir mye større spenn i verdiene som beregnes

Kode: Vektet folding av tekststrenger int hash(string S) { int h = 0, i = 0; while (i < S.length()) { int potens = 1; for (int j = 0; (j < 4 && i < S.length()); j++) { h += (int)(s.charat(i)) * potens; potens *= 10; i++; } } return h % hashlengde; }

Javas egen hashfunksjon for strenger Merk: String.hashCode() ignorerer overflow og kan returnere negative verdier(!)

Hashfunksjon: Midten-av-kvadratet Anta nøkkelverdien er et heltall* Beregn kvadratet av nøkkelverdien Hashverdi: Siffere i midten av kvadratet Eksempel: Bruker hashverdier med tre sifre (000-999) Nøkkelverdi: 18562 18562 18562 = 344547844 hash(18562) = 547 *: For ikke-numeriske nøkkelverdier kan vi bare tolke bitsekvensene som tall

Hashfunksjon: Bytte av tallsystem* Antar nøkkelverdi er et desimalt heltall: Grunntallet er 10, sifferne er 0, 1, 2, 3,..., 8, 9 1369 = 1369 10 = 9 + 6 10 1 + 3 10 2 + 1 10 3 Skriver om nøkkelverdien til f.eks. 8-tallsystemet: Grunntallet er 8, sifferne er 0, 1, 2, 3, 4, 5, 6, 7 2531 8 = 1 + 3 8 1 + 5 8 2 + 2 8 3 = 1369 10 Hvis hashlengden er 1009: hash(1369) = 2531 % 1009 = 513 *: Det finnes flere metoder for bytte av tallsystemer i Java, se f.eks. Integer.toOctalString

Hashfunksjon: Utplukk og ombytting Plukker ut noen siffer eller tegn fra nøkkelverdien Bytter deretter om på disse sifferne/tegnene Eksempel: Vil ha fire-sifrede hashverdier Nøkkelverdier med tolv siffer: 783248695301 Tar ut siffer nummer tre, seks, ni og tolv: 3851 Hashverdi: En eller annen omstokking av sifferne: Reversering: 1583 Høyreskift: 1385 Venstreskift: 8513 Parvis bytting: 8315

Hashfunksjon: Basert på lengde av nøkkelverdi Beregner en hashverdi basert på en nøkkelverdi og nøkkelverdiens lengde Eksempel: Nøkkelverdier med åtte siffer: 46286947 Ganger de tre første sifrene med lengden av nøkkelverdiene: 462 8 = 3696 Deler på det siste sifferet: 3696 / 7 = 528 hashverdi = 528 % hashlengde

Test av ulike hashfunksjoner Enkelt testprogram: hashfunctions.java Tester følgende metoder ved å telle antall kollisjoner: 1. Enkel folding 2. Vektet folding 3. Javas innebygde hashfunksjon (vektet folding) 4. Midten-av-kvadrat 5. Bytte av tallsystem 6. Utplukk og bytting 7. Lengde av dataverdi Hasher hele linjer med tekst fra standard input Testdatasett: cars.txt