Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects.

Relevanta dokument
Övningsuppgifter. Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects.

Tentamen TEN1 HI

Tentamen TEN1 HI

Tentamen TEN1 HI

Föreläsning 13. Dynamisk programmering

Föreläsning 12. Söndra och härska

Föreläsning 9. Sortering

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 11. Giriga algoritmer

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Föreläsning 7. Träd och binära sökträd

Föreläsning 3. Stack

Föreläsning 5. Rekursion

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Tentamen Datastrukturer för D2 DAT 035

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen Datastrukturer (DAT037)

Föreläsning 6. Rekursion och backtracking

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Föreläsning 7. Träd och binära sökträd

Tentamen i Algoritmer & Datastrukturer i Java

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 2. Länkad lista och iterator

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Tentamen, Algoritmer och datastrukturer

Föreläsning 9 Innehåll

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Teoretisk del. Facit Tentamen TDDC (6)

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036)

TDDC30/725G63. Objektorienterad programmering i Java, datastrukturer och algoritmer

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 4 Datastrukturer (DAT037)

Tentamen Datastrukturer, DAT037 (DAT036)

Lösningar Datastrukturer TDA

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 9 Innehåll

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 12. Söndra och härska

Fredag 10 juni 2016 kl 8 12

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Föreläsning 14 Innehåll

Föreläsning 8. Mängd, Avbildning, Hashtabell

Tentamen Datastrukturer (DAT036)

TDDC30/725G63. Objektorienterad programmering i Java, datastrukturer och algoritmer

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Algoritmer och datastrukturer. HI1029 8,0 hp Föreläsning 1

Föreläsning 11. Giriga algoritmer

Ett generellt träd är. Antingen det tomma trädet, eller en rekursiv struktur: rot /. \ /... \ t1... tn

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Seminarium 13 Innehåll

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Algoritmer och datastrukturer. HI1029 8,0 hp Föreläsning 1

Tentamen kl Uppgift 4. Uppgift 5

DAI2 (TIDAL) + I2 (TKIEK)

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

Föreläsning 9 Datastrukturer (DAT037)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Föreläsning 10. Grafer, Dijkstra och Prim

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Föreläsning 2. Länkad lista och iterator

Rekursion och induktion för algoritmkonstruktion

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning Datastrukturer (DAT037)

Föreläsning 5. Rekursion

Algoritmer och datastrukturer 2012, fo rela sning 8

Föreläsning 6. Rekursion och backtracking

Tildatenta Lösningsskiss

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

Datastrukturer. föreläsning 6. Maps 1

Föreläsning 13 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

Datastrukturer. föreläsning 10. Maps 1

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 11. ADT:er och datastrukturer

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Exempeltenta GruDat 2002/2003

Länkade strukturer, parametriserade typer och undantag

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Föreläsning 13 Innehåll

Transkript:

Övningsuppgifter Till varje föreläsning hör ett antal uppgifter. Förutom dessa bör man programmera när man går igenom föreläsningarna och när man läser boken. Vissa uppgifter kommer från gamla tentor. Dessa är med för att du ska få en bra bild av vad du förväntas kunna lösa självständigt när kursen är klar och på tentan. Dessa kan du också hitta lösningar på vid respektive tentamen på respektive års sida på kth-social. Där hittar du också eventuella hjälpfiler man fick tillgång till på tentan. Gör du inte de flesta av övningsuppgifterna kommer du med största sannolikhet inte att klara tentan. Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects. För den som läser en kurs baklänges, dvs genom att först se vad som examineras och sedan studera utifrån detta har jag sammanställt hur tentamensuppgifterna har fördelat sig på de fyra tentamen som gått VT14 och VT15: F1: 1, F2: 1, F3: 1, F4: 1, F5: 8, F6: 3, F7: 3, F8: 1, F9: 3, F10: 1, F11: 1, F12: 2, F13: 2 Som man kan se så har det kommit uppgifter på alla områden. Värt att notera är att hela 11 uppgifter berört rekursion. Notera också att de två sista avsnitten tillsammans har fått fyra frågor. Det beror bland annat på att de inte testats av momentet LAB.

