− 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:
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
c) Modifizieren Sie das hier abgedruckte Radix Exchange-Verfahren aus der Vorlesung, so dass es eine absteigend sortierte Liste liefert.
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)==0 && (i<j)) i++;
while (Z(A[j],b)!=0 && (j>i)) j--;
item = A[i];
A[i] = A[j];
A[j] = item;
}
if (Z(A[right],b) == 0) j++;
RadixSort (A,left, j-1,b-1);
RadixSort (A,j, right,b-1);
} }
− 4 −
2. Aufgabe: Löschen mit dem symmetrischen Vorgänger
Modifizieren Sie das Löschen in einem binären Suchbaum, das in der Vorlesung verwendet wurde so, daß im Falle eines Schlüsseltausches der symmetrische Vorgänger verwendet wird statt des symmetrischen Nachfolgers.
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;
} else
{ if ((*root)->right == NULL) { toDel = *root;
*root = (*root)->left;
} else
{ pred = PredsymSucc(*root);
if ( pred == *root ) { toDel = pred->right;
(*root)->key = pred->right->key;
(*root)->right = (*root)->right->right;
}
else
{ toDel = pred->left;
(*root)->key = pred->left->key;
pred->left = pred->left->right;
}
} }
cout << "\nKnoten " << delKey << " wird geloescht !\n\n";
delete toDel;
} } } }
Node *Tree::PredsymSucc (Node *node) { if (node->right->left != NULL)
{ node = node->right;
while (node->left->left != NULL) node = node->left;
}
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 ! 404
15
3 293
182
848
626 959
11 347 937
71 237
− 6 − 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
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.
70
90 144 60
156 178 92
80 82 64
30
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 ?
Index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
HashTabelle Einfüge-Schritt
Nr.
Anzahl der Kollisionen: _____________