Algorithmen und Datenstrukturen Hochschule RheinMain
Sommersemester 2014 Prof. Dr. Steffen Reith
7. Übungsblatt
Hinweis: neben den hier beschriebenen Aufgaben müssen Sie Ihre vollständige Implementierung von Mergesort und die Implementierung von FString prä- sentieren können!
Aufgabe 1 (Basissort)
Im folgenden wollen wir Zahlen in Dezimaldarstellung ohne paar- weises Vergleichen sortieren. Nehmen Sie an, dass Sie 10
”Haufen“ H0 bis H9 haben und gehen Sie wie folgt vor:
i) Sortieren Sie alle Zahlen nach der letzten Ziffer (Ziffer mit dem niedrigsten Stellenwert). Legen Sie dazu alle Zahlen die mit 0 enden in den Haufen H0, alle die mit 1 enden in Haufen H1 usw. Reihen Sie dann die Haufen H0, H1 usw. zu einer neuen Zahlenfolge (Konkatenation).
ii) Nehmen Sie die Zahlenfolge aus dem letzten Schritt und führen Sie das gleiche Verfahren aus, nehmen Sie nun aber die vorletzte Ziffer der Zahl (z.B. 34523 kommt in Haufen H2).
iii) Wiederholen Sie die Schrittei)bzw. ii)bis Sie die höchstwertige Ziffer bearbeitet haben. Nun ist Ihre Zahlenfolge sortiert.
Beobachtung: Dieses Vorgehen funktioniert natürlich auch mit je- der anderen Zahlendarstellung, d.h. insbesondere mit Binär- oder Hexadezimalzahlen.
7260 9019 4816 8926 0690 3276 1230 0823 1202 5621
• Sortieren Sie die angegeben Zahlen mit dem oben beschriebenen Verfahren von Hand und geben Sie auch alle Zwischenschritte an.
• Zeichen Sie ein Struktogramm für Algorithmus 1.
• Implementieren Sie dieses Verfahren mit Hilfe von C (AI) oder Ruby (WI), um natürliche Zahlen zu sortieren.
Data: Feld A mit n Komponenten
Result: Sortiertes Feld A′ mit A′[0]≤A′[1]≤A′[2]≤ · · · ≤A′[n−1]
begin Fach0[n];
Fach1[n];
/* Bearbeite alle Bits der Zahlen */
for(i = 0 to #Bits ) do for (j = 0 to n ) do
if ((Das i-te Bit des A[j])=0) then lege A[j]in das Fach0;
else
lege A[j]in das Fach1;
end end
/* Verbinde Fach0 und Fach1 (Concat) */
A = Fach0 || Fach1;
end return A;
end Algorithm 1: BasisSort
• Bestimmen Sie die Laufzeit von Algorithmus 1 in Abhängigkeit von der Anzahl der zu sortierenden Zahlen.
Hinweis: Natürlich gilt #Bits = log2(A[i])für 0≤ i ≤ n−1, d.h. die- se Zahl ist für einen gewählten Datentyp (z.B. int) konstant. Bei Ruby richtet sich #Bits einfach nach der größten Zahl, die Ihr Pro- gramm nach sortieren kann, z.B. 32 bei Zahlen < 232.
Aufgabe 2 (Rekursion und Strings)
Implementieren Sie eine rekursive Funktion reverse (ohne for- Schleifen), die einen beliebigen String umdreht.
Eine C-Implementierung darf kein malloc verwendet. Dabei muss der Funktion mit rstr schon ein Pointer auf einen ausreichend großen Speicherblock übergeben werden. Als einzige Funktion aus string.h darf strlen verwendet werden.
Für Ruby sind diese Einschränkungen unnötig!
Aufgabe 3 (O-Notation)
Für die Teilaufgaben (a) und (b) ist eine Begründung nicht notwen- dig.
1. Gegeben sind die folgenden acht Funktionen:
2
i
gi(n) log(3logn) 1 23n 3n2 22n 2n2n7+102 log5n nlnn
Füllen Sie die obere Zeile der Tabelle mit Zahlen von 1 bis 8 so aus, dass dann gi(n) ∈ O(gi+1(n)) gilt, wenn 1≤ i ≤ 7.
2. Weiterhin sind die folgenden vier Funktionen gegeben:
• f(n) = 1 + 2n+ 3n+ 4n2+ 5n3
• g(n) = 20n5n8+3n6 2
• h(n) = (n+ 42)5 +log2n
• k(n) = 2log2(3n+7)
Füllen Sie die folgenden leeren Boxen mit Symbolen aus der Menge {∈,̸∈,⊆,⊇} so, dass sich korrekte Aussagen ergeben:
k(n) O(11·g(n)) g(n) O(f(n)) O(h(n)) O(k(n)) O(f(n)) O(h(n))
3. Geben Sie die Menge aller Funktionen in O(2n) an. Warum ist die Funktion 3n nicht in dieser Menge enthalten?
Hinweis: Nehmen Sie an, dass 3n ∈ O(2n) und versuchen Sie mit der dann geltenden Ungleichung einen Widerspruch zu er- zeugen.
Die Abnahme der Lösungen zu diesen Aufgaben findet erst in der KW 23 ab dem 5. Juni 2014 nach der Vorlesung statt. Die Termine für die WI-Gruppen gibt Herr Werntges bekannt!
3