Technische Universität München Fakultät für Informatik Prof. Dr. M. Broy SS 2002 Übungsblatt 2 25. April 2002 Übungen zu Einführung in die Informatik II Aufgabe 5 Sortieren durch Einfügen Ziel dieser Aufgabe ist die Implementierung eines Sortieralgorithmus. Es handelt sich hierbei um das Sortieren durch Einfügen. Speziell soll hier ein Array von natürlichen Zahlen aufsteigend sortiert werden; d.h am Ende des Verfahrens enthält das erste Element die kleinste Zahl. Der Einfachheit halber nehmen wir an, alle Zahlen seien verschieden. Der Algorithmus wird folgendermaßen beschrieben: Zu Beginn des Verfahrens ist das unsortierte Array s1 der Länge n und ein zunächst leeres Array s2 (ebenfalls der Länge n) vorhanden (In letzteres sollen die Elemente sortiert eingefügt werden). Im i-ten Schritt ( 1 i n) des Verfahrens nimmt man vom unsortierten Array das i-te Element und fügt es im Array s2 an der Stelle j ein, so dass gilt s2(j) < s2(i) für alle j < i und s2(j) > s2(i) für alle j > i. a) Formulieren Sie in Pascal die Funktion function insert (nn : array [1 .. max] of Integer) : array [1 .. max] of Integer , die den angegebenen Algorithmus implementiert. b) Formulieren Sie ein Hauptprogramm, das ein unsortiertes Feld ganzer Zahlen mit Hilfe der Funktion insert sortiert. c) Die Hauptarbeit bei der praktischen Durchführung des Sortieralgorithmus entfällt auf das richtige Einfügen der Zahlen; im wesentlichen müßen dabei benachbarte Elemente des Feldes unter Umständen vertauscht werden. Geben Sie an, wieviele Vertauschungen im schlechtesten Fall durchgeführt werden müßen! d) Wie muß der Algorithmus geändert werden, damit er effizienter ist ? Aufgabe 6 Rechenstrukturen mit Feldern: Warteschlange a) Definieren Sie eine unbeschränkte Warteschlange (FIFO-Puffer) als Rechenstruktur mit den Operationen insert (Einfügen) und remove (Entfernen) sowie aller weiterer Operationen, die Sie benötigen. Geben Sie dazu die Signatur und die wesentlichen Axiome an. b) Geben Sie eine Implementierung einer beschränkten Warteschlange in Pascal unter Verwendung von Feldern und mit obigen Operationen an. c) Diskutieren Sie kurz die Bezüge zwischen Rechenstruktur und Implementierung hinsichtlich Partialität der Spezifikation, Realisierbarkeit mit beschränktem Speicher, sowie die Verwendung von Seiteneffekten. Begründen Sie kurz informell, ob bzw. unter welchen Nebenbedingungen die Pascal-Lösung eine geeignete Implementierung der Rechenstruktur darstellt. –2– Aufgabe 7 Lispbäume in Gofer Sei M eine beliebige, gegebene Menge. LISP bezeichne die Menge der ”Lispbäume” (beblätterte Binärbäume) über M. Sie hat die folgenden Eigenschaften. - Zu jedem Element m aus M gibt es genau ein Element aus LISP, das als ”Atom” bezeichnet wird. Dieser Baum besitzt die Markierung m und keine Teilbäume (linke oder rechte Teilbäume). - Zu jedem x aus LISP, das nicht Atom ist, gibt es genau einen Lispbaum, der als ”linker Teilbaum” von x bezeichnet wird. Entsprechend gibt es genau einen ”rechten Teilbaum” von x. - Zu Lispbäumen x und y gibt es genau einen Lispbaum z, sodaß x linker Teilbaum von z, y rechter Teilbaum von z ist. Um ”unendliche” Bäume auszuschließen fordern wir, daß jedem Lispbaum z eindeutig eine natürliche Zahl height z zugeordnet ist, die ”Höhe” von z genannt wird, wobei gilt - height z 1 max height x height y , falls x rechter Teilbaum von z und y linker Teilbaum von z ist, - height z 0, falls z ein Atom ist. Wir erhalten nun eine Schnittstellenbeschreibung SLISP einer Rechenstruktur wie folgt. Seien F und S die folgenden Mengen von Funktions- bzw. Sortensymbolen der Schnittstelle SLISP. - S LISP M Bool Nat - F Atom Tree lTree rTree getmark isAtom height In SLISP sind die Sortenbezeichner Nat und Bool als Menge der natürlichen Zahlen bzw. Wahrheitswerte, M als Menge M der Markierungen, die Sorte LISP als Menge von Lispbäumen mit den oben genannten Eigenschaften zu interpretieren. Das Funktionssymbol Atom ist als Funktion zu interpretieren, die zu einer Markierung m ein Atom liefert. Die Interpretation von getmark liefert zu einem Atom dessen Markierung. Die Interpretationen lTree, rTree bzw. height sollen zu einem Baum z die zugeordneten Elemente linker Baum, rechter Baum bzw. Höhe von z liefern. Die Interpretation von Tree liefere zu einem Paar x y den Baum, der x als linken Teilbaum und y als rechten Teilbaum enthält. Die Interpretation von isAtom liefere für einen Baum z den Wert ”wahr” genau dann, wenn z ein Atom ist, und ansonsten ”falsch”. a) Als Sorte M der Markierungen wird nun Int gewählt. Geben Sie eine rekursive Datendeklaration in Gofer (vgl. Arbeitsblatt 3) für die Sorte LISP an. b) (P) Implementieren Sie in Gofer die Schnittstelle SLISP als Rechenstruktur, ausgehend von der Definition in Teilaufgabe (a). c) (P) Erweitern Sie Ihre Implementation von SLISP um eine Funktion occurrences, die für einen Baum z und eine Markierung m angibt, wie oft m in z vorkommt.