Föreläsning 8. Mängd, Avbildning, Hashtabell

Relevanta dokument
Föreläsning 8. Mängd, Avbildning, Hashtabell

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

Föreläsning 10 Innehåll

Interfacen Set och Map, hashtabeller

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal)

Diskutera. Hashfunktion

Föreläsning 11 Innehåll

Inlämningsuppgift och handledning

Inlämningsuppgift och handledning. Föreläsning 11 Innehåll. Diskutera. Hashtabeller

Datastrukturer. föreläsning 6. Maps 1

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Magnus Nielsen, IDA, Linköpings universitet

Tommy Färnqvist, IDA, Linköpings universitet. 1 ADT Map/Dictionary Definitioner Implementation... 2

Programmering för språkteknologer II, HT2011. Rum

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning 14 Innehåll

Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon.

Innehåll. F7: Tabell, hashtabell, relation & lexikon. Gränsyta till Tabell. Tabell. Tabell Hashtabell Relation Lexikon.

Programkonstruktion och. Datastrukturer

Algoritmer och datastrukturer

Föreläsning 2. Länkad lista och iterator

Hashtabeller. TDA416, lp3 2016

Föreläsning Datastrukturer (DAT037)

Innehåll. Sökning och hashtabeller. En bilsamling att söka i. En bil-klass att söka efter. Hur hittar vi alla bilar som uppfyller ett annat villkor

Tentamen i Algoritmer & Datastrukturer i Java

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Innehåll. Föreläsning 10. Specifikation. Mängd. Specifikation. Konstruktion av mängd. Mängd Lexikon Hashtabell

Föreläsning 6 Datastrukturer (DAT037)

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Programmering för språkteknologer II, HT2014. Rum

Tentamen TEN1 HI

Föreläsning 2. Länkad lista och iterator

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Algoritmer och datastrukturer 2012, fo rela sning 8

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Föreläsning 7. Träd och binära sökträd

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Tommy Färnqvist, IDA, Linköpings universitet. 1 Administrativ information Upplägg... 1

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning 7. Träd och binära sökträd

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Föreläsning 10 Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 4 Innehåll

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Samlingar Collection classes

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Dugga Datastrukturer (DAT036)

Länkade strukturer, parametriserade typer och undantag

Symboliska konstanter const

Föreläsning 9. Sortering

Föreläsning 3. Stack

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Samlingar Collection classes

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Föreläsning 3. Stack

Hashtabeller! (& kanske lite sortering)

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 9 Innehåll

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Grundläggande datalogi - Övning 4

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Lösningsförslag till exempeltenta 1

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Tentamen Datastrukturer D DAT 035/INN960

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 1 Datastrukturer (DAT037)

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Sökning och sortering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Objektorienterad Programkonstruktion

Tentamen Datastrukturer D DAT 036/DIT960

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen Datastrukturer för D2 DAT 035

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Föreläsning 9 Innehåll

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen kl Uppgift 4. Uppgift 5

Datastrukturer och algoritmer

DAT043 - föreläsning 8

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Föreläsning 9 Datastrukturer (DAT037)

Tentamen Programmeringsteknik 2 och MN Skrivtid: Inga hjälpmedel.

Hashing Bakom kulisserna på Pythons dictionary

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Datastrukturer. föreläsning 10. Maps 1

Transkript:

Föreläsning 8 Mängd, Avbildning, Hashtabell

Föreläsning 8 Mängd (Set) Avbildning (Map) Hashtabeller Hashkoder Öppen adressering Länkning Effektivitet och minneskrav Implementering Läsanvisning och uppgifter

Mängd En mängd är en samling som inte innehåller några kopior lägger man till A till {A,B,C} får man {A,B,C} Operationer: test för medlemskap lägga till element ta bort element union snitt differens delmängd

Mängd i Java API (Set) Set är ett interface Implementeras av tex TreeSet Elementen är inte indexerade avslöjar inte insättningsordningen möjliggör effektiv sökning kräver ingen omflyttning vid borttagning Elementen i ett sökträd är ordnade men går ändå att använda för att implementera en mängd om man döljer ordningen

Metoder i Set Interface

Iterera Set har en iterator Ordningen för iterationen är godtycklig for (String nextitem : seta) { } //Do something with nextitem

