Föreläsning Datastrukturer (DAT037)

Relevanta dokument
Föreläsning 5 Datastrukturer (DAT037)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 11 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT037)

Dugga Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Föreläsning 10 Datastrukturer (DAT037)

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

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 1 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Datastrukturer. föreläsning 6. Maps 1

Föreläsning Datastrukturer (DAT036)

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Sökning och sortering

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

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

Tommy Färnqvist, IDA, Linköpings universitet

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

Tentamen Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer D DAT 036/DIT960

Magnus Nielsen, IDA, Linköpings universitet

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer D DAT 036/INN960

Tentamen Datastrukturer, DAT037 (DAT036)

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

Grundläggande datalogi - Övning 4

Föreläsning 8 Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 035/INN960

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

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer D DAT 036/INN960

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

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning Datastrukturer (DAT036)

Föreläsning 14 Innehåll

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

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

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Algoritmer, datastrukturer och komplexitet

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

Algoritmer, datastrukturer och komplexitet

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

Vad har vi pratat om i kursen?

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Datastrukturer och algoritmer

Föreläsning 11 Innehåll

Programkonstruktion och. Datastrukturer

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Föreläsning 9. Sortering

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

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Interfacen Set och Map, hashtabeller

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

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

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

Föreläsning 12 Innehåll

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

Algoritmer. Två gränssnitt

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

Föreläsning 6 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Magnus Nielsen, IDA, Linköpings universitet

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

Exempeltenta GruDat 2002/2003

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

Tentamen i Algoritmer & Datastrukturer i Java

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

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

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning 5 Innehåll

Föreläsning 2 Datastrukturer (DAT037)

Hashtabeller. TDA416, lp3 2016

Programkonstruktion och Datastrukturer

Datastrukturer. Sammanfattning och Referenshäfte. Guldbrand, Eric Johansson, Algot

Föreläsning 1: Dekomposition, giriga algoritmer och dynamisk programmering

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Länkade strukturer, parametriserade typer och undantag

Tentamen Datastrukturer för D2 DAT 035

Transkript:

Föreläsning Datastrukturer (DAT037) Nils Anders Danielsson 2015-11-16

Idag Mängder, avbildningar. Hashtabeller. Sortering.

Pseudokod Blandning av programmeringsspråk, matematisk notation och naturligt språk. Mål: fokusera på det viktiga, undvik onödiga detaljer. Ibland kan det vara bra med fler detaljer, ibland färre.

Mängder, avbildningar

Mängder ADT: Konstruerare för tom mängd. insert(x): Lägger till x till mängden. Mängder innehåller ej dubbletter. member(x): Avgör om x finns i mängden. delete(x): Tar bort x från mängden.

Avbildningar/maps ADT: Konstruerare för tom avbildning. insert(k, v): Lägger till bindningen k v. Om det finns en gammal bindning k v skrivs den (t ex) över. lookup(k): Om det finns en bindning k v så ges v som svar. delete(k): Tar bort bindningen k v (om det finns en sådan bindning).

Krav på nyckeltypen Olika mängd-/avbildningsdatastrukturer har olika krav på nyckeltypen: Likhetstest. Olikhetstest/komparator. Hashfunktion.

Hashtabeller

Hashtabeller Implementerar mängd- eller avbildnings-adtn. Idé: Array plus funktion som säger i vilken hink man ska lägga elementen/bindningarna.

Hashfunktioner Tar värden till heltal (t ex). Krav: Om x = y ska h(x) = h(y). Dock kan h(x) = h(y) för x y: kollision. Finns olika metoder för att hantera kollisioner.

Hashtabeller, separat kedjning class HashTable<A>: private int size private List<A> [] table HashTable(int capacity): initialise(capacity) private initialise(int capacity): if capacity <= 0 then raise error size = 0 table = new array of size capacity for each position i in table do table[i] = new LinkedList<A>()

Hashtabeller, separat kedjning member(a x): List<A> bucket = table[x.hash() mod table.length()] return bucket.contains(x) Obs: Jag antar att n mod s { 0, 1,, s 1 } (för s > 0). Javas % uppfyller inte det kravet, t ex för n = 5 och s = 107.

