Algorithmen & Datenstrukturen Midterm Test 2

Ähnliche Dokumente
NAME, VORNAME: Studiennummer: Matrikel:

Algorithmen und Datenstrukturen Musterlösung 5

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1

lim log 2n n = > 0 Da es einen Limes gibt, gibt es auch einen Limes inferior, der gleich diesem Limes ist.

Algorithmen und Datenstrukturen

Mengen und Multimengen

Übung Algorithmen und Datenstrukturen

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1

Datenstrukturen und Algorithmen. Vorlesung 5

Klausur zur Vorlesung Algorithmen und Datenstrukturen

Programmieren in C. Rekursive Strukturen. Prof. Dr. Nikolaus Wulff

Informatik II, SS 2014

Informatik B Sommersemester Musterlösung zur Klausur am

Datenstrukturen und Algorithmen (SS 2013)

Informatik II Prüfungsvorbereitungskurs

Übung Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen (SS 2013)

Programmieren I. Kapitel 13. Listen

Informatik II: Algorithmen & Datenstrukturen. Blättern Sie nicht um bevor Sie dazu aufgefordert werden!

Klausur Algorithmen und Datenstrukturen

Grundzüge von Algorithmen und Datenstrukturen, WS 15/16: Lösungshinweise zum 13. Übungsblatt

Klausur Algorithmen und Datenstrukturen II

Selbststudium OOP7 & ALG2 Auftrag

2. Klausur Datenstrukturen und Algorithmen SS 2014

Übung Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen (SS 2013) Prof. Dr. Leif Kobbelt Thomas Ströder, Fabian Emmes, Sven Middelberg, Michael Kremer

Klausur zur Vorlesung Algorithmen und Datenstrukturen

1. Aufgabe (6 Punkte): Java-Programmierung (Arrays)

Wiederholung. Bäume sind zyklenfrei. Rekursive Definition: Baum = Wurzelknoten + disjunkte Menge von Kindbäumen.

Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper

Übung: Algorithmen und Datenstrukturen SS 2007

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

Algorithmen & Datenstrukturen 1. Klausur

5.3 Doppelt verkettete Listen

2.2 Spezifikation abstrakter Datentypen. 2.3 Implementierung und Anwendung von ADT. 2.4 Datenabstraktion und Objektorientierung

Algorithmen 1 Tutorium

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1

elementare Datenstrukturen

Klausur Algorithmen und Datenstrukturen

Informatik B Sommersemester Musterlösung zur Klausur vom

Klausur Algorithmen und Datenstrukturen

3. Übungsblatt zu Algorithmen I im SoSe 2017

Muster. Informatik 3 (Februar 2004) Name: Matrikelnummer: Betrachten Sie den folgenden Suchbaum. A G H J K M N

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Software Entwicklung 1

5. Bäume und Minimalgerüste

Fallstudie: Online-Statistik

Klausur Algorithmen und Datenstrukturen

Informatik Abitur Bayern 2017 / II - Lösung

Prof. Dr. Uwe Schmidt. 30. Januar 2017

Anwendungsbeispiel MinHeap

Karlsruher Institut für Technologie. Klausur Algorithmen I

7. Sortieren Lernziele. 7. Sortieren

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

Übung Informatik I - Programmierung - Blatt 8

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

ÜBUNGSKLAUSUR Studienhalbjahr: 2. Semester. Datum: 20. Juli 2016 Bearbeitungszeit: 90 Minuten. Modul: T2INF Dozent: Stephan Schulz

Klausur Algorithmen und Datenstrukturen

Tutoraufgabe 1 (Starke Zusammenhangskomponenten):

Probeklausur zur Vorlesung

Klausur zur Vorlesung Informatik 1 im Wintersemester 2014/2015 am 18. Februar Bearbeitungszeit: 90 Minuten Gesamtpunktezahl: 90 Punkte

Algorithmen und Datenstrukturen

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. B3.1 Einführung. B3.2 Verkettete Liste. B3.3 Bäume

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Algorithmen und Datenstrukturen

1. Die rekursive Datenstruktur Liste

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Algorithmen und Komplexität Lösungsvorschlag zu Übungsblatt 8

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

1. Die rekursive Datenstruktur Liste

ALP II Dynamische Datenmengen Datenabstraktion

Grundlagen: Algorithmen und Datenstrukturen

6. Verkettete Strukturen: Listen

Aufgaben zur Klausurvorbereitung

Abgabe: (vor der Vorlesung) Aufgabe 3.1 (P) Master-Theorem

16. Dynamische Datenstrukturen

Transkript:

Algorithmen & Datenstrukturen Midterm Test 2 Martin Avanzini <martin.avanzini@uibk.ac.at> Thomas Bauereiß <thomas.bauereiss@uibk.ac.at> Herbert Jordan <herbert@dps.uibk.ac.at> René Thiemann <rene.thiemann@uibk.ac.at> 14. Juni Name Matrikelnummer Aufgabe mögliche Punkte erreichte Punkte 1.1 10 1.2 5 2.1 7 2.2 5 2.3 8 3.1 7 3.2 3 Gesamt 45 1

Aufgabe 1) Mengen (15 Punkte) Ein Algorithmus benötigt für seine Abarbeitung eine effiziente Datenstruktur Set zur Verwaltung einer Menge von natürlichen Zahlen (int). Folgende Operationen sollen mit der gegebenen Laufzeitkomplexität auf einer Menge A ausgeführt werden können: Einfügen - im Durchschnitt O(1) Löschen - im Durchschnitt O(log( A )) Member-Ship Test (contains(int x)) - im Durchschnitt O(1) Iteration über alle Elemente - im Durchschnitt O( A ) Durchschnitt zweier Mengen A und B (intersect(set A, Set B)) - im Durchschnitt O(min( A, B )) 1. Wählen Sie eine geeignete Datenstruktur für die Realisierung der Menge. Beschreiben Sie alle notwendige Details. Begründen Sie, weshalb Ihre Wahl den Anforderungen (Laufzeiten) entspricht. 2. Implementieren Sie in Java-ähnlicher Syntax die Funktion intersect(set A, Set B) zur Berechnung des Durchschnitts der Mengen A und B. Notwendige Operationen wie contains(int x), add(int x), Iteratoren, usw. können Sie als gegeben voraussetzen. Begründen Sie, dass Ihre Implementierung eine Laufzeit von O(min( A, B )) hat. 2