Föreläsning 1 Avsnitt 2.1: SC 1, P 2.1, 2.2 Avsnitt 2.2: NB 1 På sidan 70 i KW diskuteras en Phone Directory applikation. Där diskuteras hur man kan använda indexof för att hitta telefonnumret till ett visst namn. På KTH-social kan du hitta ett Phone Directory projekt där man först får lägga in namn och telefonnummer och sedan kan söka upp telefonnummer. Det enda som saknas är metoden equals i DirectoryEntry-klassen. Lägg till denna så att applikationen fungerar. Avsnitt 2.3: SC 1 NB 2 När vi använder de färdiga klasserna för lista för att lagra t.ex. heltal tappar vi lite i effektivitet. Om detta är viktigt får man skapa en egen lista specifikt för heltal. Skapa en klass IntList som implementerar en lista som lagrar heltal mha en array. Den skall alltså inte använda någon av klasserna i JCF utan endast en array. Den ska implementera metoderna: IntList(int initialcapacity) add(int element) add(int index, int element) get(int index) indexof(int element) remove(int index) set(int index, int element) size() och kommer precis som vår lista behöva en del hjälpmetoder såsom reallocate. Skriv också en kort main-klass som testar alla metoder. Avsnitt 2.4: SC 1, 2, 3

TEN1 140522 Uppgift 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)

Föreläsning 2 Avsnitt 2.5: SC 1 NB 3 I den här uppgiften ska du träna på att programmera en länkad lista. Skapa en klass Node: public class Node{ } public String data; public Node next; Skriv en main-klass där du direkt i main utan hjälp av funktioner skriver kod som skapar en länkad lista med datat: Gilgamesh -> löper -> på -> stäppen mha klassen Node. Skriv sedan en whileloop som går igenom listan och skriver ut innehållet i denna till standard out. Avsluta med att lägga till kod som tar bort på innan listan skrivs ut. Fortsätt gärna att leka med din ihopsatta lista. Gör två listor och sätt ihop dem. Klipp av listan halvvägs. Skriv ut listan med en while-loop för att se att resultatet blev som du tänkt dig. Testas av TEN1 150317 Uppgift 1 se föreläsning 5

Föreläsning 3 Avsnitt 3.1: SC 1, 2, 3 NB 4 På sid 156 börjar ett Case där man skall kontrollera att parenteser är balanserade i ett uttryck. Läs igenom Problem, analys och Design avsnitten och gör sedan en egen implementation. Titta på bokens lösning om du kör fast men försök att klara dig utan att titta. NB 5 Implementera en stack med en ArrayList som inre datastruktur (ärv inte). Klassen skall implementera interfacet från föreläsningen. Skriv också en main som testar att klassens alla funktioner verkar fungera. NB 6 Lägg till funktionen size(), peek(n) och flush() till ArrayStack från föreläsningen. size() returnerar antal element på stacken peek(n) returnerar det n:te elementet på stacken utan att påverka stacken flush() som tömmer stacken och returnerar det sista elementet på stacken Skriv också en main som testar funktionerna. OBS att peek(n) ej bör finnas i en stack då den bryter mot en stacks interface. Den är här med endast som övning. NB 7 Lägg till funktionen size(), peek(n), och flush() till LinkedStack från föreläsningen. size() returnerar antal element på stacken peek(n) returnerar det n:te elementet på stacken utan att påverka stacken flush() som tömmer stacken och returnerar det sista elementet på stacken Skriv också en main som testar funktionerna. OBS att peek(n) ej bör finnas i en stack då den bryter mot en stacks interface. Den är här med endast som övning. Avsnitt 3.4: Case Study: Infix to postfix (sid 176) Converting expressions with parenthesis (sid 185) Chapter Review: PP 7

TEN1 150612 Uppgift 2 Implementera en stack för data av typen char med hjälp av en enkellänkad lista som inre datastruktur. Du får inte använda någon datastruktur från Java s API (du får naturligtvis skapa klasser). Den ska förutom konstruktorn endast ha två publika metoderna pop och push som ska utföra det man förväntar sig att dessa metoder gör på en stack. Om man använder pop på en tom stack skall pop returnera 0. Skriv nu ett program som använder din stack för kontrollera om ett inläst ord från användaren är ett palindrom (ett ord som blir samma ord om det läses baklänges, tex: naturrutan). Du kan utgå ifrån att ordet skrivs med endast små bokstäver och utan blanksteg. Utgå ifrån skalet som finns i W:\AoD\Uppgift2. (4p)

