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



Relevanta dokument
Magnus Nielsen, IDA, Linköpings universitet

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

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

ADT Set, Map, Dictionary. Iteratorer TDDD86: DALGP. Tommy Färnqvist, IDA, Linköpings universitet

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

Datastrukturer. föreläsning 6. Maps 1

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

Rebecka Geijer Michaeli, IDA, Linköpings universitet. 1 Administrativ information Upplägg... 2

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

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

Programkonstruktion och. Datastrukturer

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

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

Hashtabeller. TDA416, lp3 2016

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 8. Mängd, Avbildning, Hashtabell

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

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

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 6 Datastrukturer (DAT037)

Interfacen Set och Map, hashtabeller

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

Föreläsning 5 Datastrukturer (DAT037)

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

Föreläsning 10 Innehåll

Föreläsning 4 Datastrukturer (DAT037)

Diskutera. Hashfunktion

TDDI16 Datastrukturer och algoritmer. Prioritetsköer, heapar, Union/Find

Inlämningsuppgift och handledning

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

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

Tentamen TEN1 HI

Tentamen kl Uppgift 4. Uppgift 5

Datastrukturer och algoritmer

Sid 1 Kapitel 7: Sökning (Hashning) Hashning

Grundläggande datalogi - Övning 4

Hashtabeller! (& kanske lite sortering)

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 2. AVL-träd, Multi-Way -sökträd, B-träd TDDD71: DALG. Innehåll. Innehåll. 1 Binära sökträd

Föreläsning 11 Innehåll

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

Föreläsning Datastrukturer (DAT037)

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

Datastrukturer. föreläsning 10. Maps 1

Tentamen Datastrukturer D DAT 035/INN960

Introduktionsmöte Innehåll

Tentamen Datastrukturer (DAT036)

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

Hashing Bakom kulisserna på Pythons dictionary

Tentamen Datastrukturer D DAT 035/INN960

Vad har vi pratat om i kursen?

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15-13:15

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

Algoritmer och datastrukturer 2012, fo rela sning 8

Databaser Design och programmering Minnesteknik Minnesteknik, forts Utvecklingen Hårddisk Hårddisk, forts

Programkonstruktion och Datastrukturer

Hashing Bakom kulisserna på Pythons dictionary. Leta i listor Osorterade listor. Leta i listor Sorterade listor

Hashing Bakom kulisserna på Pythons dictionary

Tentamen Datastrukturer, DAT037 (DAT036)

3. Toppkvinnor på hög Låt lådan och de två kvinnornas famnar utgöra stackarna L, K1 respektive K2. Från början finns alla kort i L.

Övning 4. Hashning, sortering, prioritetskö, bästaförstsökning. Hitta på en perfekt hashfunktion för atomer. Hur stor blir hashtabellen?

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

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

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

Dugga Datastrukturer (DAT036)

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Databaser - Design och programmering. Minnesteknik. Minnesteknik, forts. Hårddisk. Primärminne (kretsteknik) Fysisk design av databasen

Sökning och sortering

Övningsuppgifter #11, Programkonstruktion och datastrukturer

Innehåll. Mina målsättningar. Vad krävs för att nå dit? Obligatoriska uppgifter. Websajten. Datastrukturer och algoritmer

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

Föreläsning 14 Innehåll

DD1320 Tillämpad datalogi. Lösnings-skiss till tentamen

Föreläsning Datastrukturer (DAT036)

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

Tentamen Datastrukturer (DAT037)

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

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

Föreläsning 2. Stackar, köer och listor TDDC91,TDDE22,725G97: DALG. Innehåll. 1 ADT stack. 1.1 Tillämpningar

Databaser Design och programmering. Fysisk design av databasen att ta hänsyn till implementationsaspekter: minnesteknik filstrukturer indexering

Föreläsning Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 1 Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

Föreläsning 5 Innehåll

Föreläsning 13 Datastrukturer (DAT037)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Datastrukturer. föreläsning 10. Maps 1

Föreläsning 2 Datastrukturer (DAT037)

TDDC77 Objektorienterad Programmering

Föreläsning 11. ADT:er och datastrukturer

DAI2 (TIDAL) + I2 (TKIEK)

TDDB56 DALGOPT Algoritmer och Optimering Tentamen , 8 13

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 2 Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet

Transkript:

