Algorithmen und Programmierung III 

         WS 2002/2003                   Übung  5                          H. Schweppe
        

        Ausgabe: 14.11.2002
        Abgabe:   26.11.2002 

Aufgabe 5.1 ( 17   P)  
 In Aufgabe 3.3 wurde ein abstrakter Datentyp "Polynom " als Java-Interface definiert. Ziel dieser Aufgabe ist die Implementierung von Klassen, die dieses Interface implementieren. 
a) (6) Als Repräsentation eines Polynoms vom Grad n soll ein Feld 
float[] coeff  mit n+1 Elementen gewählt werden, das die Koeffizienten aufnimmt. Die Variable int degree  gibt den Grad an. Beispiel:  3.5 * x3 + 2*x +5.1  hat die Darstellung   coeff == {3.5, 0, 2.0, 5.1} , degree == 3.
Es werden also keine führenden Nullen dargestellt. Damit ist degree eigentlich redundant (wieso?). Implementieren Sie das Interface für diese Repräsentation. 
b) (3) Geben Sie die Abstraktionsfunktion und die Repräsentationsinvariante an. 
c) (1) Begründen Sie informell, warum Ihre Implementierung der Methoden die Repräsentationsinvariante einhält.
d) (3) Schlagen Sie eine speichereffektivere Repräsentation für Polynome vor, bei denen viele Koeffizienten 0 sind ("dünn besetzte Polynome"). Beispiel:  2.0 *x23 + 2.5*x 
e) (4) Auch hierfür sind Abstraktionsfunktion und Repräsentationsinvariante gesucht. 
Hinweis: Für die Multiplikation und Addition von Polynomen  sollen Operanden mit unterschiedlicher Repräsentation (a bzw. d) zugelassen sein. Das Ergebnis wird gemäß a) repräsentiert.  Der Quellcode für ein Interface Polynom steht im Netz. 

Aufgabe  5.2 ( 4   P)  
Die Vektordarstellung von
IntSet (siehe VL  class IntSet1) soll so verändert werden, dass keine  Werte mehrfach vorkommen. 
a) (3) Wie ändern sich Repräsentationsinvariante bzw. Abstraktionsfunktion?
b) (3) Reimplementieren Sie die Repräsentation (ursprüngliche Implementierung  hier im Web).

Aufgabe 5.3 ( 3  P)  

Gegeben sei eine Klasse Counter mit folgenden Methoden: 

public class Counter {
// model:  int count >= 0    
// inv: getCount() >= 0
 private int count;
     // happens to to be identical to model

   public Counter(){ ... }      //effects: makes count = 0
   public int getCount(){ ... } //effects: return the value of count
   public void inc(){ ... }     //effects: count = COUNT +1 
}
 
Betrachte jetzt 2 mögliche Unterklassen Counter2 und Counter3 mit den folgenden zusätzlichen Operationen:

public class Counter2 {
// inv: count >= 0
  public Counter2(){ ... } //effects: makes count = 0
  public void inc(){ ... } //effects: count = 2*COUNT
}
und
public class Counter3 {
    // inv: count >= 0
  
public Counter3(int k ){ ... } //effects: makes count contain k
   public void inc(int k){ ... }  //effects: if count >= k     
                                  //
           count = COUNT - k 
}

Entscheiden und begründen Sie, ob Counter2 bzw. Counter3 legitime Unterklassen von Counter im Sinne der Vererbung von Spezifikationen sind.

Aufgabe 5.4 ( 4 P)  
Wir gehen von einer Implementierung von Vektoren mit Hilfe von Feldern aus.  In den Vektor wird immer am Ende eingefügt. Ist kein Platz mehr vorhanden, wird das Feld der Größe m durch Kopieren in eines der Größe   f(m) überführt (in der VL war  f(m) =m+ const   bzw. im Fall der Verdopplung f(m) =2* m ). 
Zeigen Sie, dass die Laufzeit T(n) zum Einfügen von n  Werten  bei Vergrößerung des Vektors um jeweils éÖ m ù   O(n 3/2 ) ist.
éÖ m ù   bezeichnet die nächstgrößere ganze Zahl von Wurzel aus m .

Aufgabe 5.5 ( 8 P)  
a) (1) Geben  Sie eine Implementierung  der Operation 
next für Schlangen von Booleschen Werten auf der Basis der in der VL definierten Repräsentation an. (next liefert das nächste Schlangenelement, verändert die Schlange aber nicht , siehe Spezifikation). 
b)(2) John Dump beschließt, das
interface Stack  um eine Operation  zu erweitern. Warum ist das eine sehr schlechte Idee? (Hinweis: Noch schlimmer ist es, eine Operation zu entfernen. Also:   Quidquid agis, prudenter agas et respice finem - was du auch tust,  tu's klug und bedenke das Ende) 
c) (1) J.D. vertritt die Auffassung, dass das Maximale, was man mit Datenabstraktion erreichen kann, der Schutz der Implementierung eines Typs vor Änderungen durch ein Klientenprogramm ist. Kommentieren Sie die Auffassung. 
d) (0,5) In Ausnahmefällen kann ein Java-Interface die Implementierung einer Methode enthalten. Ja / Nein? 
e) (1,5)  Ein Interface in Java stellt niemals einen Konstruktor zur Verfügung. Ja/ Nein mit Begründung.
f)  (2) Implementieren Sie die Haskell-Funktion
size :: S t -> Int für die in der Vorlesung angegebene Repräsentation (mehrfach vorkommende Werte in der Repräsentation erlaubt).

36 Punkte.