Tentamen i Algoritmer & Datastrukturer i Java

Relevanta dokument
Tentamen i Algoritmer & Datastrukturer i Java

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen i Algoritmer & Datastrukturer i Java

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

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

Föreläsning 3. Stack

Föreläsning 3. Stack

Föreläsning 2 Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

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

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

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Länkade strukturer, parametriserade typer och undantag

Tentamen Datastrukturer (DAT036)

Algoritmer och datastrukturer

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Föreläsning 4 Innehåll

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Dugga Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036)

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

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

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037)

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

Länkade strukturer. (del 2)

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

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Föreläsning 3 Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 8: Exempel och problemlösning

Tentamen Datastrukturer (DAT037)

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 14 Innehåll

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

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

Tommy Färnqvist, IDA, Linköpings universitet

Tentamen TEN1 HI

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

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

Tentamen, Algoritmer och datastrukturer

Programmering för språkteknologer II, HT2014. Rum

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.

Lösningsförslag till tentamen Datastrukturer, DAT037,

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Lösningsförslag till exempeltenta 1

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

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

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

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Tentamen Datastrukturer (DAT036)

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

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

Föreläsning 9 Innehåll

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Föreläsning 9 Innehåll

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Föreläsning 2 Datastrukturer (DAT037)

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

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

DAI2 (TIDAL) + I2 (TKIEK)

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

Föreläsning 10 Datastrukturer (DAT037)

Sökning och sortering

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

Föreläsning Datastrukturer (DAT036)

Tentamen Datastrukturer D DAT 036/DIT960

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

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

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

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

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

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

Programmering för språkteknologer II, HT2011. Rum

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.

Tentamen Datastrukturer D DAT 035/INN960

Föreläsning 4 Datastrukturer (DAT037)

Lösningsförslag till exempeltenta 2

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

public boolean containskey(string key) { return search(key, head)!= null; }

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

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Stackar, köer, iteratorer och paket

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

BST implementering, huvudstruktur

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning Datastrukturer (DAT037)

Transkript:

Tentamen i Algoritmer & Datastrukturer i Java Hjälpmedel: Skrivhjälpmedel, miniräknare. Ort / Datum: Halmstad / 2011-03-15 Skrivtid: 4 timmar Kontakt person: Mattias Wecksten 7396 Poäng / Betyg: Max poäng 40 _ >=20 poäng ger betyg 3 _ >=28 poäng ger betyg 4 _ >=37 poäng ger betyg 5 Övrigt: Det finns två olika sorters frågekategorier, de som skall besvaras genom programmerings och de som skall besvaras genom förklaringar med text och illustrationer. Programmeringslösningarna skall i största mån vara skrivna i korrekt Java-syntax. Koden skall vara välstrukturerad och lättläst. Koden skall innehålla lämpliga ledtexter (utskrifter) som instruerar användaren vad som krävs av honom/henne. Om en lösning är uppenbart klumpig och det anses att tentanden skall känna till en smidigare lösning kan den klumpiga lösningen medföra poängavdrag. Förklaringslösningar bör, om tillämpningsbart, innehålla illustrationer på relevanta datastrukturer och använda algoritmer. Tänk på att vara noggrann och strukturerad. Det är Du som skall visa vad Du kan! Lycka Till!

Uppgift 1 Tidskomplexitet (4p) a) För nedanstående delar av olika algoritmer ange en uppskattning av exekveringstiden i form av Big-Oh notation. Motivera också din uppskattning. A1) public class Statistics public static double average( double da[ ]) double n=da.length; return sum(da)/n; public static double sum (double da[ ]) double s=0; for(int i=0; i<da.length;i++) s=s+da[i]; return s; A2) while(i>=1) for( int j=1;j<n;j++) x=x+1; i=i/2; for(int i=0; i<n;i++) x=x+1;

A1. Den totala tidskomplexitetn är O(n). Motivering: Metoden sum() har en tidskomplexitet i o(n) p.g.a. en foor loop 0->n där för varje iteration exekveras operation som har konstant tiddskomplexitet o(1). I metoden average() anropas metoden sum(). Själva anropet har tidskomplexiteten O(1) men eftersom sum() har sin tidskomplexitet av O(n) blir den totala tidskomplexiteten O(n). A1. Den totala tidskomplexiteten är O(nlogn). Motivering. Kodenfragmentet består av en while loop som för varje iretation halverar sin storlek och som för varje iteration exekverar en for loop som loopar 0->n. Detta innebär en tidskomplexitet O( logn * N) = O(NlogN) Den andra for loopen har en exekveringstid O(n). Den totala tidskoplexiteten blir då den dominanta som är O(nlogN) eftersom O(n)<O(NlogN). Uppgift 2 Datastrukturer (2p+4p+6p+4p) a) På föreläsningen pratade vi om en sk. wrap-around implementation av en kö. Förklara kort datastrukturen kö samt vad som menas med wrap-around implementation av kö. Vilka är fördelarna med wrap-around implementation? En kö er en FIFO data struktur. First in first out som kan inplementeras med statisk med array eller dynamisk med länkad lista. De vanligaste opreationerena i en Kö är enqueue, dequeue som motsvararar en insert() och remove(). Wrap-araoud implementationen implementeras med arrayer och referenser till flrsta respektive sista elementen i kön.