Föreläsning 1 Kursadministration, ADT Map/Dictionary, hashtabeller TDDD71: DALG Utskriftsversion av föreläsning i Datastrukturer och algoritmer 3 november 2015 Tommy Färnqvist, IDA, Linköpings universitet 1.1 Innehåll Innehåll 1 Administrativ information 1 1.1 Upplägg............................................ 1 2 DALG introduktion 2 3 ADT Map/Dictionary 4 3.1 Definitioner.......................................... 4 3.2 Implementation........................................ 5 4 Hashtabeller 5 4.1 Kollisionshantering...................................... 6 4.2 Att välja hashfunktion..................................... 8 1.2 1 Administrativ information Lärare och personal Kursledare, examinator, föreläsningar: Tommy Färnqvist tommy.farnqvist@liu.se Assistent, lektioner, labbar: Rebecka Geijer Michaeli rebecka.geijer.michaeli@liu.se Kursassistent, lektioner, labbar: Filip Strömbäck filip.stromback@liu.se Assistent, lektioner, labbar: Sam Le sam.le@liu.se Kursadministratör: Åsa Kärrman asa.karrman@liu.se Litteratur Michael Goodrich, Roberto Tamassia Data Structures and Algorithm Analysis in Java (5th edition) Wiley 2011 Labbkompendium (.pdf på kurshemsidan) 1.3 1.4 Examination 3 laborationsuppgifter Deadline för redovisning av laborationerna är 18 december 2015. 1.5 1.1 Upplägg Föreläsningar Administration, hashning AVL-träd, flervägssökträd Grafer 1.6 1

Laborationer Hashtabeller (Java) AVL-träd (Java) Ordkedja (Java) Var vänlig registrera er senast 6 nov i webreg och på Kattis 1.7 Din insats i kursen Följ undervisningen (om du vill) Läs kurslitteraturen Plugga under hela kursen Gör datorlabb 1 3 Kursens hemsida http://www.ida.liu.se/~tddd71/ 1.8 2 DALG introduktion Kursmål enligt studiehandboken Efter genomgången kurs skall den studerande kunna använda, förklara och analysera datastrukturer och algoritmer för avbildningar samt datastrukturer och grundläggande algoritmer för grafer. Fördjupningen inom datastrukturer och algoritmer skall bereda studenten möjlighet att välja kurser från D- och IT-programmen i åk 4. 1.9 Kodoptimering ikompilator Linjärprogrammering Heltalsprogrammering Analys avprog. repr.i kompilator Internetalgoritmer Strängsökning DALGADTer Datoralgebra Algoritmer försociala nätverk Kryptografiskaalgoritmer Databaser Numeriskaalgoritmer Simuleringsalgoritmer Scientificcomputing Beräkningsgeometri Datorgrafikoch multimedia Algoritmer förnätverksflöden 1.10 Gammalt ursprung, nya möjligheter Studiet av algoritmer har pågått åtminstone sedan Euklides Formaliserades av Church och Turing på 1930-talet Vissa viktiga algoritmer upptäcktes av studenter i liknande kurser som denna! 1.11 2

För att kunna lösa annars olösbara problem T.ex. nätverkskonnektivitet 1.12 För intellektuell stimulans 1.13 För att bli en kunnig programmerare 1.14 3

För att DALG kan hjälpa oss att lista ut saker om livet och universum Datorbaserade modeller ersätter matematiska modeller alltmer i dagens vetenskap 3 1.15 ADT Map/Dictionary 3.1 Definitioner ADT Map Domän: mängder av poster/par (nyckel, värde) Mängderna är partiella funktioner som avbildar nycklar på värden! Typiska operationer: size() antalet par i mängden isempty() kolla om mängden är tom get(k) hämta informationen associerad med k eller null om någon sådan nyckel inte finns put(k, v) lägg till (k, v) till mängden och returnera null om k är ny; ersätt annars värdet med v och returnera det gamla värdet remove(k) ta bort post (k, v) och returnera v; returnera null om mängden inte har någon sådan post 1.16 ADT Map Exempel på tillämpningar: Kursdatabas: (kod, namn) Associativt minne (adress, värde) Gles matris: ((rad, kolumn), värde) Lunchmeny: (dag, rätt) Statisk Map: inga uppdateringar tillåtna Dynamisk Map: uppdateringar är tillåtna 1.17 ADT Dictionary Domän: mängder av par (nyckel, värde) Mängderna är relationer mellan nycklar och värden! Typiska operationer: size() antalet par i mängden isempty() kolla om mängden är tom find(k) returnera någon post med nyckel k eller null om inget sådant par finns findall(k) returnera en itererbar samling av alla poster med nyckel k insert(k, v) lägg till (k, v) och returnera den nya posten remove(k, v) ta bort och returnera paret (k, v); returnera null om det inte finns något sådant par entries() returnera itererbar samling av alla poster 1.18 4

