Tentamen TEN1 HI1029 2014-05-22 Skrivtid: 8.15-13.00 Hjälpmedel: Referensblad (utdelas), papper (tomma), penna Logga in med tentamenskontot ni får av skrivvakten. Det kommer att ta tid att logga in ha tålamod! Logga inte ut förrän ni är klara med hela tentan. Svaren på uppgifterna ska vara program bestående av filer som ligger i kataloger: uppgift1, uppgift2,, uppgift5 som i sin tur ligger direkt under H:. Även om ni inte löser hela uppgiften så kan ni få delpoäng men ni måste se till att koden kompilerar och kan köras. Både output och koden bedöms och det är viktigt att denna är välskriven och uppfyller uppgiftens instruktioner. Välj bra variabelnamn och struktur men lägg inte så stor vikt vid kommentarer. Kom ihåg ert tentamenskonto. Resultaten kommer att presenteras kopplade till dessa! Tentamen består av 5 uppgifter. Filer som behövs för att lösa uppgifterna hittar ni i W:\PROV\AoD\ Java API hittar ni i W:\PROV\Java\api\index.html Betygsgränser (Max 15p): 7p Fx, 8p E, 9p D, 10p C, 11p B, 12 A Examinator och rättande lärare: Nicklas Brandefelt
1. I den här uppgiften utgår vi ifrån vårt binära sökträd från föreläsningen. Utgå ifrån filerna i W:\AoD\Uppgift3. Ändra inget i befintliga metoder utan skriv endast egna. a) Skriv en rekursiv metod som beräknar och returnerar antalet noder i det binära sökträdet. Troligen använder du en wrapper-metod som i sin tur anropar den metod som sedan anropar sig själv rekursivt. Du får inte använda medlemsvariabler. (2p) b) Skriv en rekursiv metod som beräknar och returnerar det binära sökträdets höjd. Troligen använder du en wrapper-metod som i sin tur anropar den metod som sedan anropar sig själv rekursivt. Du får inte använda medlemsvariabler. (1p) 2. Implementera en lista för Object med hjälp av en array som inre datastruktur. Kalla klassen för List. Du får inte använda några andra datastrukturer än en vanlig array från java s API. Med hjälp av konstruktorn ska man kunna sätta storleken som ska vara fix. Implementera metoderna size(), get(index) och add(index, object). Listan ska följa normala konventioner för en lista med nedanstående specifikationer. get(index) Index 0 motsvarar första elementet. Anropar man get med ett index mindre än noll eller om listan är tom skall get returnera null. Anropar man get med ett index större än högsta index ska get returnera elementet med störst index. add(index, object) Försöker man lägga till ett element i en full lista eller på ett index mindre än noll skall add lämna listan orörd och returnera false. Annars skall add infoga elementet på rätt plats och returnera true. Om index är ett värde högre än listans högsta index skall elementet infogas efter sista elementet. I W:\AoD\Uppgift2 hittar du ett skal som bör gå att köra med din lista. (3p)
3. I denna uppgift skall du implementera en egen Hash-tabell med öppen adressering för lagring av strängar. Du skall använda en array för lagring av strängarna och får inte använda någon mera avancerad datastruktur från java s api. I en hash-tabell lagras elementen på det index som elementets hash-kod ger. Om platsen där ett element skall lagras redan är upptagen så ökas index med ett (öppen adressering). På motsvarande sätt när vi letar efter ett element så måste vi ta hänsyn till att om platsen inte är tom kan elementet ligga längre ned i arrayen. Den förenklade hash-tabellen vi här ska implementera behöver inte kunna växa dynamiskt utan storleken sätts vi skapandet. Den skall ha endast två metoder: put(string s) och exist(string s). Metoden put placerar strängen på rätt plats i vår array med hjälp av java s inbyggda hashkod för strängar. Metoden exist returnerar true om strängen redan finns i vår hash-tabell och false om den inte finns. Ingen av metoderna behöver hantera problematiken vi får om tabellen är full. Däremot skall de hantera att vi kan behöva öka index flera gånger för att hitta en tom plats och ibland då kommer till arrayens sista plats och måste börja leta i början. Observera att vår hashtabell skall använda det effektiva sätt att sätta in i och hitta i en hashtabell som om man undviker krockar ger O(1). I W:\AoD\Uppgift3 hittar du ett skal som bör gå att köra med din hashtabell. (3p)
4. I den här uppgiften ska man börja på ovansidan och ta sig till undersidan. Man får börja på vilken ruta på ovansidan man vill och man får ta vilken väg man vill. Man får inte gå diagonalt. Skriv en algoritm som hittar den väg som ger minst summa om man summerar värdet på alla rutor man passerar. Negativa värden kan ej förekomma i rutorna. Ex: 2 6 8 0 5 4 7 9 3 6 8 1 5 8 3 7 4 5 7 8 1 2 7 8 4 5 2 8 9 6 1 2 5 9 6 5 6 1 1 2 7 1 4 6 4 7 8 9 8 8 6 8 1 7 1 2 1 5 6 7 5 6 7 7 5 7 7 2 8 9 6 7 9 5 5 9 7 9 6 8 8 8 1 8 6 8 9 8 6 8 I exemplet ovan är vägen man ska hitta: 2 6 8 0 5 4 7 9 3 6 8 1 5 8 3 7 4 5 7 8 1 2 7 8 4 5 2 8 9 6 1 2 5 9 6 5 6 1 1 2 7 1 4 6 4 7 8 9 8 8 6 8 1 7 1 2 1 5 6 7 5 6 7 7 5 7 7 2 8 9 6 7 9 5 5 9 7 9 6 8 8 8 1 8 6 8 9 8 6 8 Algoritmen ska naturligvis klara andra matriser också. Skriv en metod som tar en matris som in-parameter och returnerar värdet för den billigaste vägen (i exemplet ovan 16). Utgå från skalet som du hittar i W:\AoD\Uppgift4. Du får om du vill använda medlemsvariabler och behöver inte skapa några klasser. (3p)
5. I ett Sudoku ska man fylla i siffrorna 1-9 på de tomma platserna. Så att varje siffra förekommer endast en gång i varje rad, kolumn och 3*3 ruta. Skriv en metod som tar en 2D-array med vissa siffror ifyllda och nollor på de platser som är tomma och fyller i de tomma rutorna med siffror så att de uppfyller reglerna ovan. Utgå från skalet som du hittar i W:\AoD\Uppgift5. För full poäng skall du använda backtracking eller en algoritm med liknande effektivitet. (3p)