Föreläsning 4 Från och med föreläsning 4 listar jag oftast inte uppgifter I boken utan du behöver själv ta ansvar för att göra bra uppgifter från boken. NB 8 I en applikation där kön någon enstaka gång växer sig mycket större än normalt skulle det kunna vara intressant att en array-kö också kan krympa när så är möjligt. Utgå från vår kö på föreläsningen och lägg funktionalitet som halverar storleken på arrayen om den bara använder en fjärdedel av den nuvarande arrayen. Glöm inte att skriva testkod. Fundera också på om detta påverkar någon av operationerna så att de inte längre är O(1). NB 9 Implementera en kö med en enkellänkad lista med en pekare till varje ända av listan så att alla operationer blir O(1). Använd bara bokens exempel om du kör fast. NB 10 Implementera en Dequeue som en dubbellänkad lista. En dequeue är en kö där man kan sätta in och ta bort element i båda ändar. Den behöver inte implementera något interface och ska endast ha följande operationer: pollfirst, polllast, offerfirst, offerlast och empty. Se avsnitt 4.4 om du undrar över vad de ska göra. Skriv också testkod. TEN1 140314 Uppgift 2 Implementera en kö för strängar med hjälp av en array som inre datastruktur. Använd arrayen som en cirkulär array för att få en effektiv implementering. Kalla klassen för Queue. Med hjälp av konstruktorn ska man kunna sätta storleken som ska vara fix. Den skall endast ha två publika metoder: enqueue (för att köa) och dequeue (för att avköa). Försöker man köa en sträng i en full kö ska den returnera false annars true. Försöker man avköa en tom kö ska den returnera en tom sträng ( ). I W:\AoD\Uppgift2 hittar du ett skal som bör gå att köra med din kö. (3p)

Föreläsning 5 NB 11 Skriv en rekursiv static metod som hittar största värdet i en array av ints. NB12 Skriv en rekursiv static metod som beräknar x n där n är ett positivt heltal. Skriv en iterativ metod som löser samma uppgift. NB13 Skriv en metod som beräknar roten ur ett tal större eller lika med 1 med tre decimalers noggrannhet med hjälp av den rekursiva algoritmen nedan. e styr noggrannheten och a kan sättas till 1 initialt. a om a ROT( n, a, e) 2 a n ROT( n,, e) 2a 2 n e annars NB 14 Myntmaskinen En maskin har en display på vilken den visar uppnådd poäng. Från början visar displayen 1 poäng. Genom att stoppa mynt i maskinen kan poängen förändras: Genom en 10-öring multipliceras poängen på displayen med 3 Genom en 5-öring adderas 4 till poängen på displayen. Skriv ett program som tar emot den poäng som ska uppnås. Programmet ska sedan beräkna lägsta belopp som krävs för att uppnå poängen. Observera att man inte kan nå målet för alla slutpoäng. En exempelkörning: Vilken poäng ska uppnås: 109 Poängen kan nås med 45 öre Tips: Försök inte lösa uppgiften baklänges för det är svårare. Räkna istället upp poängen mot det givna målet. NB 15 Skriv en rekursiv statisk metod som tar en textsträng med ett tal i binär form och returnerar motsvarande heltal. Använd en wrapper-metod om det behövs. Exempel: 1011 ska returnera 11. Skriv också en metod som tar en int och returnerar en sträng med det binära talet. Även här behöver du antagligen en wrapper-metod.

TEN1 140522 Uppgift 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 inparameter 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) TEN1 150317 Uppgift 1 I den här uppgiften utgår vi ifrån vår enkellänkade lista från föreläsningen (något nedbantad). Använd filerna i W:\AoD\Uppgift1. Glöm inte bort specialfallet att vi har en tom lista när du programmerar. a) Skriv om tostring-metoden så att den utför samma uppdrag som nu (att skriva ut listans alla element i rätt ordning) med hjälp av rekursion istället för iteration. Du får använda en wrappermetod men inga medlemsvariabler utöver de som redan finns (head och size). (1p) b) Skriv om getnode-metoden så att den utför samma uppdrag som nu med hjälp av rekursion istället för iteration. Du får använda en wrappermetod men ändra hellre i anropet till metoden. Denna metod är ju privat. (1p) c) Ibland om det är viktigt att en lista tar minsta möjliga plats kan det vara bättre att klara sig utan medlemsvariabeln size. Ta bort medlemsvariabeln size och introducera inga nya medlemsvariabler. Ändra befintliga metoder så att de fungerar precis som innan men nu utan medlemsvariablen size. Spara de gamla funktionerna bortkommenterade ifall du inte lyckas med denna uppgift. (1p)