Avbildning (Map) En avbildning är ett set av ordnade par (nyckel, värde) Nycklarna är unika men värdena behöver inte vara det Har metoder såsom get(key) och put(key,value) {(J, Jane), (B, Bill), (S, Sam), (B1, Bob), (B2, Bill)}

Hashtabeller Kan användas för att implementera en mängd eller avbildning Erbjuder access via nyckel (ej position) i genomsnitt med effektiviteten: O(1) Principen: Nyckeln transformeras till ett heltal (hashkoden) som transformeras till ett tabellindex: Nyckeln direkt skulle normalt ge för stor tabell men är effektivt. Nyckel%Tabellstorlek ger normalt ej jämn distribution så vi får onödigt många kollisioner (olika nyckel samma index)

Generera hashkoder Nyckeln består normalt av en textsträng eller ett antal siffror (personnummer, emailaddress, osv) Antalet möjliga nycklar är mycket större än tabellstorleken Typiskt experimenterar man för att få fram bra hashkoder Målet är en jämt fördelad slumpmässigt distribution över tabellen Enkla algoritmer genererar onödigt ofta kollisioner Algoritmen måste vara effektiv. Målet är ju att undvika O(n) sökning.

Java string-hashkoder public int hashcode() Returns a hash code for this string. The hash code for a String object is computed as s[0]*31^(n-1) + s[1]*31^(n-2) +... + s[n-1] s[i] är då heltalsvärdet för i:te tecknet Cat blir då: C x 31 2 + a x 31 + t = 67,510 31 är valt för att det är ett lagom stort primtal för att generera få kollisioner För att beräkna s index I en tabell: s.hashcode() % table.length Metoden lyckas generera koder ganska jämnt distribuerade över intervallet så sannolikheten för kollisioner blir proportionell mot hur full tabellen är.

Hantering av krockar i hashtabeller Öppen adressering Länkning (Chaining)

Öppen adressering Vid sökning/insättning: Om index beräknat med ett elements nyckel ger null eller element med denna nyckel har vi hittat positionen/elementet Om index ger element med annan nyckel så ökar vi index med 1 Fortsätt öka index med ett tills vi får null eller element med rätt nyckel (förutsatt att tabellen ej är full) (kommer vi till slutet börjar vi från början %tabellängd) Vid kollision påbörjas en linjär sökning. Den ska helst inte bli för lång för då får vi O(n). Viktigt att ha väl tilltagen tabellstorlek.

Sökning Hur vet vi när vi ska sluta leta om tabellen är full sluta när ökningen av index är tillbaka vid startvärdet tillåt aldrig en tabell bli full utan öka storleken när en viss del är full

Ta bort element Vi kan inte bara sätta indexplatsen till null för andra element som kolliderat kommer då inte att hittas Istället lagrar vi en dummy eller markerar platsen som ledig men tidigare upptagen Dock går den lediga platsen inte att fylla utan att kontrollera att elementet inte finns längre ned pga en tidigare kollision

Undvik kollisioner genom att Använd ett primtal för tabellens storlek -Om en hashkodalgoritm ger att data med tex samma första bokstäver ger samma slutsiffror i hashkoden kommer modulo 1000 ge en krock. Använder vi ett primtal minskar risken. 31 är dock ett dåligt val för javas hashkod för strängar. Öka storleken när den är för full. OBS alla element behöver sättas in igen (rehash). Sätt inte in borttagna element igen. Använd kvadratisk sondering vid krock

Kvadratisk sondering vid krock När vi använder öppen adressering bildas kluster av poster. Om vi får en krock har vi två poster i rad. Sannolikheten att posten efter dessa ska besättas är nu 3 gånger så stor som att en ensam post ska besättas (tre index resulterar i att den besätts). Vid kvadratisk sondering gör vi istället följande. Vid krock titta på nästa index om detta är upptaget titta 4 index bort om det också är upptaget titta 9 index bort osv: 1, 2 2, 3 2, 3 och 4 är upptagna: 3 ger 3+4=7, 4 ger 4+1=5 ingen klustring! Indexberäkningen kan göras effektiv (k=-1): k+=2;index=(index+k)%table.length Kan dock missa tomma platser och hamna I oändlig loop. Händer dock aldrig om tabellen är maximalt halvfull och storleken är ett primtal.

