Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte

Werbung
Fortgeschrittene Programmiertechnik
Klausur SS 2015
Angewandte Informatik Bachelor
Name
Matrikelnummer
Aufgabe
Punkte
Aufgabe
Punkte
1
6
6
9
2
8
7
17
3
12
8
18
4
18
9
12
5
20
Summe
120
Zwischensumme
64
Note
Prof. Dr. O. Bittel, HTWG Konstanz
SS 2015
1/11
Aufgabe 1
(6 Punkte)
Beschreiben Sie mit einem Speicherbelegungsbild, was durch die main()-Methode geleistet wird. Es
genügt das Speicherbelegungsbild anzugeben, nachdem alle Anweisungen der main()-Methode
ausgeführt worden sind.
class Node {
Node next;
int data;
Node(int x, Node p) {
data = x;
next = p;
}
public static void main(String[] a) {
Node p = new Node(3, null);
p.next = new Node(5, p.next);
Node q = p.next;
q.next = new Node(7, q.next);
q = new Node(1, null);
}
}
Prof. Dr. O. Bittel, HTWG Konstanz
SS 2015
2/11
Aufgabe 2
(8 Punkte)
Die Knoten eines Binärbaums sind durch folgende Klasse definiert:
class Node {
int data;
Node left;
Node right;
// Referenz auf linkes Kind
// Referenz auf rechtes Kind
Node(int x, Node l, Node r) {
data = x;
left = l;
right = r
}
}
a) Der Binärbaum (2) entsteht aus dem Binärbaum (1), indem die Zahl „6“ durch „66“ ersetzt und
ein neuer Knoten mit der Zahl „2“ eingefügt wird. Schreiben Sie genau 2 Java-Anweisungen, die
das leisten.
root.right.right.data = 66;
root.left = new Node(2, null, root.left);
b) Der Binärbaum (3) entsteht aus dem Binärbaum (2), indem der linke Teilbaum der Wurzel root
an den Knoten „3“als linkes Kind eingehängt und dann die Wurzel gelöscht wird. Schreiben Sie
genau 2 Java-Anweisungen, die das leisten.
root.right.left = root.left;
root = root.right;
Prof. Dr. O. Bittel, HTWG Konstanz
SS 2015
3/11
Aufgabe 3
QuickSort mit 3-Median-Strategie
(12 Punkte)
Das 11-elementige Feld a = {5, 4, 13, 11, 3, 10, 2, 8, 6, 9, 12} wird mit Quicksort mit 3-MedianStrategie sortiert. Beschreiben Sie, wie sich dabei das Feld a ändert. Benutzen Sie eine tabellenartige
Darstellung wie in der Vorlesung. Geben Sie außerdem die Aufrufstruktur von Quicksort an.
5
4
13 11 3
10 2
12
8
6
9
11
8
4
9
6
3
2
4
2
3
3
3
3
4
4
3
8
2
5
9
5
5
9
6
6
Prof. Dr. O. Bittel, HTWG Konstanz
12
10
13
6
5
2
9
8
6
9
8
8
6
6
8
12
10
12
10 11 13 12
12
12 13
11 12 13
9
9
SS 2015
4/11
Aufgabe 4
Java-Collection Map
(18 Punkte)
Für einen Text läßt sich die Häufigkeitsverteilung der vorkommenden Wörter durch eine Map
darstellen:
Map<String,Integer> hauefigkeit;
Kommt z.B. das Wort „und“ im Text 35-mal vor, dann enthält die Map einen Eintrag mit dem
Schlüssel „und“ und dem Wert 35.
a) Schreiben Sie eine Funktion merge, die aus der Häufigkeitsverteilung h1 für einen Text t1 und
der Häufigkeitsverteilung h2 für einen Text t2 eine Häufigkeitsverteilung für beide Texte
zusammen berechnet und zurückliefert. Hinweis: Die Häufigkeiten müssen dazu lediglich addiert
werden.
b) Welche Komplexität hat die Laufzeit Ihrer Funktion (O-Notation), wenn Sie davon ausgehen,
dass Ihre beiden Häufigkeitsverteilungen etwa n Wörter umfassen? Geben Sie eine kurze
Begründung Ihrer Antwort.
c) Um welchen Faktor wächst die Laufzeit, wenn die Eingabegröße n = 1000 um den Faktor 10
wächst?
a)
static Map<String,Integer>
merge(Map<String,Integer> h1, Map<String,Integer> h2) {
Map<String,Integer> h = new TreeMap<>(h1);
for (Map.Entry<String,Integer> e : h2.entrySet()) {
String key = e.getKey();
if (h.containsKey(key))
h.put(key, h.get(key)+e.getValue());
else
h.put(key, e.getValue());
}
return h;
}
b)
T(n) = O (n log n)
Konstruktoraufruf in O(n).
for-Schleife läuft n-mal. put- und get-Aufrufe benötigen O(log n).
c)
10 *1000 * log(10 *1000)
1000 * log(1000)
= 10 *
Prof. Dr. O. Bittel, HTWG Konstanz
€
4
3
≈ 13.3
SS 2015
5/11
Aufgabe 5
Sortierte, verkettete Liste mit Hilfskopfknoten
(20 Punkte)
Die Klasse LinkedListSet speichert int-Zahlen in einer linear verketteten Liste mit
Hilfskopfknoten in einer absteigend sortierten Reihenfolge. Elemente dürfen höchstens einfach
vorkommen. Ergänzen Sie die Klasse um die folgenden Methoden. Achten Sie dabei auf die
Effizienz der Methoden, indem die Sortierung der Liste ausgenutzt wird. Ausdrücke sollten nicht
unnötig kompliziert geschrieben werden.
a) Parameterloser Konstruktor.
b) contains(x) prüft, ob das Element x vorkommt.
c) add(x) fügt das Element x ein.
d) remove(x) löscht das Element x.
public class LinkedListSet {
static private class Node {
private int data;
private Node next;
private Node(Node p, int x) {data = x; next = p;}
}
private Node head;
public LinkedListSet() {
head = new Node(null,0);
}
public boolean contains(int x) {
Node p = head.next;
while (p != null && p.data > x)
p = p.next;
if (p == null || p.data < x)
return false;
else
return true;
}
public void add(int x) {
Node p = head;
while (p.next != null && p.next.data > x)
p = p.next;
if (p.next == null || p.next.data < x)
p.next = new Node(p.next,x);
}
public void remove(int x) {
Node p = head;
while (p.next != null && p.next.data > x)
p = p.next;
if (p.next != null && p.next.data == x)
p.next = p.next.next;
}
}
Prof. Dr. O. Bittel, HTWG Konstanz
SS 2015
6/11
Aufgabe 6
Arrays.Sort
(9 Punkte)
Die Java Klasse Arrays bietet eine Methode zum Sortieren eines Felds an:
static <T> void sort(T[] a, Comparator<? super T> c);
Ergänzen Sie folgenden Programm-Code so, dass ein Feld von Punkten aufsteigend sortiert wird.
Ein Punkt p ist kleiner als ein Punkt q, falls die x-Koordinate von p kleiner als die x-Koordinate von
q ist oder die x-Koordinaten gleich sind, aber dafür die y-Koordinate von p kleiner als die yKoordinate von q ist.
class Point {
public double x;
public double y;
public Point (double x, double y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) {
Point[] a = new Point[4];
a[0] = new Point(2,3);
a[1] = new Point(2,1);
a[2] = new Point(1,3);
a[3] = new Point(4,1);
Arrays.sort(a, new Comparator<Point>() {
public int compare(Point p, Point q) {
if (p.x < q.x || p.x == q.x && p.y < q.y)
return -1;
else if (p.x == q.x && p.y == q.y)
return 0;
else
return +1;
});
}
Prof. Dr. O. Bittel, HTWG Konstanz
SS 2015
7/11
Aufgabe 7
Java-Collection List
(17 Punkte)
a) Schreiben Sie eine generische Methode disjoint(l1,l2), die prüft ob die Listen l1 und l2
disjunkt sind. Die Methode liefert true zurück, falls l1 und l2 keine gemeinsamen Elemente
enthalten, sonst false. Die Methode darf auf die Listen nur über Iteratoren zugreifen.
b) Welche Komplexität hat die Methode disjoint(l1,l2) (O-Notation), wenn Sie davon
ausgehen, dass die beiden Listen n Elemente enthalten?
c) Schreiben Sie eine generische Methode isSorted(l), die prüft, ob die Liste l aufsteigend
sortiert ist. Die Methode darf auf die Liste nur über Iteratoren zugreifen. Ergänzen Sie die
Typbeschränkung für T.
a)
static <T> boolean disjoint(List<T> l1, List<T> l2) {
for (T x : l1)
for (T y : l2) {
if (x.equals(y))
return false;
return true;
}
b)
T(n) = O(n2)
c)
static <T extends Comparable<? super T>> boolean isSorted(List<T> l)
{
T prev = null;
for (T x : l) {
if (prev == null)
prev = x;
else
if (prev.compareTo(x) > 0)
return false;
}
return true;
}
Prof. Dr. O. Bittel, HTWG Konstanz
SS 2015
8/11
Aufgabe 8
Bäume
(18 Punkte)
Ein Baum besteht aus einem Bezeichner (String) und einer (evtl. leeren) Liste mit Teilbäumen.
a) Ergänzen Sie die gegebene Klasse (siehe nächste Seite) um geeignete Instanzvariablen und
vervollständigen Sie den Konstruktor.
b) Definieren Sie eine Methode add(Baum b), die den Baum b zur Liste mit Teilbäumen
dazufügt.
c) Schreiben Sie ein kleines Hauptprogramm, das den oben gezeigten Baum zusammenbaut.
d) Schreiben Sie eine Methode height(), die die maximale Höhe des Baums zurückgibt. Der
oben gezeigte Baum hat die Höhe 2.
e) Schreiben Sie eine Methode search(String s) die zurückgibt, wie oft der Bezeichner s im
Baum vorkommt. Im oben gezeigten Baum kommt der Bezeichner „aa“ dreimal vor.
Prof. Dr. O. Bittel, HTWG Konstanz
SS 2015
9/11
class Baum {
private List<Baum> teilBaeume;
private String bezeichner;
public Baum(String bez) { // Neuer Baum mit Bezeichner bez
bezeichner = bez;
teilBaeume = new LinkedList<Baum>();
}
public void add(Baum b){
teilBaeume.add(b);
}
public int height() {
if (teilBaeume.isEmpty())
return 0;
int h = 0;
for (Baum b : teilBaeume) {
int h1 = b.height();
if (h1 > h)
h = h1;
}
return h+1;
}
public int search(String bez) {
int n = 0;
if (bez.equals(bezeichner))
n++;
for (Baum b : teilBaeume)
n += b.search(bez);
return n;
}
public static void main(String[] args) {
Baum b = new Baum("aa");
Baum b1 = new Baum("bb");
b.add(b1);
b.add(new Baum("cc"));
b.add(new Baum("dd"));
b1.add(new Baum("aa"));
b1.add(new Baum("aa"));
}
}
Prof. Dr. O. Bittel, HTWG Konstanz
SS 2015
10/11
Aufgabe 9
Subtyping
(12 Punkte)
a) Die Methode copy(dest, src) aus der Klasse Collections kopiert alle Elemente aus der
Liste src in die Liste dest.
static <T> void copy(List<? super T> dest, List<? extends T> src)
Von welchem Typ dürfen die Parameter sein? Geben Sie dazu in folgender Tabelle an, ob die
angegebene Parametertypen korrekt („+“) oder nicht korrekt („-“) sind.
dest
List<Integer>
ArrayList<Integer>
LinkedList<Object>
ArrayList<Double>
LinkedList<Number>
Set<Object>
List<Integer>
src
LinkedList<Integer>
List<Integer>
ArrayList<Double>
ArrayList<Integer>
List<Integer>
List<Integer>
LinkedList<Number>
Korrekt?
+
+
+
+
-
b) Die Klassen Vektor, 2DVektor und 3DVektor seien wie folgt definiert:
class Vektor { ... }
class Vektor2D extends Vektor implements Comparable<Vektor2D> { ... }
class Vektor3D extends Vektor implements Comparable<Vektor3D> { ... }
Geben Sie für diese drei Typen alle Untertypbeziehungen an. Berücksichtigen Sie dabei die Klasse
Object.
c) Welche Parametertypen sind beim Aufruf der Methode sort aus der Klasse Collections
erlaubt?
static <T extends Comparable<? super T>> void sort(List<T> l);
Parametertyp
LinkedList<Vektor2D>
ArrayList<Vektor3D>
List<Object>
ArrayList<Vektor>
ArrayDeque<Vektor2D>
List<? extends Vektor2D>
Prof. Dr. O. Bittel, HTWG Konstanz
Korrekt („+“ oder „-“)?
+
+
+
SS 2015
11/11
Herunterladen