ADT Dictionary Exempel: Svensk-engelskt lexikon..., (jakt, yacht), (jakt, hunting),... Telefonkatalog (flera nummer tillåtna) Relation mellan liuid och avklarade kurser Lunchmeny (med flera val): (dag, rätt) Statisk Dictionary: inga uppdateringar tillåtna Dynamisk Dictionary: uppdateringar är tillåtna 1.19 3.2 Implementation Implementation: Map, Dictionary Tabell/array: sekvens av minnesområden av lika storlek Oordnad: ingen särskild ordning mellan T [i] och T [i + 1] Ordnad:... men här gäller T [i] < T [i + 1] Länkad lista Oordnad Ordnad (Binära) sökträd Hashning 1.20 Tabellrepresentation av Dictionary Oordnad tabell: find genom linjärsökning misslyckad uppslagning: n jämförelser O(n) tid lyckad uppslagning, värsta fallet: n jämförelser O(n) tid lyckad uppslagning, medelfallet med likformig fördelning av förfrågningar: 1 n+1 n (1+2+...+n) = 2 jämförelser O(n) tid 1.21 Tabellrepresentation av Dictionary Ordnad tabell (nycklarna är linjärt ordnade): find genom binärsökning uppslagning: O(logn) tid... uppdateringar är dyra!! 1.22 Kan vi hitta på något bättre? Ja, med hjälp av hashtabeller Idé: givet en tabell T [0,...,max] att lagra element i...... hitta ett lämpligt tabellindex för varje element Hitta en funktion h sådan att h(key) [0,...,max] och (idealt) sådan att k 1 k 2 h(k 1 ) h(k 2 ) Lagra varje nyckel-värdepar (k,v) i T [h(k)] 1.23 4 Hashtabeller Hashtabell I praktiken ger inte hashfunktioner unika värden (de är inte injektiva) Vi behöver kollisionshantering... och Vi behöver hitta en bra hashfunktion 1.24 5

4.1 Kollisionshantering Kollisionshantering Två principer för att hantera kollisioner: Länkning: håll krockande data i länkade listor Separat länkning: ha de länkade listorna utanför tabellen Samlad länkning: lagra alla data i tabellen Öppen adressering: lagra alla data i tabellen och låt någon algoritm bestämma vilket index som ska användas vid en kollision [Eng: Separate Chaining, Coalesced Chaining, Open Addressing] 1.25 Länkning Separat länkning 0 1 2 41 28 54 3 4 5 18 6 7 8 9 10 36 10 11 12 90 12 38 25 Samlad länkning 1.26 Öppen adressering 1.27 Exempel: hashning med separat länkning Hashtabell med storlek 13 Hashfunktion h med h(k) = k mod 13 Lagra 10 heltalsnycklar: 54, 10, 18, 25, 28, 41, 38, 36, 12, 90 0 1 2 41 28 54 3 4 5 6 18 7 8 9 10 36 10 11 12 90 12 38 25 1.28 6

Separat länkning: find Givet: nyckel k, hashtabell T, hashfunktion h beräkna h(k) leta efter k i listan T [h(k)] pekar ut Notation: sondering= en access i den länkade listan 1 sondering för att komma åt listhuvudet (om icke-tomt) 1+1 sondering för att komma åt innehållet i första listelementet 1+2 sondering för att komma åt innehållet i andra listelementet... En sondering (att följa en pekare) tar konstant tid. Hur många avpekningar P behövs för att hämta en post i hashtabellen? 1.29 Separat länkning: misslyckad uppslagning n dataelement m platser i tabellen Värsta fallet: alla dataelement har samma hashvärde: P = 1 + n Medelfallet: hashvärden likformigt fördelade över m: medellängd α av lista: α = n/m P = 1 + α 1.30 Separat länkning: lyckad uppslagning Medelfallet: access av T [h(k)] (början av en lista L): 1 traversera L k hittas efter: L /2 förväntat L svarar mot α, alltså: förväntat P = α/2 + 1 1.31 Samlad länkning: behåll elementen i tabellen Placera dataelementen i tabellen Utöka dem med pekare Lös kollisioner genom att använda första lediga plats Kedjor kan innehålla nycklar med olika hashvärden...... men alla nycklar med samma hashvärden dyker upp i samma kedja + Bättre minnesanvändning - Tabellen kan bli full - Längre kollisionskedjor 1.32 Samlad länkning 1.33 7