Hashtabeller, separat kedjning delete(a x): List<A> bucket = table[x.hash() mod table.length()] if bucket.contains(x) then bucket.remove(x) size--

Hashtabeller, separat kedjning insert(a x): List<A> bucket = table[x.hash() mod table.length()] if bucket.contains(x) then bucket.remove(x) bucket.add(x) else bucket.add(x) size++ if size is "too large" then rehash

Hashtabeller, separat kedjning private rehash: oldtable = table initialise("suitable" capacity) for each position i in oldtable do for each element x in oldtable[i] do insert(x) Kan undvika att beräkna hashkoder igen genom att spara dem tillsammans med elementen.

Skapa en hashtabell med kapacitet 5, och stoppa in följande värden: 3, 7, 8, 2, 9, 11. Använd hashfunktionen h(x) = x. Hur många kollisioner inträffar? (Tabellens kapacitet ändras inte.) 0. 1. 2. 3. 4. 5.

Hashtabeller För stor, lämplig kapacitet: Lastfaktor: storlek/kapacitet. Hög lastfaktor ger ev fler kollisioner. Låg lastfaktor många tomma hinkar. JDK 7 HashMap (använder separat kedjning): lastfaktor max 0.75 (kan ändras).

Hashtabeller Kursbokens rekommendation: kapacitet primtal. Skydd mot vissa dåligt designade hashfunktioner. Säg att alla hashkoder har formen im + n (för i = 0, 1, 2, ): Om kapaciteten är km så används som mest k hinkar. Om kapaciteten och m är relativt prima så kan alla hinkar användas. Kapacitet 2 k leder till kollision om sista k bitarna i h(x) och h(y) är lika: övriga bitar ignoreras.

Hashtabeller JDK 6 8 HashMap: kapacitet 2 k. För att undvika problem transformeras hashkoderna med en andra hashfunktion. I JDK 6: h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); (^ är xor, n >>> k är n/2 k.) I JDK 8: h = h ^ (h >>> 16) Dessutom: Hinkar med många element använder (kanske) balanserade sökträd.

0 255 300 transform(h) mod 256 200 100 0 0 100 200 300 h mod 256 0 255

0 511 300 transform(h) mod 256 200 100 0 0 100 200 300 h mod 256 0 255 256 511

0 1023 300 transform(h) mod 256 200 100 0 0 100 200 300 h mod 256 0 255 256 511 512 767 768 1023

0 2047 300 transform(h) mod 256 200 100 0 0 100 200 300 h mod 256 0 255 256 511 512 767 768 1023

0 4095 300 transform(h) mod 256 200 100 0 0 100 200 300 h mod 256 0 255 256 511 512 767 768 1023

0 8191 300 transform(h) mod 256 200 100 0 0 100 200 300 h mod 256 0 255 256 511 512 767 768 1023

0 16383 300 transform(h) mod 256 200 100 0 0 100 200 300 h mod 256 0 255 256 511 512 767 768 1023

Hashfunktioner Bra hashfunktion: snabb, liten risk för kollisioner. Lätt att skriva dålig hashfunktion. Svårt att designa bra hashfunktion. Kursbokens bra hashfunktion för strängar är kanske inte jättebra (men fungerar nog OK för hashtabeller; Java använder en liknande definition). Hur skriver man en bra hashfunktion?

Hashfunktioner Finns ett antal hashfunktioner som påstås fungera bra: MurmurHash. CityHash. SpookyHash. Kanske är bra att använda någon av dem. Kan vara lämpligt att testa hashfunktionen.

Hashfunktioner Finns bibliotek som kan vara till hjälp vid definition av hashfunktion för egendefinierad klass. Exempel: JDK 8: java.util.objects.hash. Enkel hashfunktion, liknar den för strängar. public int hashcode() { return Objects.hash(field1, field2, field3); } (Glöm inte x = y h(x) = h(y)!) com.google.common.hash. Flera olika hashfunktioner.