TEN1 150612 Uppgift 1 a) I den här uppgiften skall du skriva en statisk metod som tar en array av heltal och ett sökt heltal och returnerar index för den plats där det sökta heltalet finns om det finns och returnerar -1 om det sökta talet saknas. Om det sökta talet finns på flera platser i arrayen returnerar metoden index för en av dessa platser. Det spelar ingen roll vilken. Algoritmen skall vara rekursiv (du får använda hjälpmetoder). Använd filen i W:\AoD\Uppgift1. (1p) b) Skriv nu en ny metod som löser samma uppgift med samma resultat men utgår ifrån att arrayen är sorterad i stigande ordning och därmed kan göra en binär sökning för att effektivisera sökningen. Också denna metod ska använda en rekursiv algoritm (och får använda hjälpmetoder). Effektiviteten bör bli O(log n). (2p) TEN1 150612 Uppgift 3 En plattsättare ska lägga en rad av plattor. Han har plattor som är 1 dm, 2 dm och 3 dm. Du ska här skriva en metod som utifrån hur lång raden ska vara beräknar hur många olika sätt han kan lägga raden på. Om han t.ex ska lägga en rad som ska vara 4 dm så finns det 7 olika sätt att lägga raden. Ett skal finns i W:\AoD\Uppgift4. (2p) Testas av TEN1 140314 Uppgift 3, TEN1 140522 Uppgift 1 se föreläsning 7 Testas av TEN1 140314 Uppgift 4 se föreläsning 9 Testas av TEN1 140314 Uppgift 1a se föreläsning 13

Föreläsning 6 NB 16 Skriv en ny lösning till myntmaskinen NB 14 som löser problemet med bredden först istället för djupet först. Varför är det egentligen inte nödvändigt för det här problemet? NB 17 Skriv om några funktioner till vår länkade lista så att de blir rekursiva. Hjälp finns i boken men försök själv. NB 18 Åtta damer Skriv ett program som löser åtta damer problemet och presenterar alla lösningar Skriv en ny version av programmet som löser n-damer problemet. Hur ställer man n damer på ett n*n bräde så att ingen står på samma rad, kolumn eller diagonal. Användaren ska få ange n och sedan få veta hur många lösningar det finns. Programmet ska inte skriva ut lösningarna. NB 19 I ett enkelt brickspel ligger svarta och vita brickor enligt fig 1. Målet är att få brickorna enligt fig 2. Tillåtna drag är att flytta en bricka ett steg till en tom ruta eller hoppa över en bricka till en tom ruta (fig 3). Skriv ett program som beräknar dragföljden för att lyckas på 15 drag och presenterar den såsom: 3->4, 5->3 osv NB 20 Lös hissproblemet med backtracking.

TEN1 140314 Uppgift 5 I följande pussel ska man få siffrorna i nummerordning genom att rotera de fyra i övre vänstra hörnet, övre högra hörnet, nedre vänstra hörnet eller nedre högra hörnet enligt bilden: Varje 2*2 ruta kan alltså roteras medurs eller moturs 90 grader. Ett drag består då av en sådan rotation. a) Skriv ett program som löser problemet för godtycklig startuppställning och berättar hur många drag som krävs. Programmet behöver alltså inte presentera dragen. Du får utgå ifrån att ingen startuppställning kräver mer är 9 drag (egentligen kräver en del uppställningar 11 drag). (2p) Exempel: 1,2,3,4,5,6,8,9,7 6 drag 1,2,3,4,5,6,9,8,7 7 drag b) Skriv en ny version (spara den gamla) som inte behöver veta antalet maximala drag genom att genomsöka möjligheterna med bredden först. Dvs den testar först alla möjliga första drag. Sedan testar den alla möjliga två drag och så vidare till den hittar lösningen. Den här lösningen kommer antagligen äta minne så du kan nöja dig med att testa den på exempel som löses på få drag. (1p) Exempel: 1,2,3,4,9,8,7,6,5 2 drag 1,2,3,4,5,7,6,9,8 4 drag

TEN1 140522 Uppgift 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)

