Test-Aufgaben zu DA Serie 2
1. Aufgabe: Absteigende Sortierung mit dem Radix Exchange - Verfahren
a) Das Verfahren Radix Exchange Sort aus der Vorlesung soll so modifiziert werden, dass es eine Liste absteigend sortiert. Geben Sie eine kurze verbale Beschreibung des so modifizierten Verfahrens an:
Nach dem Wert der höchstwertigen Ziffer werden zunächst zwei Teillisten gebildet, so dass die linke alle ,,großen" und die rechte alle „kleinen" Elemente enthält.
Die beiden Teillisten werden nach der selben Methode weiter unterteilt bis Teillisten der Länge 1 entstanden sind. Die Gesamtliste ist dann absteigende sortiert.
b) Führen Sie das in a) beschriebene Verfahren anhand der folgenden Beispieldaten durch.
Erläutern Sie die Einzelschritte so, dass sich das Vorgehen nachvollziehen lässt. (zu ver- tauschende ltems unterstreichen, Kommentartext
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Kommentar:
1100 0111 1001 0110 1100 0100 0010 1000 0001 1110 höchstwertige Ziffer ist relevant 2x vertauschen: Spalten 2/10 und 4/8. I und j treffen sich in Spalte 6 1100 1110 1001 1000 1100 0100 0010 0110 0001 0111 zweithöchste Ziffer ist relevant
1. Teilliste: 1x vertauschen in Spalten 3/5. I und j treffen sich in Spalte 4
2. Teilliste: 1x vertauschen in Spalten 7/10. I und j treffen sich in Spalte 9
1100 1110 1100 1000 1001 0100 0111 0110 0001 0010 dritthöchste Ziffer ist relevant 1. Teilliste: 1x vertauschen in Spalten 1/2. I und j treffen sich in Spalte 2
2. Teilliste: unverändert 3. Teilliste: 1x vertauschen in Spalten 6/8. I und j treffen sich in Spalte 8
4. Teilliste: 1x vertauschen 1110 1100 1100 1000 1001 0110 0111 0100 0010 0010 letzte Ziffer ist relevant:
nur in der 3. und 4. Teilliste wird noch vertauscht
1110 1100 1100 1001 1000 0111 0110 0100 0010 0010 Ergebnis ist absteigend sortiert
c) Modifizieren Sie das hier abgedruckte Radix Exchange-Verfahren aus der Vorlesung, so dass es eine absteigend sortierte Liste liefert.
Es sind die markierten Stellen zu ändern:
unsigned Z(unsigned k, int i) { return (k >> i) & 0x0001;}
void RadixSort (int *A, int left, int right, int b) {
int i, j;
int item;
if ((left<right) && (b>=0)) { i = left; j = right;
while (i != j) {
while (Z(A[i],b)==1 && (i<j)) i++;
while (Z(A[j],b)!=1 && (j>i)) j--;
item = A[i];
A[i] = A[j];
A[j] = item;
}
if (Z(A[right],b) == 1) j++;
RadixSort (A,left, j-1,b-1);
RadixSort (A,j, right,b-1);
} }
2. Aufgabe: Löschen mit dem symmetrischen Vorgänger void Tree::deleteNode (int delKey)
{
delNode (&root, delKey);
}
void Tree::delNode (Node **root, int delKey) { Node *pred;
Node *toDel;
if(*root == NULL);
else
{ if (delKey < (*root)->key)
delNode (&((*root)->left), delKey);
else
{ if (delKey > (*root)->key )
delNode (&((*root)->right), delKey);
else
{ if ((*root)->left == NULL ) {
toDel = *root;
*root = (*root)->right; Nachfolger }
else
{ if ((*root)->left == NULL) {
toDel = *root;
*root = (*root)->right;
} else {
pred = PredsymPred(*root);
if ( pred == *root ) {
toDel = pred->left;
(*root)->key = pred->left->key;
(*root)->left = (*root)->left->left;
} else {
toDel = pred->right;
(*root)->key = pred->right->key;
pred->right = pred->right->left;
} } }
cout << "\nKnoten " << delKey << " wird geloescht !\n\n";
delete toDel;
} } } }
Node *Tree::PredsymPred (Node *node) {
if (node->left->right != NULL) {
node = node->left;
while (node->right->right != NULL) node = node->right;
}
return(node);
3. Aufgabe: AVL-Bäume
Verwenden Sie in den folgenden Teil-Aufgaben die Algorithmen aus der Vorlesung zum Löschen und Einfügen in AVL-Bäumen. Geben Sie bei den folgenden Aufgaben jeweils an:
– den Zwischenzustand nach dem Löschen – den Endzustand nach dem Ausgleich an.
– welche Ausgleichsoperation benutzt wurde und warum diese gewählt wurde (welche Situation der Fallunterscheidungen in der Vorlesung vorliegt).
Gegeben ist der folgende AVL-Baum B als Ausgangspunkt für jede der in a) und b) ge- forderten Operationen.
a) Löschen Sie den Schlüssel mit dem Wert 937 in dem obigen AVL-Baum B.
b) Fügen Sie den Schlüssel mit dem Wert 137 in den obigen AVL-Baum B ein.
c) Ein binärer Suchbaum hat 300 innere Knoten und die Höhe 12.
Kann dieser Baum ein AVL-Baum sein ? Begründen Sie Ihre Antwort !
zu a) Löschen von Schlüssel 937
Es liegt Fall 3.3 des Lösch-Algorithmus vor:
Es wird rechts gelöscht, der rechte Unterbaum war bereits vor dem Löschen schon kürzer und der linke Unterbaum von hat zwei verschieden hohe Unterbäume und den Balancie- rungsgrad +1.
Daher ist der Ausgleich mit einer Doppelrotation um die Wurzel zu bewerkstelligen mit dem folgenden Ergebnis:
293 15
3
404
182 848
626 959
11
347
71 237
404
15
3 293
182
848
626 959
11 347 937
71 237
zu b) Einfügen von Schlüssel 137
Einfügen dieses Schlüssels liefert zunächst den folgenden Baum:
Der erste nicht ausgeglichene Teilbaum ist der mit der Wurzel 293,
Es liegt der Fall 3.1. vor: Es wurde in den linken Unterbaum von 293 eingefügt und dieser war vorher schon höher als der rechte. Der Linke Unterbaum wurde dabei nach links verlän- gert .
Der Ausgleich ist also mit einer einfachen Rotation möglich:
zu c)
Ein AVL-Baum der Höhe h=12 hat mindestens F13 = 377 Blätter und damit F13-1=376 inne- re Knoten. Daher kann ein Baum mit 300 Knoten und der Höhe 12 kein AVL-Baum sein.
404 15
3 293
182
848
626 959
11 347 937
71 237
137
404 15
3 182
848
626 959
11 71 293 937
137 237 347
4. Aufgabe: B-Bäume
a) Für den Zugriff auf die Sätze in einer Datei soll eine B-Baum-Struktur der Ordnung 100 verwendet werden. Wieviele Datensätze können höchstens verwaltet werden, wenn die Höhe des B-Baumes dabei maximal 4 werden darf ? Begründen Sie Ihre Antwort
Nach Vorlesung gilt für die Höhe eines B-Baums die Abschätzung: m
log( N + ≤ 1) h
Es ist dabei– m = Ordnung des B-Baums = 100, – N die Anzahl der Schlüssel und – h=4 die Höhe
also gilt stets: 100
log( N + ≤ 1) 4
Wegen 10
10
log( ) log( )
log( )
m
z z
= m
erhalten wir 100 10 10
10
log( 1) log( 1) log( 1)
log(100) 2
N N
N + +
+ = =
also 10
log( N + ≤ 1) 4*2 8 =
oderN + ≤ 1 10
8D.h. der Baum kann 100 Mio Schlüssel aufnehmen.
b) Löschen Sie in dem folgenden B-Baum der Ordnung m=3 das Item mit dem Schlüssel 60 unter Zuhilfenahme des symmetrischen Vorgängers. Geben Sie dabei die Zwischen- schritte so an, so daß Ihr Vorgehen nachvollziehbar wird und erläutern Sie kurz jeden Schritt.
Schlüsseltausch mit Schlüssel 30 liefert einen Unterlauf:
70
90 144 60
156 178 92
80 82 64
30
70
90 144 30
156 178 92
80 82 64
Durch Mischen der drei beteiligten Knoten ergibt sich ein Unterlauf in dem Knoten, der 50 enthielt:
Diesen Unterlauf lösen wir durch Ausgleichen auf:
70
90 144
156 178 92
80 82 30 64
90
144 70
156 178 92
80 82 30 64
5. Aufgabe: Hashing mit der Kollisionsstrategie „Random Probing“
Die Kollisionsstrategie „Random Probing“ verwendet im Kollisionsfall eine Folge von Hash- Funktionen, die wie folgt definiert ist:
H
o(k)= k mod m
H
i(k)= (H
o(k) + r
i) mod m für i = 1, 2, 3, ...
Dabei werden die
r
i einer Folge von Zufallszahlen entnommen, die mit dem folgenden Zu- fallszahlengenerator erzeugt werden:r
o= 4
r
i+1= (1 +11∗r
i) mod m für i = 0, 1, 2, 3, ...
Für das Folgende wählen wir für die Tabellengröße m=17.
a) Verwenden Sie diese Methode, um die Buchstaben des Textes R A N D O M P R O B I N G
in die unten stehende Hash-Tabelle einzuordnen. Die Buchstaben der Zeichenfolge sollen einzeln in der Reihenfolge, in der sie im Text vorkommen, in die Hash-Tabelle eingeordnet werden. Gehen Sie dazu von der folgenden Zuordnung der Buchstaben zu numerischen Werten aus:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
b) Markieren Sie dabei die Positionen, an denen Kollisionen auftreten.
c) Wie viele Kollisionen treten insgesamt auf ?
Die Random-Folge ri beginnt so:
r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 ... ... ... ...
11 3 0 1 12 14 2 6 16 7 10 9 15 ... ... ... ...
Die Hash-Tabelle wird wie folgt belegt:
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
HashTabelle R R I D B G N O A M N O P Einfüge-Schritt
Nr. 1 8 11 4 10 13 12 9 2 6 3 5 7
Anzahl der Kollisionen: 10
Nebenrechnungen dazu:
R: