Dugga Datastrukturer (DAT036)



Relevanta dokument
Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Tentamen Datastrukturer (DAT037)

Tentamen Datastrukturer, DAT037 (DAT036)

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer D DAT 036/DIT960

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

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

Tentamen TEN1 HI

Föreläsning Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT036)

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

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

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

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Tentamen i Algoritmer & Datastrukturer i Java

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

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

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

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

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

Föreläsning Datastrukturer (DAT037)

Föreläsning 10 Datastrukturer (DAT037)

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning 6: Introduktion av listor

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 3 Datastrukturer (DAT037)

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 2 Datastrukturer (DAT037)

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 11 Datastrukturer (DAT037)

BST implementering, huvudstruktur

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

DAI2 (TIDAL) + I2 (TKIEK)

Lösningar Datastrukturer TDA

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

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

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 13 och 14: Binära träd

Föreläsning Datastrukturer (DAT037)

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

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 9 Innehåll

Tentamen, Algoritmer och datastrukturer

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Tentamen OOP

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

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

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

Lösningsförslag till exempeltenta 1

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 3 Datastrukturer (DAT037)

Objektorienterad programmering i Java

Tentamen Datastrukturer för D2 DAT 035

"if"-satsen. Inledande programmering med C# (1DV402)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

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

Objektorienterad programmering D2

Sätt att skriva ut binärträd

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

Datastrukturer och algoritmer

Grundläggande programmering med C# 7,5 högskolepoäng

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 4: Kombinatorisk sökning

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 6 Datastrukturer (DAT037)

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Tentamen på kursen DA7351, Programmering , kl Malmö högskola Teknik och samhälle. DA7351, Programmering

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 27 maj 2008

Exempeltenta GruDat 2002/2003

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

Översikt. Installation av EasyPHP 1. Ladda ner från Jag använder Release Installera EasyPHP.

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.

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

OOP Objekt-orienterad programmering

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Föreläsning 13 Datastrukturer (DAT037)

Algoritmer, datastrukturer och komplexitet

Tentamen: Programutveckling ht 2015

Lösningsförslag till exempeltenta 2

Föreläsning 13 Datastrukturer (DAT037)

Transkript:

Dugga Datastrukturer (DAT036) Duggans datum: 2012-11-21. Författare: Nils Anders Danielsson. För att en uppgift ska räknas som löst så måste en i princip helt korrekt lösning lämnas in. Enstaka mindre allvarliga misstag kan eventuellt godkännas. Notera att duggan kan komma att rättas hårdare än tentorna. Lämna inte in lösningar för flera uppgifter på samma blad. Lösningar kan underkännas om de är svårlästa, ostrukturerade eller dåligt motiverade. Pseudokod får gärna användas, men den får inte utelämna för många detaljer. Om inget annat anges så kan du använda kursens uniforma kostnadsmodell när du analyserar tidskomplexitet (så länge resultaten inte blir uppenbart orimliga). Om inget annat anges behöver du inte förklara standarddatastrukturer och -algoritmer från kursen, men däremot motivera deras användning. 1

