Lösungen der Musteraufgaben - BFH

Werbung
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
A & D Lösungen zu den Musteraufgaben
Aufgabe 1
Gegeben seien 3 Stacks von Integer. Zwei sind leer und der dritte enthält n Zahlen.
a) Beschreiben Sie einen Algorithmus der mit Hilfe dieser 3 Stacks die Zahlen sortiert.
Das heisst, am Ende des Algorithmus sind wieder zwei Stacks leer und der dritte enthält
die n Zahlen in sortierter Reihenfolge.
Achtung: Ausser den drei Stacks dürfen keine weiteren Hilfsvariablen verwendet werden.
Lösung:
Am einfachsten kann das Sortieren durch Einfügen implementiert werden. Stack 1 ist
die Sourcesequenz, Stack 3 ist die Zielsequenz und Stack 2 wird als Zwischenspeicher
genutzt.
(a) Solange es in Stack 1 noch Elemente hat.
(b) Solange Stack 3 noch Elemente hat und das oberste Element von Stack 1 kleiner
ist als das oberste Element von Stack 3, so verschiebe das oberste Element von
Stack 3 nach Stack 2.
(c) Verschiebe das oberste Element von Stack 1 nach Stack 3.
(d) Verschiebe alle Elemente von Stack 2 nach Stack 3 und gehe zu 1.
Implementation:
/**
* Sortieren durch Einfuegen.
*
Stack der sortiert werden soll.
* @param st
/
*
public static Stack<Integer> insertionSort(Stack<Integer> st) {
Stack<Integer> st1 = new Stack<Integer>();
Stack<Integer> st2 = new Stack<Integer>();
while (!st.empty()){
// Verschieben der Elemente bis der richtige Platz gefunden ist.
while (!st2.empty() && st.peek() < st2.peek()) {
st1.push(st2.pop());
}
st2.push(st.pop());
while (!st1.empty()) {
st2.push(st1.pop());
}
}
return st2;
}
b) Was is die Komplexität des Algorithmus (zählen Sie die Push-, Pop- und Vergleichsoperationen)?
1
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
Lösung:
Jedes Element aus dem Stack 1 vergleichen wir im Durchschnitt mit 41 der Elemente
2
Also haben wir ca. n4 Vergleiche. Wir brauchen n push(pop()) Operationen um die
Elemente von Stack 1 nach Stack 3 zu transferieren. Bei jedem Transfer werden im
Durchschnitt n4 Elemente von Stack 3 auf Stack 2 verschoben und zurück. Dies ergibt
2
also n + n2 push(pop()) Operationen. Im ganzen ist der Algorithmus also O(n2 ).
Aufgabe 2
Gegeben sei eine Turingmaschine mit Eingabealphabet Σ = {1, 0} und Bandalphabet Γ =
{1, 0, 2}.
Schreiben Sie für diese Maschine ein Programm, das führende Nullen des Inputs löscht und
zur restlichen Zahl 1 dazu addiert. Am Ende soll der Kopf der Maschine auf das erste Zeichen
der Ausgabe zeigen und die Maschine in einem akzeptierenden Zustand sein.
Beispiele:
Input
000101001
000000
1101101
Output
101010
1
1101110
Lösung:
Zustand
1
2
3
4
5
6,
1
2
4
4
0
2
0
1
0
-
R
R
L
L
2
2
3
4
1
1
1
0
1
-
R
R
L
L
6
3
6
5
6
H
2
1
2
1
2
2
2
L
L
L
R
L
R
Aufgabe 3
Gegeben sei das folgende Java-Programm:
public class Myprog {
public static void main(String argv[]) {
double d = 0.01;
double sum = 0.0;
for (int i = 0; i < 1000; i++) {
sum += d;
}
System.out.println(sum);
}public class KnuthMorrisPratt {
public static int searchPattern(String str, String muster) {
int next[] = initnext(muster);
int n = str.length();
2
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
int m = muster.length();
int j = 0, i = 0;
while (i < n) {Undefined
if (str.charAt(i) == muster.charAt(j)) {
if (j == m - 1) {
return i - m + 1;
}
++i;
++j;
}
else if (j > 0) {
j = next[j];
} else {
++i;
}
}
return -1;
}
private static int[] initnext(String mu) {
int m = mu.length();
int i = 0, j = -1;
int next[] = new int[m];
while (i < m) {
next[i] = j;
while (j >= 0 && mu.charAt(i) != mu.charAt(j)) {
j = next[j];
}
++i;
++j;
}
return next;
}
}
}
Als Resultat würde man 10.0 erwarten. Das effektive Resultat ist aber 9.999999999999831.
Erklären Sie diesen Unterschied.
Lösung:
Der Dezimalbruch 0.01 ist dual ein unendlicher periodischer Bruch und zwar:
0.0000001010001111010111
Da wir nur eine endliche Anzahl Dualstellen zur Verfügung haben, muss dieser unendliche
Bruch abgebrochen werden. Beim wiederholten zusammenzählen entsteht daher ein Fehler,
3
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
der sich mit der Zeit auswirkt.
Aufgabe 4
Fragen zur Komplexität:
a) Beweisen Sie oder widerlegen Sie die folgenden Aussagen:
a.1) n3.9 = Θ(n4 )
Lösung:
Diese Aussage ist falsch. Trivialerweise gilt n3.9 = O(n4 ) aber die Umkehrung
gilt nicht:
n4 ≤ cn3.9 ∀n > n0
n0.1 ≤ c
∀n > n0
∀n : n > c10 , ist die Ungleichung immer falsch.
a.2) Falls p(n) ein Polynom vom Grad k ≥ 1 ist, dann gilt:
log(p(n)) = Θ(log(n)).
Lösung:
Für ein Polynom p(n) vom Grad k gilt p(n) = O(nk ). Das heisst es existieren c
und n0 so dass:
ak nk + ak−1 nk−1 + . . . + a0 ≤ cnk ∀n > n0
Da der Logarithmus eine monoton steigende Funktion ist, gilt die Ungleichung
auch, wenn wir beide Seiten logarithmieren.
log(ak nk +ak−1 nk−1 +. . .+a0 ) ≤ log(c)+k log(n) ≤ (log(c)+k) log(n) ∀n > n0
mit c1 = (log(c)+k) erhalten wir die gewünschte Aussage log(p(n)) = O(log(n)).
Es gilt aber auch nk = O(p(n)) und es gilt:
nk ≤ cp(n) ∀n > n0
Falls wir beide Seiten logarithmieren erhalten wir:
k log(n) ≤ log(c) + log(p(n)) ≤ (log(c) + 1) log(p(n)) ∀n > n0
mit c1 =
log(c)+1
k
erhalten wir
log(n) ≤ c1 log(p(n)) ∀n > n0
Damit ist die Aussage bewiesen.
4
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
a.3) Seien f(n) = O(h(n)) und g(n) = O(h(n)) dann gilt:
f(n) + g(n) = O(h(n))
Lösung:
aus der Voraussetzung geht hervor:
f(n) ≤ c0 h(n) ∀n > n0 und g(n) ≤ c1 h(n) ∀n > n1
f(n) + g(n) ≤ (c0 + c1 )h(n) ∀n > max(n0 , n1 )
Damit ist die Aussage bewiesen.
b) Gegeben Sei die folgende Rekursionsformel für die Funktion f(n).
1
für n = 0
f(n) =
a · f(n − 1) + b für n > 0 a > 0, b > 0 sind Konstanten
b.1) Lösen Sie diese Rekursionsformel auf.
Lösung:
f(n) =
=
=
=
af(n − 1) + b
a(af(n − 2) + b) + b
a(a(af(n − 3) + b) + b) + b
a3 f(n − 3) + a2 b + ab + b
Vermutung:
n
f(n) = a + a
n−1
b+a
n−2
n
b + . . . ab + b = a + b
n−1
X
ai
i=0
b.2) Beweisen Sie die Richtigkeit Ihrer Lösung mit vollständiger Induktion.
Lösung:
Induktionsanfang n = 0:
a0 + b
−1
X
ai = a0 = 1
i=0
Induktionsannahme: Die Formel stimmt für n
Induktionsschritt:
f(n + 1) = af(n) + b nach Induktionsannahme gilt
!
n−1
X
= a an + b
ai + b
i=0
= an+1 + b
= an+1 + b
n
X
i=1
n
X
i=0
Damit ist die Behauptung bewiesen.
5
ai + ba0
ai
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
c) Gegeben sei die folgende Prozedur
public int proc(int n) {
if (n < 2) {
return 1;
} else {
return proc(n-1) + proc(n-2);
}
}
Bestimmen Sie die Komplexität dieser Methode (gezählt werden die rekursiven Aufrufe von proc).
Lösung:
Die folgende Rekursionsformel zählt die Anzahl rekursive Aufrufe der Prozedur.
0
für n < 2
A(n) =
2 + A(n − 1) + A(n − 2) für n ≥ 2
A(n) ist monoton steigend daher können wir in der Formel A(n − 1) durch A(n − 2)
ersetzen und erhalten die folgende Abschätzung:
A(n) ≥ 2 + 2 · A(n − 2)
= 2 + 4 + 4 · A(n − 4)
= 2 + 4 + 8 + 8 · A(n − 6)
n
=
2
X
2i
i=1
n
+1
2
−2
= 2
√ n+1
≥ ( 2)
Ersetzen wir nun in der Formel A(n − 2) durch A(n − 1), so erhalten wir analog die
folgende Abschätzung:
A(n) ≤ 2n+1
Die Anzahl rekursive Aufrufe ist also exponentiel
√
A(n) = xn+1 mit
2≤x≤2
Aufgabe 5
Gegeben sei ein sequentielles File von n ganzen Zahlen. Im Hauptspeicher können maximal
m < n Zahlen gleichzeitig gespeichert werden.
Skizzieren Sie einen Algorithmus, der die k kleinsten Zahlen aus diesem File selektiert. Dabei
gilt immer k ≤ m, so dass die k kleinsten gesuchten Zahlen im Hauptspeicher Platz haben.
Das File darf nur einmal durchgelesen werden.
Lösung:
Wir können einfach mit einem Heap von k Elementen arbeiten. Nachfolgend der Algorithmus:
6
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
1. Einlesen der k ersten Elemente und einfügen im Heap.
2. Solange noch Elemente im File
3. Einlesen des nächsten Elements aus dem File und aus dem Heap. Das kleinere der
beiden Elemente wird wieder in den Heap eingefügt. Weiterfahren bei Punkt 2.
Am Ende des Algorithmus sind im Heap die k kleinsten Elemente gespeichert.
Aufgabe 6
Gegeben sei ein Heap das 31 Elemente enthält, wobei die Priorität für alle Elemente verschieden ist.
a) An welchen Positionen kann das Element mit der drittgrössten Priorität in diesem Heap
vorkommen?
Lösung:
Da alle Prioritäten verschieden sind, kann das Element nicht bei der Wurzel vorkommen (grösstes Element). Wegen der Transitivität der Ordnungsrelation kann das Element im Baum höchstens die Tiefe 2 haben. Das heisst, das Element kann auf der Tiefe
1 vorkommen. Das Element kann auch auf der Tiefe 2 des Baumes vorkommen, wie
die folgende Abbildung zeigt.
100
90
80
60
85
50
70
drittgösste Priorität
b) An welchen Positionen kann das Element mit der drittkleinsten Priorität in diesem
Heap vorkommen?
Lösung:
Das Element kann in der untersten Schicht des Baumes vorkommen. Es kann aber
auch in der zweitletzten Schicht vorkommen, wie die folgende Abbildung zeigt. In der
drittletzten Schicht kann das Element aber nicht vorkommen. Da bei 31 Elementen
der binäre Baum vollständig ist, hat jeder Knoten in der drittletzten Schicht genau drei
Nachfolger, die alle eine kleinere Priorität haben.
3
1
drittkleinste
Priorität
2
6
9
......
4
5
7
8
Begründen Sie ihre Antworten.
Aufgabe 7
Aufgaben zu den Suchverfahren
a) Gegeben Sei der Rot-Schwarz-Baum in der Abbildung 1 (Rote Verbindungen sind mit
einem dicken Strich gezeichnet).
7
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
L
G
R
E
I
A
F
O
U
N
H
P
Abbildung 1: Ein Rot-Schwarz-Baum
a.1) Zeichnen Sie zum Baum in der Abbildung 1 einen entsprechenden 2-3-4-Baum.
Lösung:
G
A
E
F
L
H
R
I
N
O
P
U
a.2) Wie sieht der Baum in der Abbildung 1 aus, wenn der Schlüssel M eingefügt
wird?
Lösung:
L
G
R
E
A
I
F
O
N
H
U
P
M
a.3) Wie sieht der Baum aus, wenn anschliessend der Schlüssel U gelöscht wird?
Lösung:
L
G
O
E
A
I
F
H
N
M
R
P
b) Entscheiden Sie, welche der folgenden Aussagen über Rot-Schwarz-Bäume wahr sind
und welche nicht. Wenn Sie denken, dass die Aussage falsch ist, so geben Sie ein
Gegenbeispiel an sonst begründen Sie wieso die Aussage wahr ist.
8
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
b.1) Ein Unterbaum eines Rot-Schwarz-Baumes ist selbst wieder ein Rot-SchwarzBaum.
Lösung:
Nein: Die Wurzel eines Unterbaumes kann rot sein also kann die Wurzeleigenschaft des Baumes verletzt sein.
b.2) Ein externer roter Knoten hat entweder keinen Bruder oder der Bruder ist auch
rot.
Lösung:
Ja: Falls der Knoten rot ist und sein Bruder schwarz, so bilden der rote Knoten und sein Vorgänger im entsprechenden 2-3-4-Baum einem 3-Knoten und der
schwarze Bruder ist ein Nachfolger dieses Knotens. In diesem Fall muss aber
der rote Knoten zwei schwarze nachfolger haben und kann daher kein externer
Knoten (Blatt) sein.
b.3) Zu einem gegebenen 2-3-4-Baum gibt es genau eine Darstellung als Rot-SchwarzBaum.
Lösung:
Nein: In der folgenden Abbildung sind für einen 2-3-4-Baum zwei verschiedene
Darstellungen gegeben.
40
70
70
40
70
40
b.4) Beim Einfügen eines Knotens im Rot-Schwarz-Baum ist höchstens eine Restrukturierungsoperation notwendig.
Lösung:
Ja: Nach der Restrukturierung ist der Knoten mit dem betragsmässigen mittleren
Schlüssel der Vorgänger der beiden anderen Knoten und ist schwarz. Daher kann
sich in diesem Fall das “doppel rot” Problem nicht mehr nach oben im Baum fortpflanzen und das Einfügen des Knotens ist nach einer Restrukturierung beendet.
c) Gegeben sei eine Hashtabelle der Länge n, die mit “double hashing” aufgebaut wird.
Zum löschen eines Elementes an der Hashadresse A mit dem Keyeintrag k wird nun
der folgende Algorithmus verwendet:
1. Suche bei den Adressen (A+hash2 (k)) mod n, (A+2·hash2 (k)) mod n, . . .
bis ein leeres Element mit Adresse A1 gefunden wird.
2. Suche bei den Adressen (A1 −hash2 (k)) mod n, (A1 −2·hash2 (k)) mod n, . . .
bis ein Element mit Adresse A2 und Schlüssel k1 gefunden wird, so dass hash1 (k) =
hash1 (k1 ) gilt.
3. Füge den Key k1 an der Adresse A (zu löschendes Element) ein und markiere das
Element an der Adresse A2 als leer.
9
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
c.1) Welches Problem möchte man mit Hilfe dieses Algorithmus lösen?
Lösung:
Beim double hashing wird der Platz eines gelöschten Schlüssels als “gelöscht”
und nicht als “leer” markiert, da man sonst beim Suchen nicht mehr alle Schlüssel finden würde. Wenn in der Tabelle viele Schlüssel gelöscht werden, so wird
dadurch die Suche erheblich verlängert. Mit dem obigen Algorithmus wird versucht, den gelöschten Platz wieder mit einem Schlüssel zu belegen und damit
dieses Problem zu lösen.
c.2) Kritisieren Sie diesen Algorithmus?
Lösung:
Der Algorithmus funktioniert so nicht. Zwar ist der Suchweg für alle Schlüssel k1
mit hash1 (k1 ) = hash1 (k) nirgends unterbrochen, aber der Suchweg für andere
Schlüssel kann unterbrochen werden. Siehe dazu die folgende Abbildung.
Key1
A
k
k1
(A + Hash2(k) mod n
Hash1(k1)=Hash1(k)
k1
leer
(A + 2 * Hash2(k) mod n
k2
k2
Key2
leer
(A + 3 * Hash2(k) mod n
leer
Key2 wird jetzt nicht mehr
gefunden.
Aufgabe 8
Gegeben sei der gerichtete und gewichtete Graph G in der Abbildung 2.
22
1
23
2
10
8
5
12
8
0
3
15
3
7
23
5
6
4
1
Abbildung 2: Der Graph G
a) Bestimmen Sie die Postordernummerierung der Knoten des Graphen G.
Lösung:
Wir führen im Graphen eine Tiefensuche durch und erhalten so die Postordernummerierung.
10
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
7
0
5
4
2
1
1
6
6
2
3
5
3
4
b) Wieso existiert für diesen Graphen keine topologische Sortierung?
Lösung:
Zwischen dem Knoten 5 (Postordernummer 3) und dem Knoten 0 (Postordernummer
7) existiert eine Rückwärtskante. Das heisst, der Graph ist zyklisch und daher existiert
keine topologische Sortierung.
c) Welche Kanten muss man aus dem Graphen entfernen, damit dieser azyklisch wird?
Lösung:
Wir entfernen die beiden Rückwärtskanten 5 7→ 0 und 4 7→ 1 und erhalten den folgenden azyklischen Graphen.
22
1
23
2
10
8
5
8
0
3
3
7
23
5
6
4
1
d) Bestimmen Sie in G die kürzesten Pfade vom Knoten 0 nach allen anderen Knoten des
Graphen G mit Hilfe des Algorithmus von Dijkstra.
Lösung:
gesetzt
0
6
3
5
4
1
2
Menge S
0
0,6
0,6,3
0,6,3,5
0,6,3,5,4
0,6,3,5,4,1
0,6,3,5,4,1,2
dist(1)
23/0
23/0
23/0
23/0
23/0
23/0
23/0
dist(2)
∞
∞
∞
∞
∞
45/1
45/1
Die kürzesten Pfade:
(0, 1) (0, 1, 2) (0, 3) (0, 3, 4) (0, 6, 5) (0, 6)
11
dist(3)
8/0
8/0
8/0
8/0
8/0
8/0
8/0
dist(4)
∞
∞
11/3
11/3
11/3
11/3
11/3
dist(5)
∞
8/6
8/6
8/6
8/6
8/6
8/6
dist(6)
7/0
7/0
7/0
7/0
7/0
7/0
7/0
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
Aufgabe 9
Gegeben seien ein Text str der Länge n und ein Muster muster der Länge m:
a) Ändern Sie den Algorithmus von Knuth-Morris-Pratt so ab, dass alle Vorkommen des
Musters im Text gefunden werden. Die Komplexität des Algorithmus soll dabei immer
noch O(n + m) sein. (Achtung: Überlappende Muster im Text sollen auch gefunden
werden):
Lösung:
Wenn eine Übereinstimmung gefunden wird, so wird der entsprechende Index in einem
Array gespeichert. Der Algorithmuss kann dann mit i = i + 1 und j = Instead of
returning when a match is found, store the index and set i = i + 1 and j = next(m).
b) Geben Sie einen Algorithmus an, der mit Komplexität O(n+m) den längsten Prefix des
Musters im Text findet.
Lösung:
Die Aufgabe kann mit Hilfe von Knuth-Morris-Pratt gelöst werden. Nachstehend ist
der modifizierte Algorithmus angegeben.
public class KMP {
public static int[] searchPattern(String str, String muster) {
int next[] = initnext(muster);
int n = str.length();
int m = muster.length();
int j = 0, i = 0;
int result[] = new int[2];
/*
* Neue Variablen
*/
int maxLen = 0;
int maxIndex = -1;
while (i < n && maxLen < m) {
System.out.println(i + " " + str.charAt(i));
if (str.charAt(i) == muster.charAt(j)) {
if (j == m - 1) {
maxLen = m;
maxIndex = i - m + 1;
}
++i;
++j;
}
else if (j > 0) {
if (j > maxLen) {
System.out.println(j);
maxLen = j;
12
Hochschule für
Technik und Informatik HTI
A&D Prüfung
c P. Fierz
maxIndex = i - j;
}
j = next[j];
} else {
++i;
}
}
result[0] = maxIndex;
result[1] = maxLen;
return result;
}
}
13
Herunterladen