Hashtabeller, separat kedjning Tidskomplexitet med O(1) perfekt hashfunktion (inga kollisioner), lastfaktor 1, O(1) likhetstest, och kapacitet 2 k : Tom hashtabell: O(kapacitet). insert: O(1) (amorterat). member: O(1). delete: O(1).

Hashtabeller, separat kedjning Tidskomplexitet med O(1) mycket dålig hashfunktion (bara kollisioner), lastfaktor 1, O(1) likhetstest, och kapacitet 2 k : Tom hashtabell: O(kapacitet). insert: O(n). member: O(n). delete: O(n).

Hashtabeller, separat kedjning Tidskomplexitet med O(1) mycket dålig hashfunktion (bara kollisioner), lastfaktor 1, O(1) likhetstest, och kapacitet 2 k : Tom hashtabell: O(kapacitet). insert: O(n). member: O(n). delete: O(n). Notera: En angripare kanske kan välja indata på ett sådant sätt att man får många kollisioner.

Vad är tidskomplexiteten för borttagande av n strängar, var och en med n tecken, från en hashtabell som innehåller alla strängarna? Anta att hashfunktionen är perfekt, och linjär i strängarnas storlek. Θ(1). Θ(n). Θ(n 2 ). Θ(n 3 ).

Hashtabeller, öppen adressering Inga länkade listor. Vid kollision: element sparas på annan position i arrayen. delete lite krånglig (gravstenar). Kan i vissa fall ge bättre cacheutnyttjande.

Sortering

Insättningssortering // Precondition för insert x xs: xs är sorterad. insert :: Ord a => a -> [a] -> [a] insert x [] = [x] insert x (y : ys) x <= y = x : y : ys otherwise = y : insert x ys insertionsort :: Ord a => [a] -> [a] insertionsort [] = [] insertionsort (x : xs) = insert x (insertionsort xs)

Insättningssortering Stabil sorteringsalgoritm: bevarar inbördes ordning mellan lika element. Anta att (x, _) <= (y, _) = x <= y: insertionsort [(1, 3), (1, 2), (2, 0), (1, 4)] = [(1, 3), (1, 2), (1, 4), (2, 0)]

Vad är bästa- och värstafallstidskomplexiteten för insertionsort, givet att jämförelser tar konstant tid? Θ(n), Θ(n). Θ(n), Θ(n 2 ). Θ(n 2 ), Θ(n 2 ).

Mergesort // Precondition: Listorna är sorterade. merge :: Ord a => [a] -> [a] -> [a] merge [] ys = ys merge xs [] = xs merge (x : xs) (y : ys) x <= y = x : merge xs (y : ys) otherwise = y : merge (x : xs) ys

Mergesort mergesort :: Ord a => [a] -> [a] mergesort xs xs <= 1 = xs otherwise = merge (mergesort ys) (mergesort zs) where ys = first xs /2 elements from xs zs = last xs /2 elements from xs

Mergesort mergesort :: Ord a => [a] -> [a] mergesort xs xs <= 1 = xs otherwise = merge (mergesort ys) (mergesort zs) where ys = first xs /2 elements from xs zs = last xs /2 elements from xs I kursboken: mergesort för arrayer.

Är mergesort stabil? Ja. Nej.

Mergesort Värstafallstidskomplexitet (om <= tar konstant tid): merge: Linjär i listornas längd: O( xs + ys ). mergesort: T (0) = 1 T (1) = 1 T (n) = n + T ( n 2 ) + T ( n ), om n 2 2

Mergesort Anta att n = 2 k, k N. T (n) = n + 2T (n/2) = n + 2(n/2 + 2T (n/4)) = 2n + 4T (n/4) = 2n + 4(n/4 + 2T (n/8)) = 3n + 8T (n/8) = = log 2 n n + nt (n/n) = n log 2 n + n = Θ(n log n)

Divide and conquer Algoritmteknik: söndra och härska (divide and conquer). Om man skapar två delproblem av halv storlek på linjär tid, och dessutom slår ihop delresultaten på linjär tid, så får man en O(n log n)-algoritm.

Sammanfattning Idag: Mängder, avbildningar. Hashtabeller. Sortering. Nästa gång: Grafer.