UA DI H.M. Burgsteiner 27.1.2005 Lösungsskizzen zur Prüfung (1) Laufzeit des ursprünglichen Algorithmus: 2n3 . Mögliche Verbesserungen der Laufzeit durch: a) 2n3 8 2 = n3 4 b) 3n c) 3n + 2( n2 )3 = 3n + n3 4 Möglichkeit c) bringt in diesem Fall keine Verbesserung im Vergleich zu a). c) ist in jedem Fall um 3n langsamer als a). Deshalb wird c) nicht weiter berücksichtigt. Ab wann ist b) besser als a)? a)=c) n3 = 3n2 4 n = 12 Wertebereiche: 1 ≤ n ≤ 11 . . . a) ist schneller n = 12 . . . a) und b) sind gleich schnell n ≥ 13 . . . b) ist schneller D.h. für grössere Datenmengen ist in jedem Fall Variante b) zu bevorzugen! (2) Ja, diese Rekonstruktion ist möglich, da wir von einem sortierten Binärbaum ausgehen. D.h. nachdem ich weiss, dass bei der HR die Wurzel an erster Stelle steht, kann ich die restlichen Elemente leicht in linken und rechten Teilbaum aufspalten, indem alle Elemente die kleiner als die Wurzel sind zum linken Teilbaum gehören, alle anderen Elemente zum rechten Teilbaum. Wobei die jeweiligen Elemente natürlich nebeneinander stehen müssen, d.h. es muss eine klare Grenze zwischen den kleineren und den grösseren Elementen bestehen! Daraus lässt sich rekursiv leicht der gesuchte Binärbaum konstruieren (wenn dies aufgrund der Reichenfolge prinzipiell möglich ist!). (3) Es kann z.B. ein Heap mit Grösse k als Datenstruktur verwendet werden. Dabei ist von Vorteil, dass das Verhalden eines Elementes in O(log k) Zeit funktioniert und dass das grösste Element immer an erster Stelle steht. Das bedeutet, man kann in O(1) Zeit das grösste der gespeicherten Elemente finden. Der Algorithmus kann damit einfach wie folgt aussehen: * Initialisiere den Heap mit den ersten k Zeichen die online eingelesen werden. Der Aufbau dieses Heap geschieht in O(k) Zeit. * Für jedes weiter Element prüfe, ob es grösser als die aktuelle Wurzel ist (O(1)). Wenn nein: Ersetze Wurzel durch neues Zeichen und Verhalde dieses (O(log k) Zeit). Wenn ja: verwerfe das neue Zeichen (es ist grösser als die bisherigen k kleinsten). Die benötigte Gesamtzeit dieses Algorithmus ist O(n log k) (es wird maximal n mal ein Zeichen in O(log k) Zeit verhaldet). Der Speicherbedarf ist O(k), denn es ist maximal konstanter grosser Zusatzspeicher (etwa zum Zwischenspeichern eines Zeichens) in Verwendung. (4) Diese Aufgabe entspricht dem Problem der optimalen Codierung und kann mit diesem Ansatz gelöst werden. In diesem Fall sind lediglich nicht die Anzahl der zu übertragenden Bytes, sondern der zu kopierenden Records gefragt. Die Reihenfolge der zu kopierenden Paare von CDs ergibt sich dann aus dem entstehenden Optimierungsbaum. Gleichzeitig erbigt die Summe der inneren Knoten die Anzahl der insgesamt kopierten Records, in diesem Fall 2310.