Öppen adressering Lagra alla element inuti tabellen Använd en fix algoritm för att hitta en ledig plats Sekvensiell/linjär sondering önskvärt hashindex j = h(k) om konflikt uppstår gå till nästa lediga position om tabellen tar slut, gå till början av tabellen... Positioner i närheten av varandra fylls snabbt upp (primärklustring) Hur gör man remove(k)? 1.34 Öppen adressering remove() Elementet som ska tas bort kan vara del i en kollisionskedja kan vi avgöra det? Om det är del av en kedja kan vi inte bara ta bort elementet! Eftersom alla nycklar lagras, hasha om alla data som är kvar? Titta bland elementen efter, hasha om eller dra ihop när lämpligt, stanna vid första lediga position...? Ignorera sätt in en markör borttagen (deleted) om nästa plats är icke-tom... 1.35 Dubbel hashning eller vad göra vid kollision? Andra hashfunktion h 2 beräknar inkrement i fall av konflikter Inkrement utanför tabellen tas modulo m = tablesize Linjär sondering är dubbel hashning med h 2 (k) = 1 Krav på h 2 : h 2 (k) 0 för alla k h 2 (k) har inga gemensamma delare med m för något k alla tabellpositioner kan nås Ett vanligt val h 2 (k) = q (k mod q) för q < m, m primtal (dvs, välj ett primtal mindre än tabellstorleken!) 1.36 4.2 Att välja hashfunktion Vad är en bra hashfunktion? Antag att k är ett naturligt tal. Hashning bör ge en likformig fördelning av hashvärden, men detta beror på distributionen av nycklar i datat som ska hashas. Exempel: Hashning av efternamn i en (svensk) grupp studenter hashfunktion: ASCII-värdet av sista bokstaven dåligt val: majoriteten av namn slutar med n. 1.37 8

Förslag på hashfunktioner Minnesadressen Tolka minnesadressen där objektet som ska hashas finns som ett heltal Fungerar bra i allmänhet, men inte bra för t.ex. numeriska nycklar eller strängnycklar. Omvandla till heltal Tolka om bitarna i nyckeln som ett heltal Lämpar sig för nycklar av kortare längd än antalet bitar i heltalstypen Komponentsumma Dela upp bitarna i nyckeln i komponenter av fix längd (t.ex 16 eller 32 bitar) och summera komponenterna. (Ignorera overflow.) Lämpar sig för numeriska nycklar av fix längd större än eller lika med antalet bitar i heltalstypen. 1.38 Förslag på hashfunktioner Polynomisk ackumulering Dela upp bitarna i nyckeln i en sekvens av komponenter av fix längd (t.ex. 8, 16 eller 32 bitar) Evaluera polynomet vid ett fixt värde z. (Ignorera overflow.) a 0 a 1 a n 1 p(z) = a 0 + a 1 z + a 2 z 2 +... + a n 1 z n 1 Extra lämpligt för hashning av strängar. (T.ex. z = 33 ger som mest 6 kollisioner på en mängd av 50000 engelska ord.) Polynom p(z)) kan evalueras i O(n) tid genom att använda Horners regel: Följande polynom beräknas successivt. Varje polynom i sekvensen kan beräknas i O(1) tid utgående från föregående polynom i sekvensen p 0 (z) = a n 1 p i (z) = a n i 1 + zp i 1 (z) (i = 1,2,...,n 1) Vi har p(z) = p n 1 (z) 1.39 Hashning genom heltalsdivision Låt m vara tabellstorleken Undvik m = 2 d : hashning ger sista d bitarna i k m = 10 d : hashning ger d sista siffrorna h(k) = k mod m Man brukar föreslå primtal för m Undersök stickprov från riktiga data för att experimentera med hashparametrarna Se http://burtleburtle.net/bob/hash/doobs.html för andra åsikter i frågan. 1.40 9