26.12.2014 Views

Tentamen i Algoritmer och datastrukturer, 29 april 2011, 8-13

Tentamen i Algoritmer och datastrukturer, 29 april 2011, 8-13

Tentamen i Algoritmer och datastrukturer, 29 april 2011, 8-13

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Tentamen</strong> i <strong>Algoritmer</strong> <strong>och</strong> <strong>datastrukturer</strong>,<br />

<strong>29</strong> <strong>april</strong> <strong>2011</strong>, 8-<strong>13</strong><br />

Tillåtet hjälpmedel: Java snabbreferens + beskrivning av vissa klasser <strong>och</strong> interface som delas ut.<br />

Maxpoäng är 36, för godkänt krävs 18 poäng. Preliminär poäng per uppgift anges nedan.<br />

Uppgifterna är inte sorterade i svårhetsgrad.<br />

Uppgift 1 (7 p)<br />

Vad är tidskomplexiteten för följande algoritmer Variabeln n bör användas för att beskriva<br />

”storleken” på problemet. Skriv inte bara upp ett svar utan motivera det också!<br />

a) int i = 1;<br />

int j = 1;<br />

while (j < n){<br />

for (int k = 1; k


Uppgift 2 (8 p)<br />

I denna uppgift ska vi implementera en klass för en kö med begränsad storlek, LimitedQueue. I<br />

konstruktorn anger man hur många element som kön får innehålla. Om man anropar operationen för<br />

insättning när kön är full så sker inte någon insättning. Elementen ska placeras i en enkellänkad lista<br />

där first <strong>och</strong> last anger det första <strong>och</strong> sista elementet i listan. Om kön är tom så är både first<br />

<strong>och</strong> last = null. Försöker man ta ut ett element ur en tom kö så returneras null av remove.<br />

Det ser ut så här:<br />

public class LimitedQueue{<br />

private Node first;<br />

private Node last;<br />

private int maxSize; /* Anger det maximala antalet element i kön. */<br />

private int size; /* Anger det aktuella antalet element i kön. */<br />

public LimitedQueue(int maxSize){…} /* Konstruktorn för klassen. */<br />

public void insert(E x){…} /* Sätter in x i kön om det finns plats. */<br />

public E remove(){…} /* Tar bort <strong>och</strong> returnerar det första elementet i<br />

kön (första = det som funnits längst i kön). */<br />

public boolean isFull(){…} /* Returnerar true om kön är full annars<br />

false */<br />

}<br />

Klassen Node ser ut så här:<br />

class Node {<br />

private E element;<br />

private Node next;<br />

public Node(E x) {<br />

element = x;<br />

next = null;<br />

}<br />

public E getElement(){<br />

return element;<br />

}<br />

}<br />

a) Implementera konstruktorn i LimitedQueue. Implementera också insert, remove<br />

<strong>och</strong> isFull. Du får inte införa några attribut utöver de som redan finns!<br />

b) Vi ska göra ett tillägg till klassen så att man kan iterera över elementen i kön. Därför lägger vi<br />

till en metod i LimitedQueue som returnerar en iterator:<br />

public Iterator iterator(){<br />

return new LimitedQueueIterator();<br />

}<br />

LimitedQueueIterator är en inre klass i LimitedQueue. Den ser ut så här:<br />

private class LimitedQueueIterator implements Iterator{<br />

privare Node position;<br />

private BufferIterator(){…} /* Konstruktorn! */<br />

public boolean hasNext(){…}<br />

public E next(){…}<br />

public void remove(){…}<br />

}<br />

Implementera konstruktorn <strong>och</strong> alla metoderna i LimitedQueueIterator.


Uppgift 3 (7 p)<br />

a) Definiera ett binärt sökträd.<br />

b) Hur definieras att ett binärt sökträd är balanserat<br />

c) Antag att vi har ett binärt sökträd som ser ut enligt följande (A, B <strong>och</strong> C är underträd):<br />

Y<br />

X<br />

C<br />

A<br />

B<br />

Antag att höjden för B <strong>och</strong> C är n <strong>och</strong> höjden för A är n+1. Visa hur man kan balansera detta<br />

träd genom att använda enkelrotation (single rotation). Bevisa också att det träd som man<br />

får som resultat av enkelrotationen fortfarande är ett binärt sökträd.<br />

d) Man kan gå igenom elementen i ett binärt sökträd i preorder, inorder eller postorder. Vilken<br />

ordning bör man välja om man vill gå igenom alla element i storleksordning med det minsta<br />

först Motivera svaret!<br />

Uppgift 4 (7 p)<br />

Klassen Element ser ut så här:<br />

public class Element {<br />

private int id;<br />

public Element(int id) { this.id = id; }<br />

public int hashCode() { return id; }<br />

}<br />

Vi vill lagra elementen i en hashtabell .<br />

a) Vi använder en hashtabell som implementerats med hjälp av en vektor med linjär teknik.<br />

Vektorns storlek är <strong>13</strong>. Antag att man sätter in element med värdena 3, 7, 14, 17, 22, 5, 30<br />

<strong>och</strong> 11 (i den ordningen). Hashtabellen är tom innan vi börjar sätta in talen. Visa på vilka<br />

platser i vektorn som elementen hamnar.<br />

b) Antag att man i stället använder kvadratisk teknik. Var hamnar då elementen i den<br />

föregående uppgiften<br />

c) Antag att myTalble är av klassen Hashtable från java.util (se utdelade blad). Antag att<br />

hashtabellen innehåller de element som finns i a) ovan. Vi skriver följande kod:<br />

Element u = new Element(7);<br />

boolean isInTable = myTable.contains(u);<br />

Det visar sig att isInTable får värdet false. Förklara detta!<br />

d) Ändra i klassen Element så att isInTable i c) i stället får värdet true (vilket ju är det<br />

mest naturliga).


Uppgift 5 (7 p)<br />

a) Skriv en rekursiv metod för att ta reda på antalet 0:or i den binära representationen av ett tal<br />

n. Använd att antalet 0:or är lika med antalet 0:or i n/2 (heltalsdivision) plus 1 om n är jämnt.<br />

b) Vi har ett binärt träd där noderna ser ut så här:<br />

public class Node{<br />

Node left;<br />

Node right;<br />

int value; // Ett värde som finns i alla noder<br />

}<br />

<strong>och</strong> där trädklassen ser ut så här:<br />

public class BinaryTreeUnsorted{<br />

Node root;<br />

// En massa andra attribut kan finns här!<br />

}<br />

Skriv en rekursiv metod myMethod som i en enda genomgång av trädet tar reda på antalet<br />

noder i trädet, summan av värdena i trädets noder, det största värdet i trädet <strong>och</strong> det minsta<br />

värdet i trädet. Det som myMetod returnerar ska vara av typen treeInfo som ser ut så<br />

här:<br />

class treeInfo{<br />

int nodes; // Antal noder i trädet<br />

int sum; // Summan av alla värden i noderna<br />

int max; // Det största värdet i trädet<br />

int min; // Det minsta värdet i trädet<br />

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!