När ett equeue exekveras incrementeras back av kö. När dequeue exekveras imcrementeras front av kö. I Wrap around lösningar incrementeras front och back till början av arrayen om kö inte är full. Detta gör att minnet används effektivt och datastrukturen är snabb. b) Förklara principen med de datastrukturer som vi kallar Symbol tabeller. Din förklaring skall innehålla bl.a. svar på följande frågor: Vad är dessa för typ av datastrukturer? Vilka olika sätt att representera datastrukturen känner du till? Vilka operationer är vanligt förekommande? Vad kan du säga om tidskomplexiteten for operationerna. Vilka är fördelar/nackdelar med de olika sett att representera Symbol tabeller? Vi kallar symbol tabeller de datastrukturer som lagrar data i for av associerade objekt-nyckel par. Det finns array baserade symboltabbeler som håller nyklarna i en array och objekten i en annan motsvarande array eller hashtabeler. Länkade datastrukturer är vanligförekommande BinarySearchTree. De vanligaste operationerana är put() get() och lookupp(). Tidskomplexiteten för operationerna är tänkta att vara O(1). I visa fall kan operationerna O(log n). c) I en multipop-stack tillåter man förutom de vanliga stackoperationerna även en som tar bort ett antal av de översta elementen (utan att returnera något). Antalet element som skall tas bort är in parameter till metoden. Implementera en klass för en sådan stack. Stacken skall vara arraybaserd, och innehålla metoderna, push(object x) pop(), och multipop(int n) OBS! Tänk på att metoden multipop(int n) in parameter n kan vara större än stackens storlek. Du får hitta ett sätt att hantera det fallet. Metoden skall returnera true om multipop kan genomföras annars false.

Klassen behöver inte nödvändigtvis vara precis som den som finns i boken eller pratat om på föreläsningen vad gäller exception-hantering. Det viktiga är att alla väsentliga metoder finns med och att de är utformade så att rimliga resultat alltid ges. public class ArrayStack<AnyType> private AnyType [ ] thearray; private int topofstack; private int size; /** * Construct the stack. */ public ArrayStack( ) thearray = (AnyType []) new Object[10]; topofstack = -1; size++; /** * Test if the stack is logically empty. * @return true if empty, false otherwise. */ public boolean isempty( ) return topofstack == -1; /** * Make the stack logically empty. */ public void makeempty( ) topofstack = -1;

/** * Insert a new item into the stack. * @param x the item to insert. */ public void push( AnyType x ) if( topofstack + 1 == thearray.length ) doublearray( ); thearray[ ++topofstack ] = x; /** * Return and remove the most recently inserted item * from the stack. * @return the most recently inserted item in the stack. * @throws Underflow if the stack is empty. */ public AnyType pop( ) if( isempty( ) ) throw new UnderflowException( "ArrayStack pop" ); return thearray[ topofstack-- ]; /** * Remove the most recently inserted item from the stack. * @throws UnderflowException if the stack is empty. */ public void multipop( int n) if( n<=size) for( int i=0;i<n;i++) // pop(); topofstack--

d)du jobbar på en implementation av en enkel min heap i Java. Du använder dig av en array som innehåller alla element i heapen. Här är en del av koden som du har skrivit hittills: public class MINSpecialHeap private final int maxsize; private Comparable[] heap; private int currentsize; public MINSpecialHeap(int maxsize) this.maxsize = maxsize; heap = new Comparable[maxSize]; currentsize = 0;... Din uppgift är att lägga till och implementera två metoder med följande signatur: // lägger till värdet x på rätt plats i heapen public void add (Comparable x) if int hole = ++currentsize; array[ 0 ] = x; = 2 ) for( ; x.compareto( array[ hole / 2 ] ) < 0; hole / array[ hole ] = array[ hole / 2 ]; array[ hole ] = x; // returnerar en lista som innehåller alla värden från //heapen som är mindre än x. Du väljer själv vilken typ av Collection datastruktur som metoden skall returnera. public Collection getlessthan(comparable x) ArrayList list= new ArrayLisy();

