Övningsuppgifter #11, Programkonstruktion och datastrukturer

Relevanta dokument
SI-möte #10, Programkonstruktion och Datastrukturer

Programkonstruktion och. Datastrukturer

Programkonstruktion och Datastrukturer

Tentamen (del 2) (4 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

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

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

Träd Hierarkiska strukturer

Föreläsning Datastrukturer (DAT036)

Föreläsning 4 Datastrukturer (DAT037)

Tentamen kl Uppgift 4. Uppgift 5

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 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd

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

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

Programkonstruktion och. Datastrukturer

Föreläsning Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT036)

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen

Lösningar Datastrukturer TDA

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

Föreläsning 5 Datastrukturer (DAT037)

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

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

Föreläsning Datastrukturer (DAT037)

Fredag 10 juni 2016 kl 8 12

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

Tentamen TEN1 HI

Tentamen Datastrukturer, DAT037 (DAT036)

Vad har vi pratat om i kursen?

13 Prioritetsköer, heapar

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

Föreläsning Datastrukturer (DAT036)

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

Datastrukturer. föreläsning 10. Maps 1

Algoritmer och datastrukturer 2012, fo rela sning 8

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning 10 Datastrukturer (DAT037)

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

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 11 Datastrukturer (DAT037)

Exempeltenta GruDat 2002/2003

Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

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

Tentamen Datastrukturer för D2 DAT 035

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

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

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 13 Datastrukturer (DAT037)

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 14 Innehåll

KTH, NADA, Vahid Mosavat. 1. Flervalsfrågor (5p)

Föreläsning 9 Innehåll

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

Tentamen Datastrukturer (DAT036)

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad

Dugga Datastrukturer (DAT036)

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

Datastrukturer. föreläsning 10. Maps 1

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

Magnus Nielsen, IDA, Linköpings universitet

Datastrukturer. föreläsning 6. Maps 1

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

Hashing Bakom kulisserna på Pythons dictionary

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

Datastrukturer. Föreläsning 5. Maps 1

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

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 9. Sortering

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

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

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

Tommy Färnqvist, IDA, Linköpings universitet

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

Sökning och sortering

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

Föreläsning 9 Innehåll

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tildatenta Lösningsskiss

Föreläsning Datastrukturer (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.

Hashtabeller. TDA416, lp3 2016

Hashing Bakom kulisserna på Pythons dictionary

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

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

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

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

Föreläsning 7 Datastrukturer (DAT037)

Programmering II (ID1019) :00-17:00

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

DAI2 (TIDAL) + I2 (TKIEK)

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Hashtabeller! (& kanske lite sortering)

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

Transkript:

Övningsuppgifter #11, Programkonstruktion och datastrukturer Lösningsförslag Elias Castegren elias.castegren@it.uu.se Övningar 1. 1

2. 2

3. Ett binomialträd med rang n har 2 n noder. En binomial heap innehåller alltså t 0 2 0 + t 1 2 1 + t 2 2 2 + + t m 2 m noder, där t i är ett eller noll beroende på om heapen har ett träd med rang i eller inte. Ett binärt tal d m d m 1 d m 2... d 0 blir decimalt d 0 2 0 + d 1 2 1 + d 2 2 2 + + d m 2 m där d i är ett eller noll. Antalet noder i ett binomialträd är alltså detsamma som ett binärt tal enligt ovan där en etta betyder att heapen har ett träd med motsvarande rang. i) (52) 10 = (110100) 2 - rangerna hos träden i heapen är alltså 2, 4 och 5 (index från höger för ettorna i det binära talet) ii) (53) 10 = (110101) 2 - rangerna är 0, 2, 4 och 5 iii) (127) 10 = (1111111) 2 - heapen innehåller träd av alla ranger mellan 0 och 7 iv) (128) 10 = (10000000) 2 - heaper innehåller ett träd av rang 8 När antalet noder är 2 k 1 måste man slå ihop k stycken träd om man lägger in ett nytt element (se övergången från 127 till 128 noder ovan). Det tar alltså längre tid att lägga in nya element när man har många ettor i följd i den binära representationen av antalet noder. 4. heapsort(l) : int list int list i) Skapa en tom max-heap H ii) Sätt in alla element i l i H, ett och ett iii) Ta ut det största elementet ur H och lägg det först i en lista l iv) Är H tom? Gå tillbaka till steg 3, annars returnera l Antag att listan som ska sorteras har l element. Vi gör först l stycken insättningar och sen l stycken extraheringar (båda operationerna med komplexitet Θ(log n), där n är antalet noder i heapen). Den totala komplexiteten blir alltså l Θ(log l ) + l Θ(log l ) = Θ( l log l ) Med andra ord är den jämförbar med mergesort och quicksort! 3