1. Analysera nedanstående kods tidskomplexitet, uttryckt i n: for(int i = 0; i < n; i++) { xs.add-first(pq.delete-min()); Använd kursens uniforma kostnadsmodell, och gör följande antaganden: Att n är ett ickenegativt heltal, och att typen int kan representera alla heltal. Att pq är en binär min-heap som till att börja med innehåller n element. Att xs är en till att börja med tom lista, implementerad som en dynamisk array. Att add-first lägger till elementet först i listan. Onödigt oprecisa analyser kan underkännas. 2. Implementera en algoritm som, givet ett binärt träd utan föräldrapekare, 1 skapar ett motsvarande träd med föräldrapekare. Det nya trädet ska ha samma struktur och innehåll som det gamla (bortsett från föräldrapekarna). Du kan använda följande trädklasser: // Binära träd utan föräldrapekare. public class TreeWithout<A> { // Trädnoder; null representerar tomma träd. public class TreeNode { A contents; // Innehåll. TreeNode left; // Vänstra barnet. TreeNode right; // Högra barnet. // Roten. public TreeNode root; 1 Pekare från en nod till dess förälder. 2

// Binära träd med föräldrapekare. public class TreeWith<A> { // Trädnoder; null representerar tomma träd. private class TreeNode { A contents; // Innehåll. TreeNode left; // Vänstra barnet. TreeNode right; // Högra barnet. TreeNode parent; // Föräldern; null för roten. // Skapar en trädnod. TreeNode(A contents, TreeNode left, TreeNode right, TreeNode parent) { this.contents = contents; this.left = left; this.right = right; this.parent = parent; // Roten. private TreeNode root; // Din uppgift. public TreeWith(TreeWithout<A> t) {... Endast detaljerad kod (inte nödvändigtvis Java) godkänns. Du får inte anropa några andra metoder/procedurer (förutom TreeNode-konstruerarna), om du inte implementerar dem själv. Algoritmen måste vara linjär i trädets storlek (O(n), där n är storleken). Visa att så är fallet. Tips: Testa din kod, så kanske du undviker onödiga fel. 3

3. En variant av en uppgift från en av Peter Dybjers tidigare tentor. Beskriv en linjär algoritm som avgör om två listor innehållandes heltal är permutationer av varandra. Analysera algoritmens tidskomplexitet. Två listor är permutationer av varandra om de innehåller samma element, och samma antal av varje element. Elementen behöver inte förekomma i samma ordning. Exempel: Lista 1 Lista 2 Resultat [0, 1, 2, 3] [3, 1, 0, 2] Sant [0, 1, 2, 3] [3] Falskt [0, 1] [0, 1, 1] Falskt [1, 0, 1] [0, 1, 1] Sant Tips: Testa din algoritm, så kanske du undviker onödiga fel. Använd gärna standarddatastrukturer och/eller -algoritmer från kursen. 4

Kortfattade lösningsförslag för dugga i Datastrukturer (DAT036) från 2012-11-21 Nils Anders Danielsson 3. Använd en hashtabell för att hålla reda på antalet förekomster av varje tal: occurrences = new hash table Beräkna antalet förekomster av elementen i första listan: for i in the first list do n = occurrences.get(i) if n == null then n = 0 occurrences.set(i, n + 1) Subtrahera antalet förekomster av elementen i andra listan, och ge false som svar om något element i den andra listan inte finns i den första: for i in the second list do n = occurrences.get(i) if n == null then return false else occurrences.set(i, n - 1) Kontrollera om antalet förekomster i de två listorna stämmer överens: for i in the first list do if not (occurrences.get(i) == 0) then return false return true Antag att listorna (eller den längsta listan) har längden n. Koden ovan anropar set och get O(n) gånger, och utför i övrigt linjärt arbete. Om vi antar att vår hashfunktion är tillräckligt bra, och dessutom kan beräknas på konstant tid, så kan vi dra slutsatsen att algoritmens tidskomplexitet är O(n). 1

1. Några observationer: Kön är tillräckligt stor, så pq.delete-min kommer inte att misslyckas. Raden xs.add-first(pq.delete-min()); kommer att köras n gånger. Insättning först i en dynamisk array av storlek s har tidskomplexiteten Θ(s). Den totala tidskomplexiteten är således n O log(n i) + i = O(n log n + n ) = O(n ). 2. Implementation av algoritmen (i Java): // Konverterar ett TreeWithout-träd till ett TreeWith-träd // (utan att förstöra TreeWithout-trädet). public TreeWith(TreeWithout<A> t) { root = addparents(t.root, null); // Konverterar en TreeWithout-nod till en TreeWith-nod. // Använder parent som den nya nodens förälder. private TreeNode addparents (TreeWithout<A>.TreeNode without, TreeNode parent) { if (without == null) return null; TreeNode with = new TreeNode(without.contents, null, null, parent); with.left = addparents(without.left, with); with.right = addparents(without.right, with); return with; Algoritmen utför konstant arbete för varje nod, och är alltså linjär i trädets storlek. 2