TEN1 150317 Uppgift 2 I den här uppgiften gäller det att ta sig från toppen av en sifferpyramid till botten på ett sådant sätt att man passerat varje siffra precis en gång. I varje steg får man bara gå vänster eller höger på sin väg nedåt. För full poäng skall man använda sig av backtracking. Programmet skall presentera ordningen på de siffror man passerat på väg nedåt. Det skall klara en godtycklig triangel innehållande endast siffrorna 0-9 med tio nivåer. Om det finns flera lösningar räcker det att programmet hittar en lösning. Saknas lösning skall programmet ange det. I W:\AoD\Uppgift2 hittar ni ett skal med pyramiden nedan hårdkodad. För denna bör utskriften bli: 5, 1, 7, 8, 3, 6, 0, 9, 2, 4. (3p)

Föreläsning 7 Utgå från föreläsningens implementering av ett binärt sökträd när du löser nedanstående uppgifter. Skriv också testkod så att du vet att de fungerar korrekt. NB 21 Skriv en main som läser in sju ord från användaren och placerar dessa i ett BST. Kör programmet och skriv in 7 ord så att trädet får minsta möjliga höjd. Kör programmet och skriv in 7 ord så att trädet får maximal höjd. NB 22 Skriv funktioner som traverserar trädet med preorder och postorder. NB 23 Skriv två funktioner numberofleaves och numberofnodes till vår implementation från föreläsningen. Obs de ska bestämma antalet utifrån trädet och inte använda privata medlemsvariabler. TEN1 140314 Uppgift 3 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. a) Skriv en metod som returnerar största värdet lagrat i det binära sökträdet. Trädet får inte påverkas av metoden. (2p) b) Skriv en metod som returnerar antalet noder som har exakt två barn. Trädet får inte påverkas av metoden. (2p) TEN1 140522 Uppgift 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)

TEN1 150317 Uppgift 4 I denna uppgift utgår vi från vårt binära sökträd från föreläsningen i en nedbantad version. Använd filerna i W:\AoD\Uppgift4. Lös uppgifterna nedan utan att skapa nya medlemsvariabler. Du får gärna använda privata hjälpmetoder vid behov. Sökträdet får inte påverkas av anrop till metoderna du skapar enligt nedan. a) Skriv metoden find. För den som inte minns så ska den returnerar datat från den nod vars data är lika med parametern target enligt metoden target.compareto. Om datat saknas i trädet skall metoden returnera null. (2p) b) För att kunna studera att en implementation av ett binärt sökträd faktiskt fungerar korrekt kan det vara bra att kunna skriva ut hur trädet faktiskt ser ut. Skriv metoden printtree som skriver ut ett träd till standard ut. Den ska skriva ut trädet med en nivå per rad. För varje nivå skriver den ut barnen till alla noder som fanns i nivån ovanför även om dessa är tomma (då skriver den null). På så sätt kan man entydigt se strukturen hos trädet. Trädet man får om man adderar H, B, N, A, E, C, F, D i given ordning skrivs då ut: H B N A E null null null null C F null D null null null null (2p)

Föreläsning 8 NB 24 Skriv testkod för vår hashtabell från föreläsningen. Fundera på vad den behöver testa. Inspiration kan du hämta på sid 394 i boken. NB 25 Skriv en remove-metod till vår hashtabell från föreläsningen. NB 26 Skriv en tostring-metod till vår hashtabell. TEN1 140522 Uppgift 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)

Föreläsning 9 NB 27 Skapa en klass Car som innehåller bilmärke, årsmodell och antal körda mil. Klassen ska implementera Comparable<Car> och därmed ha en metod compareto som ska jämföra bilmärke som sträng mellan bilar. a) Skriv ett program som läser in bilar från en textfil till en array och sorterar dessa med hjälp av Java API utifrån metoden compareto. Skriv sedan ut dessa till en ny textfilen. b) Skapa nu en klass CompareCar som implementerar Comparator<Car> och använd denna för att sortera bilarna efter årsmodell istället. Skriv även ut denna ordning men till en annan fil. NB 28 Implementera urvalssortering och instickssortering för en array av int. NB 29 Implementera Mergesort för en array av int. Utgå från algoritmerna på föreläsningen. Använd inte kod från boken eller från nätet. NB 30 Implementera Shellsort och Heapsort för en array av int. Utgå från algoritmerna på föreläsningen. Försök att inte använda kod från boken eller från nätet. NB 31 Implementera Quicksort för en array av int. Titta inte på någon kod utan utgå från algoritmen i boken. TEN1 140314 Uppgift 4 Implementera en static metod som sorterar en array med heltal med hjälp av mergesort. Du får alltså inte använda någon färdig sorteringsalgoritm i javas api utan skall skriva en egen. Utgå från skalet du hittar i W:\AoD\Uppgift4. (2p) Mergesort - kort påminnelse: Dela upp en array i två arrayer Sortera vänster array Sortera höger array Sammanfoga de sorterade arrayerna

