Lösungsskizzen zur Prüfung

Werbung
UA DI H.M. Burgsteiner
17.5.2004
Lösungsskizzen zur Pr üfung
(1)
(a) Es werden genau n − 1 Schritte benötigt. Die Behauptung ist, dass pro Durchgang die Größe des Feldes um genau 1 abnimmt. Der Beweis erfolgt durch
Induktion:
(i = 1):
t = 1 + b(n − 1) ·
n−1−1
c=1
n2 − 1
(i − 1 → i): Es genügt zu zeigen, daß
(n − i)
x − A[i]
<1
A[n] − A[i]
gilt, denn dann wird durch die Abrundung (b, c) das verbleibende Feld nur
um 1 Element verkleinert:
(n − i)
x − A[i]
n−1−i
n−1−i
= (n − i) 2
< (n − i) 2
=
A[n] − A[i]
n −i
n − i2
= (n − i)
n−1−i
n−1−i
=
< 1.
(n − i)(n + i)
n+i
Das Ungleichheitszeichen gilt, da n > 1, i > 1, n > i ist und der Nenner
somit kleiner wird: n2 − i > n2 − i2 .
(b) Nur Werte, die durch die Interpolation exakt berechnet werden, werden in
einem Schritt gefunden. Dies sind im gegebenen Fall nur die Stützpunkte der
Geraden, also x1 = A[1] = 1 und x2 = A[n] = n2 . Alle anderen Werte werden
wie oben gezeigt, nach 2 ≤ i ≤ n − 1 Schritten gefunden.
(2) Siehe Skriptum Seiten 42-47.
(3) (a) Heap-Sort benötigt unabhängig von der Anordnung der Elemente immer O(n log n)
Zeit. (b) Insertion-Sort arbeitet die ersten 9n
Einträge in linearer Zeit ab. Für die
10
n
Elemente kann es sein, daß jedes Element davon mit im Schnitt n2
restlichen 10
n
anderen Verglichen wird. Daraus ergibt sich eine Laufzeit von 10
· n2 = O(n2 ). (c)
Quicksort mit dem ersten Elemente jedes Teilfeldes als Pivotelement benötigt in
diesem Fall ebenso O(n2 ) Zeit, da die Teilfelder aufgrund der Vorsortierung sehr
ungünstig geteilt werden (siehe Worst-Case bei Quick-Sort im Skriptum).
Daraus resultiert, daß in diesem Fall Heap-Sort am besten geeignet ist.
(4) Alles was der Algorithmus als Input ”sieht” ist die Wurzel des gegebenen Binärbaumes. D.h. der Algorithmus hat a priori keine Ahnung davon, wieviele Blätter dieser
Binärbaum nun hat, oder in welcher Tiefe sich diese befinden. Ebenso wenig ist
bekannt, ob es sich hierbei um einen sortierten Binärbaum handelt. Alle Ansätze
mit
for i=1 to n
GeheZuBlatt(i)
SpeichereTiefevonBlatt(i)
end
werden damit scheitern! Gelöst werden kann dieses Problem z.B. mit einem Algorithmus ähnlich wie bei der Ausgabe der symmetrischen Reihenfolge: Initialisiere
ein boolsches Feld A der Größe n mit F ALSE. Gehe die Knoten z.B. in SR durch,
merke die Rekursionstiefe (=Tiefe eines eventuellen Blattes) und teste in jedem
Knoten ob er weitere Söhne hat. Wenn nicht ist es ein Blatt und ich teste ob in dem
boolschen Feld an der Position A[Tiefe] F ALSE steht. Wenn ja, markiere dieses
mit T RU E, wenn nicht, gibt aus ”Gefunden” und brich ab.
Die Initialisierung des Feldes A benötigt Θ(n) Zeit. Da jeder Knoten nur maximal
einmal besucht und dabei getestet wird läuft dieser Algorithmus inklusive Initialisierung in O(n) Zeit. Ebenso verhält es sich mit dem Speicherbedarf: Θ(n) Speicher
für das Feld A, Θ(n) Speicher für die Rekursionen.
Dieser Algorithmus arbeitet offensichtlich korrekt: die Tiefe eines Blattes entspricht
der jeweiligen Rekursionstiefe. Jedes existierende Blatte wird in dem Feld A markiert. Sobald ein zweites Blatt mit identischer Tiefe gefunden wird, bricht der Algorithmus ab, sonst wird die Existenz eines Blattes auf der neuen Tiefe markiert.
Herunterladen