for( ; heap[i].compareto( x) < 0; ) list.add(heap[i]); return list; Tips 1: Som du vet en heap är en sorterad datastruktur. I detta fallet är det en MIN heap, d.v.s minsta värde finns på första platsen. Tips 2: Välj bland klasserna som implementerade interfacen Collection. Vilka var dem? Uppgift 3 Kända algoritmer (1p+1p+1p+2p) a) Anta att vi måste söka efter ett element bland en stor mängd data som är lagrad i en array. Vad måste vi veta om datan som skall sökas igenom för att kunna tillämpa binärt sökning? BinärSökning kräver att datan vi söker igenom är sorterad i stigande ordning eftersom algoritmen delar arrayen i halvor och söker bara inom ena halvan beroende på om sökningselementet är mindre eller större än elementen i mitten. b) Varför är INTE binärt sökning lämpligt för länkade listor? Eftersom binärsökning måste hitta mitten av sökfältet upprepeterade gånger kräver det ett effektivt sätt att hitta mitten av sökfältet. I länkade listor är inte indexering möjligt därför måste algoritmen loopa från head till mitt i varje iteration. Loop har en tidskomplexitet i O(n) vilket försämrar exekveringstiden för binär sökning. c) I vanligt fall är quicksort algoritmen en mycket effektiv sorterings algoritm. Förklara i vilka fall kan quicksort algoritmen ge exekveringstid i O(N^2). Quick sort algoritmen är en algoritm som använder rekursiv indelnings teknik och sedan rekonstruktion för att sortera.

Det väsentliga i en effektiv quick sort är att valet av delning elementen (pivot). I de fall pivotens värde är den minsta eller det högsta värdet i fältet som skall sorteras kommer delarna av fältet vara en liten (en eller få element och en stor nästan alla andra element). Detta innebär att indelningen i halvor i ställer för att vara logn gånger blir det N gånger. Resultera i att algoritmen blir O(n^2): d)förklara hur exekveringstiden påverkas om arrayen som skall sorteras är nästan sorterad. Vilken sorterings algoritm skulle du använda om du vet att data i arrayen är nästan sorterad. Algoritmen är insertion sort. Den här algoritmend har i average time en exekveringstid i O(n^2). Men, när arrayen är sorterad kommer den innersta foor loopen i algoritmen aldrig att exekveras. Detta gör att algoritmen tenderar vara O(n) när fältet är nästan sorterad. Uppgift 4 Träd och HashTabell (2p+2p+2p) Vi kan använda binära träd för att representera algebriska uttryck. Dessa träd kallas expressions tree. Om man använder metoden printpostorder() för att skriva ut trädet får vi en aritmetiskt utryckt i postfix notation. Se nedan implementation av metoden samt ett träd. public void printpostorder( ) if( left!= null ) left.printpostorder( ); if( right!= null ) right.printpostorder( ); System.out.println( element ); // Left // Right // Node

a) Vilken blir uttrycket för trädet ovan. 5 9 4 8/+*3- b) För att beräkna aritmetiska uttryck i postfix notation används datastrukturen stack. Vissa hur stacken förändras när du beräknar postfix uttrycket som du fått fram i uppgift a. Lyckas du inte lösa uppgift a välj själv ett aritmetisk utryckt och visa hur beräkningen med hjälp av stacken sker. Push 5948 Pop 8 sen 4. Applicera / mellan dessa Push resultate 4/8 Pop 4/8 och 9 och applicera + Mmmm 44.5 c) Förklara vad en hash funktionen används till samt varför nedanstående hashfunktion är dålig. public static int badhashfunc(string data) int val = 0; for(int i = 0; i < data.length(); i++) val += data.chatat(i); return val;

En hash funktion omvandlar en ett objekt till ett numeriskt värde. Dessa värde kallar ofta för nyklar och används i olika typer av datastrukturer för effektiv sökning. Den här hashfunktione är tänkt att omvandla en sträng till ett numerinks värde. Anlednigen att den är dåligt är att det kommer att omvandla alla strängar som innehåller samma bokstäver till samma värde vilket försämrar hash tabellen kvalitéer. Uppgift 5 Länkad lista (9p) En s.k. double-ended linked list man tillåter insättning och borttagning både i början och i slutet av listan. Antag att listan är en enkellänkad och i klassen finns två referenser, en till första noden och en till sista. Noden i listan definieras som vanligt, se nedan.

class Node Object element; // innehållet i listnoderna Node next; // referens till nästa nod i listan public Node(Object data, Node n) // konstruerare element=data; next=n public Node(Object data) element=data; next=null; Implementera klassen enligt nedanstående specifikation. public class DoubleEndedLinkedList /** Obs! first och last pekar på första och sista noden i listan. Inga noder är tomma */ private Node first, last; public DoubleEndedLinkedList first=last=null; /** Sätt in x sist i listan */ public void insertlast(object x); Node n=new Node (x); if( (first==last)==null) first=last=n; last.next=n; last=n; /** Sätt in x först i listan */ public void insertfirst(object x); Node n=new Node (x); if( (first==last)==null) first=last=n; else n.next=first; first=n;

/** Tag bort första noden i listan och returnera dess innehåll.returnera null om listan är tom */ public Object removefirst(); Object o= first.element; first=first.next; return o; /** Tag bort sista noden i listan och returnera dess innehåll. Returnera null om listan är tom */ public Object removelast(); while( temp.next!=last) temp=temp.next; Object o= last.element; temp.next=null; last=temp; return o; /** Returnerar objeket som hittas på en viss index, returnerar null om idex är större än listan storlek public Object getelement(int index); /** Returnerar innehållet i listan, returnera null om listan är tom */ public String tostring();