Aufgabe 1) Lösung 1. Eine entsprechende Datenstruktur: Eine Hashtable bei der der Schlüssel gleichzeitig dem zu speichernden Wert entspricht. Die einzelnen Element innerhalb der Tabelle sind doppelt verkettet. Zusätzlich zur Tabelle wird ein Verweis auf das zuletzt eingefügte Element verwaltet. Um effizient die Anzahl der Element in der Menge zu erhalten, wird diese noch extra in einer Variable size mitgeschrieben. Laufzeiten: (a) Einfügen - Einfügen in die Hashtable (O(1)), einbinden in die Verknüpfte Liste der Elemente unter Zuhilfenahme des zuletzt eingefügten Elementes (O(1)), updaten des zuletzt eingefügten Elements (O(1)) sowie das Inkrementieren von size (O(1)) (b) Löschen - Löschen aus der Hashtable O(1), Korrektur der Zeiger durch verknüpfen des Vorgängers und Nachfolgers O(1), überprüfen ob letztes eingefügte Element gelöschtes Element ist und gegebenenfalls Vorgänger ermitteln O(1) sowie dekrementieren von size (O(1))- insgesamt also O(1), wodurch der Aufwand auch in O(log(n)) liegt. (c) Member-Ship Test - Lookup in Hashtable: O(1) (d) Iteration über alle Elemente - unter Zuhilfenahme der Verkettung, rückwärts ausgehend vom letzten eingefügten Element - O( A ) (e) Durchschnitt - siehe Teil 2 2. Eine Mögliche Implementierung: Set intersect ( Set A, Set B) { // make sure A is smaller set if (A. size > B. size ) { return intersect (B, A); // compute intersection Set res = new Set (); for ( int cur : A) { if (B. contains ( cur )) { res. add ( cur ); return res ; Die Bedingung zu Beginn hat O(1). Sollte die Bedingung nicht erfüllt sein, hat die Implementierung eine Komplexität von O( A ), da durch die Elemente von A iteriert wird (O(n)) und der Membership Test sowie das Hinzufügen zum Resultat O(1) hat. Da in diesem Fall A = min( A, B ), liegt der Algorithmus in der geforderten Klasse. Sollte die erste Bedingung nicht erfüllt sein, hat die Ausführung der Methode den Aufwand des rekursiven Aufrufs. Innerhalb des Aufrufs gilt B < A, wodurch die Bedingung zu Beginn unerfüllt bleibt. Die Schleife hat wie im ersten Fall gezeigt einen Aufwand von O(n) wobei dieses mal n = B. Da B = min( A, B ) ergibt sich eine Komplexität von O(min( A, B )). 3

Aufgabe 2) Dynamisches Programmieren (20 Punkte) Sei a ein Array über Integer- Werten der Länge n > 0. Eine zusammenhängende Teilsequenz von a mit maximaler Summe ist gegeben durch ein Paar (i, j) von Zahlen 0 i j < n sodass die Summe Σ j k=ia[k] maximal ist. (Insbesondere gilt Σ j k=i a[k] Σ j k=i a[k] für jedes weitere Paar (i, j ).) Solch ein Paar lässt sich durch dynamisches Programmieren errechnen indem man folgende Rekursionsgleichung betrachtet: U(0) = a[0] U(k + 1) = max{u(k) + a[k + 1], a[k + 1] Der Wert U(k) beschreibt die maximale Summe einer zusammenhängenden Teilsequenz endend mit Index k. Eine Lösung (i, j) kann wie folgt berechnet werden: Der Index j wird so gewählt, dass U(j) maximal ist (im Bereich 0 j < n). Zur Bestimmung des Anfangsindex i wird eine Abbildung L: {0,..., n 1 Int errechnet sodass die Summe der Einträge von a[l(j)],..., a[j] maximal ist. Es gilt also i = L(j). Beachten Sie, dass sich L anhand der Berechnung von U erstellen lässt. 1. Implementieren Sie die Berechung von U mittels einer Methode int[] u(int a[]). 2. Sei a = {-1,2,3,-2. Bestimmen Sie die Werte U(k) sowie L(k) für 0 k < 4. Geben Sie die Lösung (i, j) an. 3. Erstellen Sie die Rekursionsgleichung für L anhand der Werte U(k) und a[k] (0 k < n). 4

Aufgabe 2) Lösung 1. public class MaxInterval { public int [] u( int a []) { int n = a. length ; assert (n >= 1); int [] u = new int [n]; u [0] = a [0]; for ( int k = 1; k < n; k ++) { int v = u[k -1] + a[ k]; if (v > a[k]) { u[k] = v; else { u[k] = a[k ]; return u; 2. Die Werte für U und L sind in folgender Tabelle angeführt: k 0 1 2 3 U(k) -1 2 5 3 L(k) 0 1 1 1 Die Lösung für Eingabearray a ist demzufolge (1, 2). 3. Die Rekursionsformel sieht wie folgt aus: L(0) = 0 { L(k) wenn U(k + 1) = U(k) + a[k + 1] L(k + 1) = k + 1 wenn U(k + 1) = a[k + 1]. 5

Aufgabe 3) Topologische Sortierung (10 Punkte) Gegeben sei ein Graph G = (V, E) mit V = {a, b, c, d, e, f, g, h E = {(a, g), (c, b), (c, d), (c, e), (d, b), (e, b), (f, a), (f, c), (f, h), (g, c), (h, g) 1. Bestimmen Sie eine topologische Sortierung des Graphen G, indem Sie den in der Vorlesung vorgestellten effizienten Algorithmus anwenden. Geben Sie die Zwischenergebnisse an (z.b. in Form einer Tabelle) sowie die resultierenden Ordnungsziffern ord(v) für alle Knoten v V. 2. Zeichnen Sie den Graphen G mit Hilfe der Ergebnisse der vorherigen Teilaufgabe. Platzieren Sie dabei die Knoten in der Reihenfolge der topologischen Sortierung entlang einer Geraden, und achten Sie darauf, dass sich die Kanten nicht überschneiden. 6

Aufgabe 3) Lösung 1. Die folgende Tabelle gibt die Zwischenschritte des Algorithmus von Folie 313 für den Graphen G an. Die Spalte i gibt die aktuelle Iteration der Schleife an, die Spalten a h die Werte des Arrays indeg, und die Spalte indegzero die Warteschlange mit zu bearbeitenden Knoten. Es ergeben sich folgende Ordnungsziffern: i a b c d e f g h indegzero 0 1 3 2 1 1 0 2 1 f 1 0 3 1 1 1 0 2 0 a h 2 0 3 1 1 1 0 1 0 h 3 0 3 1 1 1 0 0 0 g 4 0 3 0 1 1 0 0 0 c 5 0 2 0 0 0 0 0 0 d e 6 0 1 0 0 0 0 0 0 e 7 0 0 0 0 0 0 0 0 b 8 0 0 0 0 0 0 0 0 v a b c d e f g h ord(v) 2 8 5 6 7 1 4 3 2. Mit den Ergebnissen aus der vorhergehenden Teilaufgabe kann der Graph unter Berücksichtigung der topologischen Sortierung gezeichnet werden: f a h g c d e b 7