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

Föreläsning 10 Innehåll

Interfacen Set och Map, hashtabeller

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

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

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

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning 14 Innehåll

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

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

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

Programkonstruktion och. Datastrukturer

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

Föreläsning Datastrukturer (DAT037)

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

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

Hashtabeller. TDA416, lp3 2016

Föreläsning 6 Datastrukturer (DAT037)

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

Tentamen i Algoritmer & Datastrukturer i Java

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

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

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

Algoritmer och datastrukturer

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

Föreläsning 4 Innehåll

Tentamen TEN1 HI

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

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

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

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.

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

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

Föreläsning 10 Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 035/INN960

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

Algoritmer och datastrukturer 2012, fo rela sning 8

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

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

Föreläsning 9 Innehåll

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

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

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

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

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

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

Länkade strukturer, parametriserade typer och undantag

Samlingar Collection classes

Föreläsning 3. Stack

Lösningsförslag till exempeltenta 1

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

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

Samlingar Collection classes

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

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

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

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

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

Dugga Datastrukturer (DAT036)

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

Föreläsning 4 Datastrukturer (DAT037)

Grundläggande datalogi - Övning 4

Objektorienterad Programkonstruktion

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen Datastrukturer D DAT 035/INN960

Lösningsförslag till tentamen Datastrukturer, DAT037,

Hashtabeller! (& kanske lite sortering)

Sökning och sortering

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

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

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

Föreläsning 9 Innehåll

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

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

Tentamen Datastrukturer för D2 DAT 035

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Tentamen kl Uppgift 4. Uppgift 5

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

DAT043 - föreläsning 8

Lösningar Datastrukturer TDA

Symboliska konstanter const

Tentamen TEN1 HI

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

13 Prioritetsköer, heapar

Datastrukturer. föreläsning 3. Stacks 1

Tentamen Datastrukturer D DAT 036/DIT960

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Transkript:

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

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

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 insättning: Om index beräknat med ett elements nyckel ger null har vi hittat positionen Om index ger element med annan nyckel så ökar vi index med 1 Fortsätt öka index med ett tills vi får null (förutsätter att tabellen ej är full) Vid sökning: Om index beräknat med ett elements nyckel ger element med nyckeln har vi hittat elementet Om index ger element med annan nyckel så ökar vi index med 1 Fortsätt öka index med ett tills vi hittar elementet med rätt nyckel (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 mindre än 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 utan size-variabel).

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ösar 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 lagringsutrymme 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 och helst inte variabel size. En arraylist kräver i snitt mindre lagringsutrymme men har O(m) på att ta bort ett element (länkade listan har O(1)). Observera också att eftersom de flesta listor endast innehåller ett element kommer vi oftast slösa lika mycket lagringsutrymme med en arraylist (förutsatt att vi sätter startstorleken till 2 (10 vore inte en bra ide).

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]; }

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; } } Glöm inte att SingleLinkedList ska implements Iterable<E> för att for-loopen ska fungera

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.