Länkning Varje plats i tabellen refererar till en länkad lista med de element som har hashkod för detta index. Listan kallas bucket (hink) och metoden bucket hashing

Länkning öppen adressering Endast värden med samma hash->index genomsöks Ökar storleken dynamiskt utan rehash. Dock brukar man försöka hålla den 75% full och om den blir för full expanderar man och gör rehash. När du tar bort ett element behövs ingen dummy Tar mer plats pga länkarna. Tomma platser tar inte mer plats men varje full plats har en referens extra (förutsätter enkellänkad lista).

Jämförelse L - Load factor är antalet fyllda platser / tabellstorlek

Hashtabell sorterad arraylist- binärt sökträd En sorterad array-lista har O(log(n)) för sökning och O(n) för insättning. Den slösa maximalt halva arrayen (genomsitt en fjärdedel) eftersom den dubblar storleken när den är full Ett binärt sökträd har O(log(n)) för insättning och sökning men behöver lagringsutrymme för två länkar per element. En hash-tabell 75% full har extremt mycket bättre prestanda (i princip O(1)) och slösar mindre plats om vi använder öppen adressering. Använder vi länkning får vi bra prestanda och mindre lagringsutrymme än ett binärt sökträd men mer lagringsutrymmet jämfört med array-listan.

Implementera en hashtabell med länkning Konstruktorn ska ge oss möjlighet att sätta storleken. Helst ska den sedan välja ett närliggande primtal men det kan vi hoppa. put(key,value) sätter in key, value på rätt index enligt key s hashkod och returnerar det gamla value om key hittas och null om det inte hittas get(key) returnerar motsvarande value om key finns annars null remove(key) tar bort key, value elementet om det finns och returnerar value annars returneras null Vi använder vår enkellänkade lista för denna implementering. Denna användning av en lista är ett exempel då det är mycket viktigt att inte slösa utrymme i listan då vi har n listor! Så ingen länk tail. En arraylist kräver i snitt mindre lagringsutrymme men har O(n) på att ta bort ett element (länkade listan har O(1)).

hashcode equal Object implementerar hashcode och equals Object.equals jämför adresser så de flesta klasser implementerar (override) en egen som jämför innehåll Object.hashCode beräknar hashkod utifrån adress Om ett object implementerar en egen equal bör det alltid implementera en egen hashcode som utgår från samma innehåll så att två object som är lika också har samma hashkod.

Implementering public class HashTableBucket<K,V> { private static class Entry<K,V>{ public K key; public V value; public Entry(K k, V v){ key=k; value=v; } } private SingleLinkedList<Entry<K,V>>[] table; @SuppressWarnings("unchecked") public HashTableBucket(int size){ table = new SingleLinkedList[size]; }

put public V put(k key, V value){

public V put(k key, V value){ int index = key.hashcode()%table.length; if(index<0) index+= table.length; if(table[index]==null){ table[index] = new SingleLinkedList<Entry<K,V>>(); table[index].add(new Entry<K,V>(key,value)); return null; }else{ V oldvalue; for(entry<k,v> e: table[index]){ if(e.key.equals(key)){ oldvalue=e.value; e.value = value; return oldvalue; } } table[index].add(0, new Entry<K,V>(key,value)); return null; } }

get public V get(k key){

public V get(k key){ int index = key.hashcode()%table.length; if(index<0) index+=table.length; if(table[index]==null) return null; for(entry<k,v> e: table[index]){ if(e.key.equals(key)) return e.value; } return null; }

Hash i JCF Interface Map<K,V> implementeras av Class HashMap<K,V> - är ej trådsäker Class Hashtable<K,V> - trådsäker. Båda använder länkning och rehashar då de är 75% fulla. Läs mer i Java API.

Läsanvisning och uppgifter KW 7.1, 7.2, 7.3, 7.4 Uppgifter NB 31 (1p), 32 (2p), 33 (2p)

Uppgifter NB 31 (1p) Skriv testkod för vår hashtabell från föreläsningen. Fundera på vad den behöver testa. Inspiration kan du hämta på sid 394. Hittar du några fel så rätta till dessa.

NB 32 (2p) Skriv en remove-metod till vår hashtabell från föreläsningen.

NB 33 (2p) Skriv en tostring-metod till vår hashtabell.