TDDC30/725G63 Objektorienterad programmering i Java

Tentamen i ...
TDDC30/725G63
Objektorienterad programmering i Java, datastrukturer och
algoritmer
Datum
2011-12-19
Tid
14-18
Provkod
DAT1
Institution
Institutionen för Datavetenskap (IDA)
Jour
Johan Janzén tel. 282490
Kursadministratör
Helene Meisinger
Antal uppgifter
8
Maximalt antal poäng
39
Preliminära betygsgränser
U: 0-19 poäng 3: 20-27 poäng 4: 28-32 poäng 5: 33-39 poäng
Anvisningar:
• Omotiverade svar ger noll poäng!
•
Tentamen består av två delar: en teoretisk och en praktisk.
◦ Den teoretiska delen löses med papper och penna som en traditionell tentamen och lämnas in
till tentavakt när du avslutar tentan
◦ Börja varje uppgift på nytt papper
◦ skriv namn och personnummer på varje inlämnat blad
◦ Den praktiska delen löses på datorn anvisad vid tentamenstillfället. Efter tentamen lämnas alla
filer som ska examineras kvar på kontot
•
Frågor angående tentan kan ställas via “studentklienten”. Notera dock att detta inte är en
grundkurs i programmering, somliga saker förväntas du kunna.
Teoretisk del
Denna del ska lösas med penna och papper. Vid tentamens slut lämnas denna del in till
tentamensvakterna. Glöm inte att motivera dina svar!
Uppgift 1 (3p)
Ge ett kort svar på följande frågor:
a)
b)
c)
d)
e)
f)
Vad är skillnaden mellan en abstrakt datatyp och dess implementation?
Vad innebär det att en algoritm har rumskomplexiteten O(n)?
Vad är skillnaden mellan ett perfekt och ett fullständigt binärt träd?
Quicksort är en icke-stabil sorteringsalgoritm. Vad innebär det?
Förklara mycket kort termen överskuggning
Program skrivna i Java anses vara plattformsoberoende. Varför då?
Uppgift 2 (4p)
a) Sätt in nedanstående sekvens tal i ett binärt sökträd. Rita upp det färdiga trädet (2p)
b) Traversera igenom trädet postorder och levelorder. Skriv ut nodens siffra vid besök (1p)
c) Nämn två saker som visar att detta träd inte är en heap (1p)
27 39 54 83 15 17 32 16 22
Uppgift 3 (3p)
Du visar upp din implementation av en sorteringsalgoritm (Mergesort) för en bekant och berättar att den
är optimal. Hon visar i sin tur upp sin lösning.
Ni jämför era program genom att sortera olika stora mängder tal och inser snart att din bekantas lösning
alltid är ungefär dubbelt så snabb.
Hon ser nöjd ut och anser att att din lösning ju inte alls var optimal, hennes var ju bättre.
Har hon rätt? Använd vad du lärt dig om algoritmanalys och förklara för din bekanta.
Uppgift 4 (5p)
En riktigt gammal dator ska sortera en stor mängd tal som är sparade sekventiellt på ett magnetiskt band.
På grund av bandets fysiska egenskaper går det snabbt att jämföra tal som är sparade nära varandra i
sekvensen, men mycket långsamt att jämföra tal som är sparade långt ifrån varandra (bandet måste spolas
fram/tillbaka).
Datorn har dessutom mycket begränsat arbetsminne. Den har bara plats för en extra temporär variabel.
a) Vad är den asymptotiska tidskomplexiteten för att jämföra och sedan byta plats på två tal på ett
band?
Uppge både bästa och värsta fall. (1p)
b) Nämn en sorteringsalgoritm som skulle vara olämplig för uppgiften. Motivera. (1p)
c) Vilken sorteringsalgoritm skulle du implementera för att utföra denna uppgift? Motivera (2p)
d) Vad är den asymptotiska tidskomplexiteten för att sortera talen på denna maskin med de två
algoritmerna i b och c? (1p)
Uppgift 5 (3p)
Sök fram det 4:e minsta elementet ur sekvensen av tal nedan genom att använda
quickselect. Välj det vänstra talet som pivot. Beskriv varje steg.
15 62 31 89 50 27 23 42 86
Uppgift 6 (5p)
Rita ett klassdiagram av följande beskrivning. Om du behöver göra några antaganden, skriv ned dessa.
En Bank består av ett antal Konton. Det finns tre typer av konton; Kreditkonto, Sparkonto och
Lönekonto. Varje konto är associerad till en eller två Personer. En person kan dock ha hur
många konton han/hon vill.
Man kan utföra samma tre operationer på dessa konton. Dessa är deposit(), withdraw() och
checkBalance(). deposit() och withdraw() implementeras dock olika för varje kontotyp, till
exempel utgår en avgift för varje uttag från sparkontot. De tre nämna operationerna är
säkerhetsskyddade (package private) och kan ändast kommas åt via en Bankomat. Varje
bankomat har en referens till varje konto. En person är associerad med sina konton, men är
dessutom beroende av en bankomat för att utföra sina bankärenden.
Alla konton sparar hur mycket pengar som finns på kontot. Denna siffra är dock att betrakta som
privat.
Sparkontot har även en inlåningsränta. Denna ränta är publik och är gemensam för alla
sparkonton.
Praktisk del
Följande uppgifter ska lösas på dator. Skapa ett nytt projekt för varje uppgift. Om det inte är uttryckligen
angivet annorlunda i uppgiften får du endast använda den del av Javas standardbibliotek som finns i
java.lang.
Om du inte kan lösa uppgiften, gör en lämplig förenkling och lös den istället. Skriv ned i källkoden
vilka förenklingar du gjort. Poäng ges efter hur pass nära din lösning är att lösa den givna uppgiften.
Även icke fungerande kod kan ge poäng om den visar på viss förståelse.
Uppgift 7 (7p)
Du har i denna uppgift tillåtelse att använda klassen java.util.LinkedList från standardbiblioteket.
Lilla Emma skriver på sin önskelista inför julen. Hon inser när hon är klar att hon nog inte kan få allt
hon skrivit upp. Det gäller att prioritera...
a) Definiera ett gränssnitt PriorityQueue som innehåller metoderna add(int priority, String
element), removeMin(), size() och empty(). Implementera sedan gränssnittet i en klass med en
osorterad länkad lista som datastruktur. Du får, om du vill, skapa hjälpklasser.(3p)
b) Definiera ett nytt gränssnitt Queue, som innehåller följande metoder:
enqueue(String element), dequeue(), size() och empty(). Modifiera din klass från a) så att den
implementerar även detta gränssnitt.(2p)
c) Skriv ett litet huvudprogram som demonstrerar att din klass fungerar. Visa med datatyper att
din klass kan vara både en prioritetskö och en kö. (2p)
Uppgift 8 (10p)
Du har i denna uppgift tillåtelse att använda lämplig del av javas standardbibliotek för att slumpa fram
tal.
Gustav från Skåne har ont om granar i sin närhet. För julefridens skull försöker han beställa ett träd
från Kina (på postorder såklart). Som alla vet är allting upp och ned på andra sidan jorden så trädet han
beställde blev naturligtvis felvänt, med roten högst upp.
Så kan vi inte ha det, proklamerade Gustav.
a) Implementera ett generiskt binärt sökträd med nodstruktur.
Implementerna metoderna insert(E element) och removeRoot() för trädet. (5p)
Gustav har en plan. Han ska klippa ned grenarna en efter en och lägga dem på hög.
Hans plan är att sedan limma fast dem i omvänd ordning. Gustav gör sig redo genom att förbereda en
plats för sin hög.
b) Implementera en generisk stack med metoderna push(E element), pop() och size(). Du får
välja vilken intern representation stacken ska ha. (3p)
Tyvärr är det långt till Skåne från Kina, barren har torkat och faller av
trädet i en stor hög på golvet framför (stackars ...) Gustav.
c) Skriv ett program som simulerar skeendet ovan:
1. Skapa en klass som representerar ett barr. Ett barr har ett enda attribut, dess längd, som
vid instantieringen SLUMPAS till ett tal mellan 0.52 och 3.1 inklusivt.
2. Lägg in 500 barr i ditt sökträd. Noderna ska sorteras efter barrens längd.
3. Flytta alla barr från sökträdet till en stack m h a removeRoot() och push() .
4. Avsluta med att låta programmet skriva ut hur många barr som finns i stacken (m h a
size()).
(2p)
Epilog: Gustav är nöjd ändå. Allt som behövs till jul är ju gott sällskap. Och
en kopp java, förstås.
Lycka till!