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
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<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 />
}