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.