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!