Föreläsning 5 Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Programkonstruktion och. Datastrukturer

Dugga Datastrukturer (DAT036)

Föreläsning 13 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Föreläsning 7 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Föreläsning Datastrukturer (DAT037)

Föreläsning 10 Datastrukturer (DAT037)

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

Datastrukturer. föreläsning 6. Maps 1

Hashtabeller. TDA416, lp3 2016

Algoritmer och datastrukturer

Föreläsning Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036)

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

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

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen Datastrukturer (DAT036)

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

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

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

Diskutera. Hashfunktion

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

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

Seminarium 13 Innehåll

Tentamen Datastrukturer (DAT036)

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

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

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

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

Föreläsning 3 Datastrukturer (DAT037)

Lösningar Datastrukturer TDA

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

Inlämningsuppgift och handledning

Föreläsning 10 Innehåll

Tentamen Datastrukturer (DAT037)

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

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

Föreläsning Datastrukturer (DAT036)

Föreläsning 9 Innehåll

Datastrukturer. föreläsning 10. Maps 1

Föreläsning 9 Innehåll

Algoritmer och datastrukturer 2012, fo rela sning 8

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

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Föreläsning 1 Datastrukturer (DAT037)

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

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

Tentamen Datastrukturer, DAT037 (DAT036)

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

Ännu mera träd: 2-3-träd, B-träd, rödsvarta träd, träd Weiss, avsnitt 4.7, 11.5, 12.2, etc.

Föreläsning 14 Innehåll

Föreläsning 11 Innehåll

Tentamen Datastrukturer D DAT 036/DIT960

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 11 Datastrukturer (DAT037)

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Tentamen Datastrukturer D DAT 035/INN960

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

Föreläsning 8 Datastrukturer (DAT037)

Länkade strukturer, parametriserade typer och undantag

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 3 Datastrukturer (DAT037)

Självbalanserande AVL-träd Weiss, avsnitt 4.4

Föreläsning Datastrukturer (DAT036)

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Föreläsning 13 Innehåll

Träd Hierarkiska strukturer

Tildatenta Lösningsskiss

Datastrukturer. Föreläsning 5. Maps 1

Tentamen TEN1 HI

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 2 Datastrukturer (DAT037)

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

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.

DAI2 (TIDAL) + I2 (TKIEK)

Föreläsning 6 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Föreläsning 2 Datastrukturer (DAT037)

Lösningsförslag till tentamen Datastrukturer, DAT037,

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)

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

Vad har vi pratat om i kursen?

Tommy Färnqvist, IDA, Linköpings universitet

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

Transkript:

Föreläsning 5 Datastrukturer (DAT037) Nils Anders Danielsson, Fredrik Lindblad 2016-11-14

Förra gången: Cirkulära arrayer Prioritetskö Binära heapar

Leftistheapar

merge Det verkar inte gå att slå ihop två binära heapar, implementerade med arrayer, på ett effektivt sätt. Med leftistheapar: O(log n)

Leftistheapar Heapordnade (ofta pekarbaserade) binära träd, som inte är kompletta utan uppfyller annan balanseringsinvariant, leftist träd-egenskapen. Grundläggande operation: merge. Lätt att implementera insert, delete-min med hjälp av merge.

Null path length För en nod, X, i ett träd är npl(x) (null path length of X) kortaste vägen till ett löv. (Jämför höjden som är längsta vägen till ett löv.) För tomt träd är null path length 1 (liksom för höjden).

Leftist träd-egenskapen För varje nod i trädet gäller för dess vänster- och högerbarn, l och r, att npl(l) npl(r). För ett leftist träd gäller att den högraste vägen har max log(n + 1) noder, där N är totalt antal noder.

Merge Behöver lagra npl för varje nod. Rekursiv implementering: Om något av träden är tomma, ta det andra trädet. Låt h vara trädet med minst rot och h > det andra. Slå ihop h.h (höger delträd) med h > (rekursivt anrop). Ersätt h.h med det nya trädet, som vi får anta (induktion) är en leftist heap med alla element som förekommer i h.h och h >.

Merge Eftersom vi valde delträd av det med minst rot vet vi att det nya delträdet uppfyller heap-ordningen gentemot föräldern. Hela det resulterande trädet uppfyller alltså heap-ordningen. Men kanske inte leftist-egenskapen. Om npl(h.v) < npl(h.h) så byt helt enkelt plats på barnen. Slutligen uppdatera npl i roten (h ). Den är npl(h.h) + 1.

Tidskomplexitet för merge Om vi anropar merge för h 1 och h 2 så är antalet rekursiva anrop begränsat av antalet noder i högraste vägen i h 1 + antalet noder i högraste vägen i h 2. Dessa är O(log( h 1 )) resp. O(log( h 2 )). Varje ekvering av den rekursiva operationen (exklusive det rekursiva anropet) tar konstant tid. Alltså är komplexiteten för merge O(log( h 1 ) + log( h 2 )) = O(log(max( h 1, h 2 )), d.v.s. O(log(n)) om n är storleken på den största heapen.

Implementering av insert och deletemin Insert implementeras genom att slå ihop trädet med ett träd bestående av ett element (det nya). Tidskomplexitet: O(log(n)). deletemin genom att ersätta roten med hopslagningen av vänster och höger delträd. Tidskomplexitet: O(log(n)).

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. Gränssnitt i Java: Set

Avbildningar/maps ADT: Konstruerare för tom avbildning. insert(k, v): Lägger till bindningen k v, mellan en nyckel och ett värde. 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). Gränssnitt i Java: Map

En mängd är en avbildning Mängd är ett specialfall av avbildning (en avbildning där värdet inte innehåller något). I java finns samma implementeringar för Map som för Set: HashMap och HashSet TreeMap och TreeSet

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

Hashtabeller

Hashtabeller Implementerar mängd- eller avbildnings-adtn. Använder array för att lagring av alla element/bindningar. Nyckeltypen kan vara vad som helst, t.ex. stora heltal eller strängar. Kan inte ha en plats för varje tänkbar nyckel (de är alldelas för många). Idé: Funktion som säger i vilken hink man ska lägga elementen/bindningarna. hashcode() finns i Javas Object.

Hashfunktioner h(k) funktion från nyckel till heltal. Dessa funktioner är kopplade till nyckel-typen och känner inte till hashtabellens storlek. Låt index vara f(k) = h(k) mod n {0 n 1} där n är arrayens storlek. Krav: Om x = y ska h(x) = h(y). Dock kan h(x) = h(y) och f(x) = f(y) för x y: kollision. Finns olika metoder för att hantera kollisioner, separat kedjning (chaining), öppen adressering

Rehashing När hashtabellen fylls blir så småningom antalet kollisioner för många. Likt dynamisk array, allokera (multiplikativt) större array. Nycklarna har samma hash-kod men p.g.a. att arrayens storlek ändras kommer de hamna på andra platser och fördelar över hela nya arrayen.

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, separat kedjning Varje hink kan lagra en mängd element, traditionellt i en länkad lista. På nästföljande slides följer pseudo-kod för en implementering.

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

Hashtabeller, öppen adressering Inga länkade listor. Vid kollision: element sparas på annan position i arrayen. Måste hantera det faktum att borttagna element en gång fanns där, annars kan man misslyckas att hitta andra element. Vid försök i tittar man på plats (f(k) + p(i)) mod n, där p(0) = 0 (första försöket). Klassiska val av p(i) är linear probing, quadratic probing. Annat alternativ är dubbelhashning.

Sammanfattning Leftistheapar Mängder/avbildningar Hashtabeller