TEN1 150612 Uppgift 5 I denna uppgift ska du implementera quicksort för en array av heltal. Implementeringen ska göra sorteringen in-place (dvs minneskraven förutom arrayen skall vara oberoende av arrayens storlek) och vara effektiv (ingen del av implementeringen får förstöra dess möjlighet att vara O(n log n)). Implementeringen skall som pivotelement välja det sista elementet i arrayen. Utgå ifrån skalet som finns i W:\AoD\Uppgift5. (3p) Tips: Algoritm för quicksort: 1. Välj ett element - kallas pivotelementet 2. Flytta element så att alla element som är mindre eller lika med pivotelementet kommer före och så att alla element som är större än pivotelementet kommer efter detta. 3. Sortera rekursivt med hjälp av quicksort de två del-arrayerna på var sin sida om pivotelementet TEN1 150317 Uppgift 3 Implementera en heap för heltal med en array som inre datastruktur. Du får inte använda några andra datastrukturer från java s api. Du behöver bara implementera insättning och inte borttagning. Heapen ska ha plats för 1000 heltal och behöver inte kunna växa när den blir full. Metoden insert skall returnera true om den lyckas sätta in och false om arrayen är full. I W:\AoD\Uppgift3 hittar du en main som bör fungera med din heap. Där ser du att du också ska implementera en tostring. Denna ska bara skriva ut alla element på en rad i den ordning de ligger i arrayen. (3p) Tips: En heap är ett komplett binärt träd där rotens nyckel är minsta nyckeln i trädet och varje icke tomt subträd är en heap. Insättning: 1. Sätt in ny nod på första lediga plats. 2. Medans noden inte är rot och nodens nyckel är mindre än förälderns nyckel: byt plats på förälder och nod Om man lagrar en heap i en array kan man börja med roten och lägga elementen nivå efter nivå från vänster till höger och då gäller: en nod med index p har vänster barn med index 2p+1, höger barn med index 2p+2 och sin förälder med index (p-1)/2.

Föreläsning 10 NB 32 Skriv en klass som använder en förbindelselista för att representera en viktad graf. Skriv en metod (i main-klassen) som läser data från en textfil och skapar ett objekt av din klass som representerar den inlästa grafen. Du väljer själv hur du organiserar textfilen för att representera grafen. Det ska dock vara relativt enkelt att skriva en textfil för att representera en godtycklig graf. Skapa en textfil som representerar grafen från föreläsningen. Skriv en metod (i mainklassen) som tar en förbindelselista och två heltal som representerar två noder i grafen. Den ska sedan returnera närmsta vägen mellan noderna. Anropa metoden med den inlästa grafen från föreläsningen och ange nod B och nod G. Skriv ut den returnerade sträckan. NB 33 Skriv en static metod som hittar det minsta uppspända trädet för en graf representerad med en förbindelsematris med hjälp av Prims algoritm. Funktionen skall ta en förbindelsematris som input och returnera en int-array p, där p[v] anger den nod som noden v anslöts till enligt algoritmen. Skriv också en main där du använder den hårdkodade matrisen från föreläsningen och anropar din funktion (funktionen skall fungera för godtycklig förbindelsematris av godtycklig dimension). Skriv ut resultatet i main på formatet: Nod A var startnod Nod B anslöts till A Nod C anslöts till B Nod H anslöts till C Nod D anslöts till F Nod E anslöts till C Nod F anslöts till A Nod G anslöts till F (obs att det finns fler korrekta lösningar) TEN1 150612 Uppgift 3 I denna uppgift ska du skriva en metod som hittar det minsta uppspännande trädet till en sammanhängande viktad graf. Metoden skall ta en förbindelsematris och returnera totalvikten för bågarna i det minsta uppspännande trädet. Vikterna representeras av heltal. Utgå ifrån skalet som finns i W:\AoD\Uppgift3. Din lösning behöver inte vara optimal ur effektivitetssynpunkt. (3p) Tips: En girig algoritm fungerar här perfekt.

