Facit Tentamen TDDC30 2014-03-18 1 (7) Teoretisk del 1. (3p) "Snabba frågor" a) Varför kan man tänkas vilja dölja metoder och variabler med private? (0.5p) Svar:För att skydda interna variabler från ändringar utifrån, och/eller för att dölja vissa implementationsdetaljer för den kod eller de användare som använder sig av klassen. b) Vad är syftet med undantag/exceptions? (0.5p) Svar:Att kunna signalera när något har gått fel och vad som har fått fel, samt kunna bolla vidare ansvaret till rätt nivå av programmet, dvs. rätt nivå i metodanropskedjan. c) Vad är skillnaden mellan en abstrakt datatyp (ADT) och dess implementation? (0.5p) Svar:Den abstrakta datatypen beskriver vad som ska göras, men inte hur det görs. Implementationen går steget längre och bestämmer även hur det ska göras. d) Om en algoritm har tidskomplexiteten O(n) och en annan O(n 2 ), vad innebär det här för skillnad mellan algoritmerna? (0.5p) Svar:För stora n kommer den värsta möjliga tidsförbrukningen växa linjärt med n för O(n)-algoritmen, men O(n 2 )-algoritmen växer istället kvadratisk. Om n blir dubbelt så stor så kommer den värst tidsförbrukningen för O(n)-algoritmen också bli dubbelt så stor, till skillnad från O(n 2 )-algoritmen där tidsförbrukningen skulle bli fyra gånger så stor. e) I Animal myanimal = new Animal() sker två separata saker. Vad innebär Animal myanimal och vad innebär new Animal()? (0.5p) Svar: Animal myanimal skapar en variabel som är en referens till ett Animal-instans, men skapar inte den tillhörande Animal-instansen. new Animal() skapar en Animal-instans, som det måste lagras en referens till i någon slags variabel för att den ska forsätta existera. f) Vad skiljer en statisk variabel (dvs. en klass-variabel) från en icke-statisk? (0.5p) Svar:En statisk variabel är associerad till klassen, och kan kommas åt utan en instans av klassen. En icke-statisk variabel är å andra sidan associerad med en viss instans av klassen, och kan bara kommas åt via en sådan instans. Klass-variabeln blir alltså delad av alla instanser av klassen, eftersom det bara finns en variabel för klassen, snarare än en per instans.
Facit Tentamen TDDC30 2014-03-18 2 (7) 2. (3p) "Datastrukturer" a) Ett binärt sökträd har skrivits ut med en preorder-traversering, vilket resulterade i [ 4 2 1 3 7 6 5 9 8 ]. Rita upp hur det binära sökträdet såg ut. (1.5p) Svar: 4 2 7 1 3 6 9 5 8 b) Är trädet nedan en heap av något slag? Ange svar samt motivera varför/varför inte med minst en heap-egenskap. (0.5p) 2 3 1 5 6 8 7 4 Svar:Nej, eftersom barn inte alltid är större eller mindre än sina föräldrar, t.ex. 2 1 8. c) Ange i vilken ordning värdena i trädet ovan skulle lagras i fältet, om hela trädet representerades som ett fält. Markera odefinierade värden i fältet med ett frågetecken. (1p) Svar:[ 2 3 1 5 6 8 7 4??????? ]
Facit Tentamen TDDC30 2014-03-18 3 (7) 3. (3p) "Tidskomplexitet" a) Förenkla följande tre uttryck för tidskomplexitet: (1p) 1) O(2n) + O(n 2 ) 2) O(n) O(2n + n) 3) O(2) O(3n 3 ) + O(n) Svar:1) O(n 2 ) 2) O(n 2 ) 3) O(n 3 ) b) Ange tidskomplexiteten i värsta fallet, med avseende på n, för följande metoder. (n är alltid ett positivt heltal.) (1p) void foo(int n) { for (int i = 0; i < n; i = i+1) { for (int j = 0; j < 2*n; j = j+1) { System.out.println(i + " x " + j); void branch(int n) { // is n evenly divisible by 2? if (n % 2 == 0) { bar(n * n * n); void bar(int n) { foo(n); for (int i = 0; i < 5; i = i+1) { foo(i); Svar:foo) O(n 2 ) bar) O(n 2 ) branch) O(n 6 ) c) Ange tidskomplexiteten i bästa fallet, med avseende på n, för metoderna ovan. (n är alltid ett positivt heltal.) (1p) Svar:foo) Ω(n 2 ) bar) Ω(n 2 ) branch) Ω(1)
Facit Tentamen TDDC30 2014-03-18 4 (7) 4. (3p) "Algoritmer" a) Sortera värdena [ 5 1 2 7 6 2 4 ] med insertionsort. Gör detta genom att byta plats på värden inom fältet, dvs. in-place. Sorteringen ska leda till stigande ordning, dvs 1, 2, 3, osv. Ange tydligt i svaret hur hela fältet ser ut innan varje platsbyte, samt vilka index som är på väg att byta plats, med maximalt ett byte per steg. (1p) Svar:[ 5 1 2 7 6 2 4 ] [ 1 5 2 7 6 2 4 ] [ 1 2 5 7 6 2 4 ] [ 1 2 5 6 7 2 4 ] [ 1 2 5 6 2 7 4 ] [ 1 2 5 2 6 7 4 ] [ 1 2 2 5 6 7 4 ] [ 1 2 2 5 6 4 7 ] [ 1 2 2 5 4 6 7 ] [ 1 2 2 4 5 6 7 ] b) Sortera värdena [ 4 0 1 6 5 1 3 ] med countsort. Var noga med att ange vad som sker i varje steg, så att det går att följa processen från början till slut. Sorteringen ska leda till stigande ordning, dvs 1, 2, 3, osv. (1p) Svar: c) Vad innebär det att en sorteringsalgoritm är stabil? Ge exempel på en sorteringsalgoritm som kan implementeras stabil, och en som inte kan implementeras stabil. (1p) Svar:Att den inte byter inbördes ordning mellan två värden av samma storlek. Exempelvis insertionsort ovan kan implementeras stabil då den ej behöver byta plats på 2'orna som ett steg i sorteringen. T.ex. shellsort kan dock ej implementeras stabil.
Facit Tentamen TDDC30 2014-03-18 5 (7) Praktisk del 5. (4p) Jobb-högen Snart är sommaren här, och denna sommar har Stefan bestämt sig för att han ska ut i arbetslivet och börja arbeta på kontakterna. Det vore trevligt med lite extra pengar i fickan efter sommarens slut, men att få in en fot på rätt företag vore inte heller en dålig idé. Efter en stunds sökande inser Stefan att det finns väldigt många möjliga arbetsplatser att ta ställning till, och han kan ju inte söka jobb hos alla, det skulle ta för lång tid. Han måste prioritera! För att lösa detta tar Stefan alla potentiella arbetsplatser han kan tänka sig och representerar dem som en klass i Java, med de egenskaper han anser relevanta som attribut. Tanken är att han därefter kan använda sig av en väl vald datastruktur för att sortera dessa jobb, och plocka fram de som han bör prioritera när det väl är dags att söka jobb! Importera Stefans projekt från given_files, och hjälp honom med programmet enligt nedan. a) Stefan har nästan skrivit klart sin JobOpportunity-klass, och nu vill han berätta för en kompis om sina planer och hur han har lagt upp sin kod. Det är dock svårt att förklara upplägget med ord och kompisen är inte intresserad nog att vilja läsa Stefans kod. För att kunna glänsa här behöver Stefan något som underlättar förklarandet, han behöver ett UML-diagram som beskriver upplägget! Rita ett klassdiagram för klasserna i data-paketet som anger attribut, metoder och relationer. (1p) (Denna uppgift besvaras skriftligt tillsammans med övriga skriftliga svar.) Svar:
Facit Tentamen TDDC30 2014-03-18 6 (7) b) Obs: Har du har bonus på labb 3 och 4 tillgodoräknas du deluppgift 5b och 5c. Stefan har en implementation av en heap sen tidigare som han vill använda för att prioritera de arbetsplatser han väljer mellan. Dock kräver den existerande koden att Stefans JobOpportunity implementerar ett särskilt interface, MyComparable, så att heapen vet hur den ska sortera de här objekten. Gör de förändringar som krävs i JobOpportunity så att heapen sorterar arbetsplatserna i första hand efter lön (sjunkande) och i andra hand prestige (sjunkande). Detta ska göras utan att ändra något i heap-paketet. (2p) c) Obs: Har du har bonus på labb 3 och 4 tillgodoräknas du deluppgift 5b och 5c. Vid närmare eftertanke inser Stefan att det vore trevligt att lägga till en depth-metod till heapen. Lägg till metoden depth, och låt den returnera ett heltal som är det maximala djupet i trädet. (1p) (Då djupet är avståndet från roten har roten alltså djup 0. Träd med mindre än ett element anses ha det maximala djupet 0.)
Facit Tentamen TDDC30 2014-03-18 7 (7) 6. (5p) De ordnade jobben Anna är inne på samma spår som Stefan med att organisera sommarens arbetsmöjligheter, men hon har valt att lägga upp det på ett lite annat sätt. Istället för en heap så har Anna skrivit en cirkulärt dubbellänkad listan för att lagra arbetsplatserna. Hon har kommit en bit på vägen, men är inte riktigt klar än. Importera Annas projekt från given_files, och hjälp henne med programmet enligt nedan. En cirkulärt dubbellänkad lista: a) En annan tanke Anna har är att det vore trevligt om hon kunde använda sin lista till annat än bara JobOpportunity, som nu är fallet. Gör de ändringar som behövs för att göra Annas lista och relaterade delar generisk, så att testprogrammet för del b fungerar. Inga varningar ska finnas kvar. (1p) Obs: Rätt testprogram för den här deluppgiften var TestPartB.java. b) Anna har redan en removefirst-metod för att ta bort det första värdet ur listan, men det vore även bra med en removelast-metod, resonerar Anna. Lägg till den metoden, så att testprogrammet för del c fungerar. (1p) Obs: Rätt testprogram för den här deluppgiften var TestPartA.java. c) Anna har sin add-metod sen tidigare, men den stoppar bara in det nya värdet först i listan för tillfället. Anna vill istället att det JobOpportunity som ska stoppas in läggs till på rätt plats direkt i listan, vid instoppningstillfället. Hon vill sortera arbetsplatserna på möjlig lön, så rätt plats är ordnad på lön (sjunkande). När allt är sagt och gjort ska alltså arbetsplatserna som tas ur listan komma med högst lön först, i testprogrammet för del c. (3p) (Lös denna uppgift som ett separat projekt, då det finns en potentiell konflikt mellan denna deluppgift och deluppgift a.)