Facit Tentamen TDDC30 2015-08-28 kl 08-12 1 (6) Teoretisk del 1. (6p) "Snabba frågor" Alla svar motiveras väl. a) Vad är syftet med ett interface? (1p) Svar:Att ange vilka metoder som ska finnas, utan att behöva ange hur de ska vara implementerade eller vilken basklass klassen ska ärva av. b) Vad är skillnaden mellan en instansvariabel och en klassvariabel? (1p) Svar:En klass som innehåller en instansvariabel får en separat sådan variabel i varje instans. En klass som innehåller en klassvariabel(dvs. en statisk) har dock bara en sådan, som alla instanser av den klassen istället delar på. c) Vad innebär polymorfi? (1p) Svar:Att en gemensam typ kan representera flera olika undertyper, baserade på den gemensamma bastypen, och att man i undertyperna kan definiera eller omdefiniera('skriver över') metoder från bastypen för att ändra beteendet. d) Varför anses program skrivna i Java vara plattformsoberoende? (1p) Svar:Programkoden i Java kompileras till ett mellanläge mellan källkod och maskinkod som kallas bytecode, som sedan är det som distribueras för att köra programmet. Den representationen kan sedan tolkas av en Java virtual machine(jvm), programvaran som behövs för att köra ett program. Det som gör att program skrivna i Java anses vara plattformsoberoende är att samma bytecode kan tolkas av flera olika JVM'er på olika platformar. Själva Javaprogrammet behöver ej ändras när en platform byts, utan man installerar istället rätt JVM för just den platformen och kör sedan Java-programmet med den. e) Vad är skillnaden mellan en abstrakt klass, en vanlig klass och ett interface? (2p) Svar:Ett interface ej innehålla metod-implementationer, bara metod-deklarationer. En abstrakt klass kan innehålla både metod-implementationer och rena metod-deklarationer. Varken ett interface eller en abstrakt klass utgör en klass man kan instantiera, då metoder utan implementation är odefinierade. En vanlig klass kan bara innehålla metod-implementationer, ej några rena metod-deklarationer, och kan därför också instantieras. Alla svar motiveras väl.
Facit Tentamen TDDC30 2015-08-28 kl 08-12 2 (6) 2. (6p) "Datastrukturer" a) Värdena 7 1 3 2 6 5 ligger i en perfekt minheap. Rita upp hur heapen ser ut och hur värdena ligger i den. (2p) Svar:Obs: Det finns andra korrekta svar. 1 52 5 3 6 7 b) Organisera om siffrorna i trädet nedan så att trädet utgör ett binärt sökträd. (2p) ( Organisera om siffrorna innebär att pilarna och noderna förblir på samma plats, endast siffrorna får byta plats i bilden.) 9 52 57 5 8 71 Svar:Obs: Det finns andra korrekta svar. 6 73 76 53 57 2 78 1 75 79 c) Ett binärt träd har skrivits ut med en levelorder-traversering samt en inorder-traversering. Rita upp hur det motsvarande trädet ser ut. (2p) Levelorder-traversering: 3 5 2 1 Inorder-traversering: 5 3 1 2 Svar: 3 5 52 51
Facit Tentamen TDDC30 2015-08-28 kl 08-12 3 (6) 3. (6p) "Tidskomplexitet" a) Antag att en enkellänkad lista har tre olika insert-metoder. Ange tidskomplexiteten, samt motivera varför, för: (3p) * En insert-metod som alltid stoppar in elementet först i listan. Svar:O(1), kan direkt skapa en ny första-nod som pekar på den förra. * En insert-metod som alltid stoppar in elementet sist i listan. Svar:O(n), måste gå igenom alla element i listan för att hitta det nuvarande sista elementet för att sedan stoppa in det nya elementet där. * En insert-metod som stoppar in det nya elementet på den x'te platsen i listan, där x är en parameter som anges när metoden körs. Svar:O(n), måste gå igenom x-1 element för att hitta rätt plats att stoppa in det nya elementet på, där x är n i värsta fall. b) Ange tidskomplexiteten i värsta fallet, med avseende på n, för följande metoder. (n är alltid ett positivt heltal.) (2p) int foo(int n) { int x = n*n; return x*x; int foofoo(int n) { for (int i = 0; i < 5; i = i+1) { foo(n); return 5; int sum(int n) { int sum = n*n; for (int i = 0; i < n; ++i) { sum += foofoo(i); return sum; Svar:foo) O(1) foofoo) O(1) sum) O(n) c) Förenkla följande uttryck för tidskomplexitet: (1p) Svar: O(5 + 2n + 2n²) O(n) + O(n 7 ) => O(n 7 )
Facit Tentamen TDDC30 2015-08-28 kl 08-12 (6). (6p) "Algoritmer" a) Sortera värdena [ 5 5 1 3 0 5 ] 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. Ange tydligt vad som sker under sorteringen. (2p) Svar: [ 5 5 1 3 0 5 ] [ 1 1 0 1 2 3 ] Index: 0 1 2 3 5 [ 0 1 3 5 5 5 ] b) Sortera värdena [ 2 5 8 7 1 3 6 ] 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. (2p) Svar:[ 2 5 8 7 1 3 6 ] [ 2 5 7 8 1 3 6 ] [ 2 5 7 1 8 3 6 ] [ 2 5 1 7 8 3 6 ] [ 2 1 5 7 8 3 6 ] [ 1 2 5 7 8 3 6 ] [ 1 2 5 7 3 8 6 ] [ 1 2 5 3 7 8 6 ] [ 1 2 3 5 7 8 6 ] [ 1 2 3 5 7 6 8 ] [ 1 2 3 5 6 7 8 ] 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. (2p) 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. quicksort kan dock ej implementeras stabil.
Facit Tentamen TDDC30 2015-08-28 kl 08-12 5 (6) Praktisk del 5. (8p) Bokhögen Skolstarten har krypt på Anna och hon har fortfarande många bra böcker kvar att läsa. För att hinna klart med åtminstone de allra viktigaste innan nyår så måste hon prioritera! En maxheap där hon kan stoppa in alla sina böcker med en prioritet, och sedan plocka ut dom igen, en och en, när det är dags att läsa dom, vore..egentligen kanske overkill, men lite studieflykt är alltid välkommet! I det här fallet låter hon t.ex. favoritboken få prioritet 100 så att den är mest prioriterad, och sedan kommer de övriga in därefter. En nod från Annas heap: Värde Importera Annas projekt från given_files, och hjälp henne med programmet enligt nedan. a) Implementera färdigt Annas size-metod, så att den räknar antal element i heapen. Den ska implementeras iterativt! (3p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.) b) Det vore smidigt om Anna kunde ändra sin bok-klass så att den kan lagra godtycklig data istället för bara en sträng. Då kan hon göra en datastruktur där hon t.ex. lagrar saker som bokens titel, författare och årtal. Uppdatera all relevant kod så att del b fungerar som den ska. Var noga med att eliminera alla varningar som dyker upp när du gör konverteringen! (2p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.) c) Implementera färdigt Annas depth-metod, så att den räknar ut djupet av heapen. Den ska implementeras rekursivt! Kom ihåg att rotnoden, om den finns, är på djup 0. (3p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter.)
Facit Tentamen TDDC30 2015-08-28 kl 08-12 6 (6) 6. (10p) Trädets två aspekter Stefan har knackat ihop ett binärt sökträd, eller åtminstone skelettet till vad som ska bli ett binärt sökträd. Det finns dock mer att göra, och det är där ni kommer in i bilden. En nod från Stefans binära träd: Värde Importera Stefans projekt från given_files, och hjälp honom med programmet enligt nedan. a) Ett binärt sökträd måste ha en add-metod. Stefan har förberett hur metoden ska se ut, men det är upp till er att implementera den. (8p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter, men kan vara svår att testa utan den övriga funktionaliteten.) b) För att kontrollera add-metoden vore en printinorder-metod på sin plats. Stefan har förberett även den. Ni får implementera den på valfritt vis, så länge den bygger på strukturen i det binära sökträdet. (2p) (Denna deluppgift kan lösas oberoende från övriga deluppgifter, men kan vara svår att testa utan den övriga funktionaliteten.)