Föreläsning 11 NB34 Lös växlingsproblemet med en girig algoritm. Skriv en metod som tar växlingssumman och en intarray med de olika tillgängliga valutorna I fallande ordning och returnerar en int-array med antalet av varje valuta. Ex. Man vill veta växeln för 789 kr I vår valuta. Man anropar då: change(789,new int{1000,500,100,50,20,10,5,1}) som då returnerar: {0,1,2,1,1,1,1,4}. NB35 Lös det obegränsade kappsäcksproblemet med en girig algoritm i en funktion där man kan skicka in storleken på kappsäcken och varornas vikt och värde på ett bra sätt. Funktionen ska då på ett bra sätt returnera hur kappsäcken ska packas. Skriv också en main som tillåter en användare att ange indata till algoritmen och sedan presenterar lösningen för denna. NB36 Skriv en schemaläggningsfunktion enligt föreläsningen. NB37 a) Skriv ett program som läser in en karta från en textfil. Textfilen innehåller först antal länder och sedan antal gränser och därefter följer på varje rad två tal som representerar att dessa länder har en gräns. Ex: 4 5 0 1 0 2 1 2 1 3 2 3 Därefter ska programmet med hjälp av algoritmen från föreläsningen presentera vilken färg varje land ska färgläggas i så att man använder få färger men angränsande länder aldrig har samma färg. b) Förbättra nu programmet så att algoritmen hela tiden väljer ett av de länder som angränsar till flest redan valda länder. NB38 Skriv ett program som läser in en avståndstabell för ett antal städer från fil och sedan använder en girig algoritm för att försöka hitta en kort rutt för att besöka alla städer. Låt användaren få ange startstad så att man kan prova olika startstäder. Programmet ska sedan presentera rutten.

NB39 Vid en fabrik finns n i stycken aktiviteter som behöver utföras under en dag. Varje aktivitet har en starttid s i och en sluttid m i. Under denna tid måste en person jobba med aktiviteten. Designa en girig algoritm som beräknar minsta antalet personer som krävs för att lösa uppgiften. Implementera sedan algoritmen i ett program som läser data från en fil för att sedan presentera minsta antalet som krävs. Designa ett antal kniviga fall och kontrollera att algoritmen verkligen når det minimala antalet personer. NB40 Givet n punkter på den reella tallinjen. Hitta det minsta antal intervall med längden 2,0 som tillsammans täcker alla punkter. Designa och implementera en girig algoritm. Låt programmet slumpa fram ett antal punkter. Försök verifiera att din algoritm fungerar med ett resonemang. Skriv även ner ditt resonemang i din redovisning. Testas av TEN1 150612 Uppgift 3 se föreläsning 10

Föreläsning 12 NB41 Skriv ett program som slumpar n stycken heltal mellan -1000 och 1000. Användaren anger n. Programmet beräknar sedan den maximala delsekvenssumman med hjälp av ett funktionsanrop av en funktion som använder en söndra och härska algoritm. Den skriver sedan ut vad summan blev och hur många anrop till funktionen som behövdes. NB42 Skriv en funktion som tar en array med punkter (använd en klass för att representera en 2D-punkt med float för koordinaterna) och returnerar det kortaste avståndet mellan två punkter. Funktionen ska använda en effektiv söndra och härska algoritm enligt föreläsningen (dvs inte jämföra onödiga punkter över mittlinjen). Skriv också en main som slumpar fram n punkter som ligger i intervallet: - 1<x<1 och -1<y<1 med lika stor sannolikhet för alla värden. Anropa din funktion med de framslumpade punkterna. NB43 Skriv ett program som löser det generella växlingsproblemet. Användaren får först ange hur många olika valutor det finns och sedan valören på dessa. Därefter får denne ange vilket belopp som skall växlas och programmet svarar med minsta antalet mynt och sedlar som behövs. Lägg till att programmet också skriver ut växeln. NB44 Skriv en funktion som löser Skyline-problemet. Skriv sedan ett program som slumpar fram n st hus (n anges av användaren) och ritar upp dessa och deras skyline. NB45 Av n element skall vi ta reda på om det finns mer än n/2 av något och i så fall vilket. Utgå från att elementen kan testas för likhet men inte rangordnas (equal men inte compare). Designa en söndra och härska algoritm som hittar ett sådant elementet i en array om ett sådant finns. Skriv sedan en funktion och en main med några hårdkodade exempel. Sträva efter att få algoritmen så effektiv som möjligt (O(n) är möjligt men O(nlogn) blir resultatet av en bra söndra och härska och duger). Testas av TEN1 140314 Uppgift 4 se föreläsning 9 Testas av TEN1 150612 Uppgift 5 se föreläsning 9

