Theoretische Informatik I

Werbung
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?
Herunterladen