Fakultät für Informatik Professur Theoretische Informatik und Informationssicherheit Prof. Dr. Hanno Lefmann Wintersemester 2002/03 13. November 2002 Theoretische Informatik I 5. Übung Aufgabe 1 Gegeben seien zwei positive ganze Zahlen x und y. Betrachten Sie den folgenden Algorithmus. Algorithmus ggT 1. Seien a := x und b := y. 2. Solange a 6= b ist, 2.1. Falls a < b ist, 2.1.1. finde das größte ganzzahlige k > 0 mit ak < b 2.1.2. b := b − ak. 2.2. Sonst (d.h. b < a) 2.2.1. finde das größte ganzzahlige k > 0 mit bk < a 2.2.2. a := a − bk 3. Gib a als Ergebnis aus. (a) Zeigen Sie, dass dieser Algorithmus den größten gemeinsamen Teiler von x u. y berechnet. (b) Bestimmen Sie seinen größenordnungsmäßigen Laufzeitaufwand. Aufgabe 2 In einem Algorithmus soll ein sehr großes Integer-Array verwendet werden. Der Algorithmus verlangt, dass zu Beginn in allen Arraypositionen eine 1 steht. Einerseits dauert uns das Initialisieren des Arrays aber zu lange, andererseits kann in einem nicht-initialisierten Speicher natürlich beliebiger Unsinn ( Bitmüll“) stehen. In dieser Aufgabe geht es darum her” auszufinden, wie man ohne die aufwendige Initialisierung auskommen kann. Beim lesenden Zugriff auf eine Array-Position soll das Folgende passieren: • Falls der Algorithmus vorher einen Eintrag in diese Position geschrieben hat, dann wird dieser Eintrag ausgelesen. • Falls in diese Position noch nicht geschrieben wurde (es also Bitmüll“ enthält), wird eine ” 1 ausgelesen. Wie kann man ein solches Array so implementieren, dass ein (lesender oder schreibender) Zugriff auf ein Arrayelement Zeit O(1) kostet und dass wir beim lesenden Zugriff immer die richtigen Antworten zurückgeliefert bekommen? Das Rücksetzen“ des Arrays (jeder lesende ” Zugriff liefert wieder 1) soll ebenfalls nur Zeit O(1) kosten. Hinweis: Benutzen Sie eine Extradatenstruktur, in der steht, welche Positionen des Arrays schon echt beschrieben wurden. (Dort werden sozusagen Zeugen der Echtheit verwaltet.) Benutzen Sie außerdem eine Extrainformation in jeder Arrayposition, die ggf. auf den Zeugen verweist. Aufgabe 3 Betrachten Sie den naiven Algorithmus zum Topologischen Sortieren. Geben Sie eine Eingabe von n Paaren an, für die dieser Algorithmus quadratische Laufzeit hat. Aufgabe 4 Wir betrachten folgendes Rangierproblem“. Gegeben ist ein Eingabeband, auf ” dem die Zahlen 1 bis n stehen. Außerdem existiert ein Ausgabeband und ein Hilfsstack. Die Zahlen in der Eingabe sollen auf das Ausgabeband geschrieben werden. Dabei sind die Operationen Push bzw. Pop zulässig. Push bedeutet, dass man die erste (=linkeste) Zahl vom Eingabeband entfernt und auf den Stack legt. Pop bedeutet, dass man die oberste Zahl vom Stack nimmt und auf das Ausgabeband (von links nach rechts) schreibt. Siehe dazu auch folgendes Bild: Ausgabeband Eingabeband Push 1 2 3 4 n-1 n Pop Stack Die Permutationen sollen immer als Array gegeben sein. (a) Kann man mit diesem Verfahren jede Permutation (Reihenfolge) der Zahlen 1 bis n auf dem Ausgabeband erzeugen? (b) Falls die Antwort auf (a) ja ist: Geben Sie einen Algorithmus an, der zu einer vorgegebenen Permutation die passende Push-Pop-Folge ausgibt, z.B. (für n = 3) Push-Push-Pop-PopPush-Pop für die Permutation 2, 1, 3. Falls nein: Geben Sie einen Algorithmus an, der zu einer vorgegebenen Permutation entscheidet, ob es eine passende Push-Pop-Folge gibt, die diese Permutation erzeugt. (c) Was geschieht, wenn man anstelle des Stacks eine Queue nimmt und die Operationen Push und Pop entsprechend durch Enter und Remove ersetzt?