Föreläsning 13 NB46 Skriv en funktion som beräknar högsta summan man kan få genom att lägga ihop talen längs valfri väg från toppen av en taltriangel till botten. a) Lös problemet med enkel rekursion b) Förbättra effektiviteten genom att tabulera värden du räknat ut (dynamisk programmering topdown). Jämför antalet anrop med a) för en 30-tal hög triangel. c) Skriv en funktion som bygger upp lösningen nerifrån och upp (dynamisk programmering bottom up) NB47 Skriv en funktion som löser det generella myntväxlingsproblemet med hjälp av dynamisk programmering. Skriv först en top-down lösning och sedan en bottom-up lösning. NB48 Implementera Floyd-Warshall. NB49 Implementera ett program som löser kappsäcksproblemet enligt föreläsningen. Skriv också ett enkelt gränssnitt. NB50 Hur många unika vägar finns det från övre högra hörnet till nedre vänstra hörnet om vi bara får gå väst och syd? Förbättra vår lösning med hjälp av dynamisk programmering. Hur många funktionsanrop blir det för (12,6)? Jämför med vår gamla algoritm utan tabulering.

NB51 I en följd av heltal ska vi försöka hitta den längden hos den längsta sekvensen stigande tal. Alla stigande sekvenser i talföljden 5, 2, 8, 6, 3, 6, 9, 7 är markerade ovan. Den längsta blir då 4 lång och är 2, 3, 6, 9 eller 2, 3, 6, 7. a) Skriv en funktion som löser problemet ovan. Tänk fritt. b) Börja längst till vänster. Varje nytt tal ger två alternativ: Talet är större än föregående tal i vår sekvens: 1. Ta med talet 2. Hoppa över talet Talet är inte större än föregående tal i vår sekvens: 1. Påbörja ny sekvens 2. Hoppa över talet Skriv en rekursiv lösning som använder detta. c) Effektivisera den rekursiva lösningen med tabulering av beräknade delresultat. Försök också gärna att göra en bottom-up lösning. NB52 svår, helt ok att hoppa över Implementera en dynamisk algoritm som löser handelsresandeproblemet

TEN1 140314 Uppgift 1 Taltriangel Vilken är den högsta summan man kan få genom summera talen längs valfri väg från toppen till botten i en taltriangel? Vid varje steg kan man alltså endast välja på att gå vänster eller höger. Utgå ifrån att alla tal är heltal större än eller lika med noll. Dina funktioner skall klara valfri storlek med godtyckliga siffror. Använd skalet ni hittar i W:\AoD\Uppgift1. a) Skriv en rekursiv funktion som beräknar högsta möjliga summan för en taltriangel. Troligen använder du en wrapper-funktion som i sin tur anropar den funktion som du sedan anropar rekursivt. (2p) b) Förbättra effektiviteten genom att tabulera värden du räknat ut (dynamisk programmering topdown). (1p) Tips: Om man vill lagra en triangel såsom ovan gör man det enklast i en array: 7 * * * * 3 8 * * * 8 1 0 * * 2 7 4 4 * 4 5 2 6 5 Om man då står på rad n och kolumn m och vill gå vänster ska man gå till rad n+1 och kolumn m. Vill man gå till höger ska man gå till rad n+1 och kolumn m+1. TEN1 150317 Uppgift 5 Här ska vi titta på det allmänna myntväxlingsproblemet. Vi ska alltså skriva ett program som givet valörerna i en valuta och givet mängden växel som skall ges beräknar minsta antalet mynt/sedlar som vi kan lämna ut. Om valörerna är 1kr, 10kr och 11kr och vi ska ge 30kr i växel ska programmet alltså svara 3 (dvs 3 tiokronor). Programmet behöver alltså inte svara hur växeln skall ges utan bara antalet mynt/sedlar. Dock problemet skall i denna uppgift lösas med dynamisk programmering bottom-up. Om du löser problemet med dynamisk programmering top-down (rekursion med tabulerade värden) eller bara rekursion så får man noll poäng. För full poäng skall lösningen dessutom vara effektiv. (2p)