En ML-implementation med en min-heap följer nedan. Heapimplementationen kommer från föreläsningarna och finns att hämta från kurshemsidan. (* sort(l) TYPE: int list -> int list PRE: () POST: l sorterad EXAMPLES: sort([5,3,4,2,1]) = [1,2,3,4,5] *) fun sort(l) = let (* extractall(h) TYPE: binoheap -> int list PRE: h uppfyller invarianten för binomiala min-heapar POST: en sorterad lista med alla element i h EXAMPLES: sort({en heap med elementen <3,4,5>}) = [3,4,5] *) (* VARIANT: Antalet element i heapen h *) fun extractall(h) = if null(h) then [] else let val (e, h ) = extractmin(h) in e::extractall(h ) end val H = foldr (fn(e, h) => insert(h, e)) [] l in extractall(h) end; Tänk på att heapen är definierad som: type binoheap = binotree list En tom heap är alltså detsamma som en tom lista (se foldr-anropet). Därför kan man också använda listfunktioner som null för att se om en heap är tom. 4

5. Hashvärdena för våra element: k h(k) = k mod 10 113 3 19 9 155 5 16 6 129 9 43 3 99 9 26 6 125 5 73 3 Sätt in 113 113 Sätt in 19 113 19 Sätt in 155 113 155 19 Sätt in 16 113 155 16 19 Sätt in 129 113 155 16 129 19 Sätt in 43 43 155 16 129 113 19 Sätt in 99 43 155 16 99 113 129 19 5

Sätt in 26 43 155 26 99 113 16 129 19 Sätt in 125 43 125 26 99 113 155 16 129 19 Sätt in 73 73 125 26 99 43 155 16 129 113 19 Borttagning av element går till på samma sätt som ovan. Man kan sluta leta efter element som inte finns när man når slutet av kedjan på motsvarande plats. 6. Linjär probing h(k, i) = (k + f(i)) mod 10 f(i) = i Sätt in 113 113 Sätt in 19 113 19 Sätt in 155 113 155 19 Sätt in 16 113 155 16 19 6

Sätt in 129 113 155 16 19 129 113 155 16 19 Sätt in 43 129 113 155 16 19 Sätt in 99 i = 2 129 99 113 43 155 16 19 Sätt in 26 129 99 113 43 155 16 19 129 99 113 43 155 16 26 19 Sätt in 125 129 99 113 43 155 16 26 19 129 99 113 43 155 16 26 19 i = 2 129 99 113 43 155 16 26 19 i = 3 129 99 113 43 155 16 26 125 19 7

Sätt in 73 129 99 113 43 155 16 26 125 19 129 99 113 43 155 16 26 125 19......... i = 9 129 99 73 113 43 155 16 26 125 19 Man hittar rätt plats på samma sätt när man tar bort element. Ett borttaget element ersätts med för att skilja det från en plats som aldrig har haft något element. Efter att ha tagit bort elementen 19, 26, 129 och 73 ser hashtabellen ut så här: 99 113 43 155 16 125 Letar man efter ett element som inte finns måste man proba tills man hittar ett, eller tills man har provat alla möjliga probningar (ovan, när i = 9) Kvadratisk probing h(k, i) = (k + f(i)) mod 10 f(i) = i 2 De sex första insättningarna blir identiska med de ovan (eftersom 0 = 0 2 och 1 = 1 2 ). Sätt in 99 i = 2 i = 3 129 113 43 155 16 99 19 8

Sätt in 26 129 113 43 155 16 99 19 129 113 43 155 16 26 99 19 Sätt in 125 129 113 43 155 16 26 99 19 129 113 43 155 16 26 99 19 i = 2 129 113 43 155 16 26 99 19 i = 3 129 113 43 155 16 26 99 19 i = 4 129 125 113 43 155 16 26 99 19 Sätt in 73 129 125 113 43 155 16 26 99 19 129 125 113 43 155 16 26 99 19 i = 2 129 125 113 43 155 16 26 99 19 i = 3 129 125 73 113 43 155 16 26 99 19 Samma principer gäller för borttagning som ovan. Man kan sluta leta efter ett element när man hittar ett eller när man har provat alla möjliga probningar (ovan när i = 5). 9

7. Vi skriver en funktion som går igenom en lista med en hashtabell h och för varje element e kollar om e finns i h. Om e inte finns i h behåller vi elementet i listan och lägger in det i h. Om e finns i h så betyder det att e har förekommit tidigare i listan, därför tar vi bort det ur listan. Eftersom vi bara är intresserade av att att snabbt lagra och hitta nycklar i tabellen så låter vi alla värden vi lägger in i hashtabellen vara unit. (* killduplicates l TYPE: string list -> string list PRE: () POST: l med endast en förekomst av varje element EXAMPLES: killduplicates ["a", "b", "a", "b", "c"] = ["a", "b", "c"] COMPLEXITY: Theta( l ) i genomsnittliga fall *) fun killduplicates(l) = let (* killduplicates (l,h) TYPE: string list*hasharray.hash -> string list PRE: () POST: l med endast en förekomst av varje element och utan något element som finns som nyckel i h EXAMPLES: killduplicates (["a", "b", "b", "c"], {("a"->())}) = ["a", "b", "c"] COMPLEXITY: Theta( l ) för en välbyggd hashtabell h *) fun killduplicates ([], _) = [] killduplicates (f::r, h) = if issome(hasharray.sub(h,f)) then killduplicates (r, h) else (HashArray.update(h,f,()); f::killduplicates (r, h)) val h = HashArray.hash(length l) in killduplicates (l,h) end; killduplicates skulle kunna ha typen a list -> a list om Poly/ML tillät polymorfa hashtabeller (som många andra programmeringsspråk och ML-dialekter gör). 10