Facit Tentamen TDDC30 2015-03-19 kl 08-12 1 (6) Teoretisk del 1. (6p) "Snabba frågor" Alla svar motiveras väl. a) Varför väljer man ofta synligheten private hellre än public för medlemsvariabler i en klass? (1p) Svar:Genom att dölja undan medlemsvariabler med private så kan den som använder objekt av den här klassen inte komma åt de här variablerna längre. De kan nu bara ändras av klassens egna metoder, och det här innebär att programmeraren som skriver klassen fritt kan ställa krav och förväntningar på de här medlemsvariablernas innehåll, eftersom det bara är klassen själv som kan läsa och ändra dessa. Det finns då ingen risk för störningar utifrån i de här medlemsvariablerna. b) Vad är syftet med undantag/exceptions? (1p) Svar:Att kunna signalera när något har gått fel och vad som har gått fel, samt kunna bolla vidare ansvaret till rätt nivå av programmet, dvs. rätt nivå i metodanropskedjan. c) Vad innebär det att en metod är abstract? (1p) Svar:Att en metod med exakt det utseendet ska finnas, och måste definieras i någon underklass till klassen ifråga. Själva koden för metoden, hur den är implementerad, kan inte anges i den abstrakta definitionen, och det är den delen som definieras i en underklass för att göra klassen komplett. Om Animal har den abstrakta metoden abstract void introduceyourself();, så måste t.ex. underklassen Cat definiera en void introduceyourself() {-metod, komplett med implementation, för att vara en komplett klass som går att instantiera objekt från. d) I Animal myanimal = new Animal() sker två separata saker. Vad innebär Animal myanimal och vad innebär new Animal()? (1p) 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. e) Vad innebär det att abstrahera i ett programmeringsperspektiv? (1p) Svar:Att abstrahera innebär att man bortser från vissa detaljer för att istället fokusera på det övergripande, det som är viktigt. Målet är att få en bättre överblick utan att bli distraherad av oviktiga detaljer. Ett exempel är ADT'er, där man bortser från implementationsdetaljer och bara fokuserar på de operationer och den övergripande datastrukturen som ADT'n representerar. f) Varför kan man inte anse att en viss sorteringsalgoritm är 'bäst'? (1p) Svar:Vilken sorteringsalgoritm som är bäst lämpad beror ofta på situationen. Exempelvis kan en shakersort vara mer effektiv än en shellsort om man sorterar data lagrad på en bandstation, där söktiden mellan olika index är större ju större avståndet mellan de index som söks mellan är.
Facit Tentamen TDDC30 2015-03-19 kl 08-12 2 (6) 2. (6p) "Datastrukturer" a) Värdena 2 8 9 4 6 1 3 5 7 ligger i en fullständig maxheap. Rita upp hur heapen ser ut och hur värdena ligger i den. (2p) Svar:Obs: Det finns andra korrekta svar. 9 58 57 6 5 4 3 2 1 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 4 1 3 6 5 8 Svar:Obs: Det finns andra korrekta svar. 4 51 56 3 5 8 2 7 9 c) Ange i vilken ordning noderna i trädet från b) besöks av en preorder-, postorder-, levelorderoch inorder-traversering. (2p) Svar:Preorder-traversering: 9 2 4 6 7 1 3 5 8 Postorder-traversering: 6 4 2 1 5 8 3 7 9 Levelorder-traversering: 9 2 7 4 1 3 6 5 8 Inorder-traversering: 2 6 4 9 1 7 5 3 8
Facit Tentamen TDDC30 2015-03-19 kl 08-12 3 (6) 3. (6p) "Tidskomplexitet" a) Rangordna tillväxten, från långsammast tillväxt(bäst) till snabbast tillväxt(sämst), hos tidskomplexiteterna O(1), O(n ⁵ ), O(nlog(n)), O(5n), O(8n²), O(n), O(2). (2p) Svar:O(1), O(2), O(n), O(5n), O(nlog(n)), O(8n²), O(n ⁵) b) Ange tidskomplexiteten i värsta fallet, med avseende på n, för följande metoder. (n är alltid ett positivt heltal.) (2p) int zap(int n) { return n*n; int count(int n) { int sum = 0; if (n > 5) { for (int i = 0; i < n; ++i) { sum += zap(i); else { sum = zap(n); return sum; void bip(int n) { for (int i = 0; i < 5; i = i+1) { System.out.println(n); Svar:zap) O(1) count) O(n) bip) O(1) c) Förenkla följande tre uttryck för tidskomplexitet: (2p) Svar: 1) O(5n² + n + 10) O(7n) => O(n³) 2) O(25n) O(25log(n)) => O(nlog(n)) 3) O(2n) + O(3n) => O(n)
Facit Tentamen TDDC30 2015-03-19 kl 08-12 4 (6) 4. (6p) "Algoritmer" a) Sortera värdena [ 7 2 1 2 4 6 5 ] med bubblesort. 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:[ 7 2 1 2 4 6 5 ] [ 7 2 1 2 4 5 6 ] [ 7 1 2 2 4 5 6 ] [ 1 7 2 2 4 5 6 ] [ 1 2 7 2 4 5 6 ] [ 1 2 2 7 4 5 6 ] [ 1 2 2 4 7 5 6 ] [ 1 2 2 4 5 7 6 ] [ 1 2 2 4 5 6 7 ] b) Sortera värdena [ 3 4 9 1 7 8 6 2 5 ] med quicksort. 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. Välj alltid det högraste värdet inom intervallet som pivot-element. (2p) Svar:[ 3 4 9 1 7 8 6 2 5 ] [ 3 4 2 1 7 8 6 9 5 ] [ 3 4 2 1 5 8 6 9 7 ] [ 1 4 2 3 5 8 6 9 7 ] [ 1 2 4 3 5 8 6 9 7 ] [ 1 2 3 4 5 8 6 9 7 ] [ 1 2 3 4 5 6 8 9 7 ] [ 1 2 3 4 5 6 7 9 8 ] [ 1 2 3 4 5 6 7 9 8 ] c) Vad innebär det att en sorteringsalgoritm är stabil? Illustrera med ett exempel på en sorteringsalgoritm som kan implementeras stabil, och ett på en som inte kan implementeras stabil, med förklaring om varför dessa kan/inte kan implementeras stabila. (2p) Svar:Att en sorteringsalgoritm är stabil innebär att den inte byter inbördes ordning mellan två värden av samma storlek under sorteringens gång. Bubblesort Kan implementeras stabil. Se svaret till 4a ovan, hur den andra 2'an inte kan byta inbördes ordning med den första 2'an om sorteringen stannar redan vid lika värden. Quicksort Kan ej implementeras stabil. Ett exempel likt det i 4b ovan: [ 3 4 2 1 7 5 6 5 5 ] Här byter den sista 5'an inbördes ordning med övriga 5'or.
Facit Tentamen TDDC30 2015-03-19 kl 08-12 5 (6) Praktisk del 5. (8p) Att räkna löv Anna arbetar med ett binärt sökträd, och har kommit så långt att hon har de flesta metoderna, bland annat add(..) och size(..). Det finns dock mer att göra och Anna har inte riktigt tid att ta tag i allt just nu, så hon har lejt in er i ett par timmar. En nod från Annas binära träd: Värde Importera Annas projekt från given_files, och hjälp henne med programmet enligt nedan. a) För att kontrollera sin implementation vill Anna lägga till en getleaves-metod, som helt enkelt returnerar en lista på alla löv i trädet, i godtycklig ordning men utan dubletter. Hjälp Anna genom att skriva klart leaves-metoden enligt dess dokumentation i koden. (6p) b) Obs: Har du har bonus på labb 3 och 4 tillgodoräknas du deluppgift 5b och 6b. Anna vill att hennes färdiga träd följer ett gränssnitt. Hon har redan skrivit gränssnittet i filen AnnasTreeInterface, men hennes kod använder inte gränssnittet än, och måste nog anpassas lite för att göra det. Uppdatera Annas träd så att det använder gränssnittet. (2p)
Facit Tentamen TDDC30 2015-03-19 kl 08-12 6 (6) 6. (10p) Den öde ön Stefan har blivit inspirerad av alla rika kändisar som på senare tid köpt sig sina egna privata öar. Det vore allt bra kul att äga sin egen öde ö, nånstans att relaxa på beachen med lite kokosnötter och sol. Problemet är bara att en öde ö är ganska dyr, 3.2 miljoner för den ö Stefan har ögonen på, så det vill till att Stefan börjar spara redan nu. Stefan antar att han kan investera sina besparingar på börsen för 7% avkastning i medel, och för att förenkla det hela antar han också att han måste skatta 0.27% på det totala beloppet och kompensera för en inflation på 1%, alla dessa per år. För att kunna experimentera med olika sparbelopp så börjar Stefan knappa på en liten dator-simulation i Java. Han tänker använda en dubbellänkad lista för att lagra beloppen han sparar samt den avkastning han får, och köra på med sin simulation tills han sparat ihop till sin ö! Importera Stefans projekt från given_files, och hjälp honom med programmet enligt nedan. a) Stefan vet ungefär hur strukturen kommer se ut, varje nod kommer ha en referens till föregående och nästa nod, och om inga sådana finns blir dessa referenser null. Listan kommer också hålla reda på vilken nod som ligger först och sist. Dock har han inte riktigt hunnit skriva klart addfirst(...) och addlast(...)-metoderna. Hjälp honom skriva klart dessa så att de bygger en korrekt dubbellänkad lista. (6p) b) Obs: Har du har bonus på labb 3 och 4 tillgodoräknas du deluppgift 5b och 6b. Den här koden blir nog bra, fast Stefan inser att det vore bra om han kunde vara lite mer konsekvent i sin kodstruktur. För att åstadkomma detta så skriver han ihop UML-diagrammen nedan, som representerar hur han helst skulle vilja att hans dubbellänkade lista samt nod såg ut. Konvertera Stefans dubbellänkade lista så att den följer UML-diagrammen till punkt och pricka. (4p) DoublyLinkedList - Node first - Node last + void addfirst(...) + void addlast(...) + int size() + boolean isempty() + double sum() Node - double data ~ Node next ~ Node prev # Node(...) + double getdata() + Node getnext() + Node getprev()