Datenstrukturen und Algorithmen D-INFK

Ähnliche Dokumente
Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1

Datenstrukturen & Algorithmen Lösungen zu Blatt 4 FS 15

Datenstrukturen und Algorithmen D-INFK

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

Musterlösung Datenstrukturen und Algorithmen

Datenstrukturen & Algorithmen

Algorithmen und Datenstrukturen

Datenstrukturen & Algorithmen Lösungen zu Blatt 8 FS 16

Datenstrukturen & Algorithmen

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

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 12

Datenstrukturen & Algorithmen Lösungen zu Blatt 5 FS 14

NAME, VORNAME: Studiennummer: Matrikel:

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Beispiellösung zur Prüfung Datenstrukturen und Algorithmen D-INFK

7. Sortieren Lernziele. 7. Sortieren

Informatik B Sommersemester Musterlösung zur Klausur vom

Algorithmen und Datenstrukturen I AVL-Bäume

Kurs 1663 Datenstrukturen" Musterlösungen zur Klausur vom Seite 1. Musterlösungen zur Hauptklausur Kurs 1663 Datenstrukturen 15.

Algorithmen & Datenstrukturen 1. Klausur

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

Informatik II, SS 2014

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

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

13. Bäume: effektives Suchen und Sortieren

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

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

Informatik II Vorlesung am D-BAUG der ETH Zürich

3. Übungsblatt zu Algorithmen I im SoSe 2017

Datenstrukturen & Algorithmen Lösungen zu Blatt 10 FS 16

13 (2-4)-Bäume Implementierbare Funktionen. (2-4)-Bäume sind durch folgende Eigenschaften deniert: 1. Alle Äste sind gleich lang

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Algorithmen und Datenstrukturen Tutorium Übungsaufgaben

Informatik II, SS 2016

Übung Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

11. Elementare Datenstrukturen

Datenstrukturen und Algorithmen 2. Klausur SS 2001

Binäre Suchbäume. Mengen, Funktionalität, Binäre Suchbäume, Heaps, Treaps

Algorithmen und Datenstrukturen

Tutoraufgabe 1 (Starke Zusammenhangskomponenten):

(a, b)-bäume / 1. Datenmenge ist so groß, dass sie auf der Festplatte abgespeichert werden muss.

Geometrische Datenstrukturen

Wintersemester 2004/ Januar Aus der Vorlesung sind Datenstrukturen zur Repräsentation von Wäldern disjunkter Mengen bekannt.

12 (2-4)-Bäume Implementierbare Funktionen. (2-4)-Bäume sind durch folgende Eigenschaften deniert: 1. Alle Äste sind gleich lang

Algorithmen und Datenstrukturen 2. Dynamische Datenstrukturen

Algorithmen und Datenstrukturen

Bereichsabfragen. Dr. Martin Nöllenburg Vorlesung Algorithmische Geometrie

9 Minimum Spanning Trees

Datenstrukturen und Algorithmen SS07

Algorithmen & Komplexität

Algorithmen I. Tutorium 1-3. Sitzung. Dennis Felsing

Wiederholung. Datenstrukturen und. Bäume. Wiederholung. Suchen in linearen Feldern VO

Geometrische Algorithmen

Informatik II, SS 2014

Lösungsvorschlag 1. Vorlesung Algorithmentechnik im WS 09/10

Grundlagen: Algorithmen und Datenstrukturen

1 AVL-Bäume. 1.1 Aufgabentyp. 1.2 Überblick. 1.3 Grundidee

Punkte. Teil 1. Teil 2. Summe. 1. Zeigen Sie, dass der untenstehende Suchbaum die AVL-Bedingung verletzt und überführen Sie ihn in einen AVL-Baum.

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Algorithmen & Datenstrukturen Midterm Test 2

Vorlesung Datenstrukturen

3. Musterlösung. Problem 1: Heapsort

Informatik II, SS 2014

Abstrakter Datentyp (ADT): Besteht aus einer Menge von Objekten, sowie Operationen, die auf diesen Objekten wirken.

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / Vorlesung 10, Donnerstag 8.

Algorithmen und Datenstrukturen Suchbaum

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Heaps. Vorlesung 8: Heapsort (K6) Joost-Pieter Katoen. 7. Mai 2015

Übungen zur Vorlesung Datenstrukturen und Algorithmen SS 2006 Blatt 13

Wie wird ein Graph dargestellt?

Klausur Informatik B April Teil I: Informatik 3

Beispiellösung zur Prüfung Datenstrukturen und Algorithmen D-INFK

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Rotation. y T 3. Abbildung 3.10: Rotation nach rechts (analog links) Doppelrotation y

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

Was bisher geschah. 1. Zerlegung in monotone Polygone 2. Triangulierung der monotonen Teilpolygone

Informatik II, SS 2014

Vorlesung Datenstrukturen

Klausur Algorithmen und Datenstrukturen

Suchstrukturen. Übersicht. 8 Suchstrukturen. Allgemeines. H. Täubig (TUM) GAD SS

Bäume, Anwendung und Begriffe

EINI LogWing/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 17/18

Keller, Schlangen und Listen. Elementare Datenstrukturen Keller, Schlangen und Listen 1 / 14

2 i. i=0. und beweisen Sie mittels eines geeigneten Verfahrens die Korrektheit der geschlossenen Form.

1. Übungsblatt zu Algorithmen II im WS 2011/2012

1. Einfach verkettete Liste unsortiert 2. Einfach verkettete Liste sortiert 3. Doppelt verkettete Liste sortiert

Klausur Software-Entwicklung März 01

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

Aufgabe 1 O-Notation (2+3+5=10 Punkte)

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

Wintersemester 2004/ Dezember 2004

10. Übungsblatt zu Algorithmen I im SS 2010

ContainerDatenstrukturen. Große Übung 4

Wintersemester 2007/2008 Helmut Seidl Institut für Informatik TU München

JAVA - Suchen - Sortieren

Algorithmen und Datenstrukturen 1 VL Übungstest WS Januar 2011

Transkript:

Eidgenössische Technische Hochschule Zürich Ecole polytechnique fédérale de Zurich Politecnico federale di Zurigo Federal Institute of Technology at Zurich Institut für Theoretische Informatik Peter Widmayer Holger Flier, Beat Gfeller Prüfung Datenstrukturen und Algorithmen D-INFK 10. Februar 010 Musterlösung

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1 Aufgabe 1: a Es gibt vier korrekte Lösungen (Gesamtgewicht 1: b 19 9 1 1 7 17 1 18 1 c nach dem ersten Durchgang: 9 1 1 1 8 11 7 d 9 10 8 17 1 7

Stud.-Nummer: Datenstrukturen & Algorithmen Seite e Mit Sondieren nach links: 1 8 1 9 1 0 1 (Index Mit Sondieren nach rechts: 1 8 1 1 9 0 1 (Index f 7 9 8 1 10 g Der folgende gerichtete Graph wird mit Tiefensuche traversiert. Die Suche startet beim Knoten A. Geben Sie eine Reihenfolge an, in der die Knoten erreicht werden können. A B C D E G F Es gibt drei korrekte Lösungen: A,B,D,C,G,E, oder A,C,B,D,G,E, oder A,C,G,E,B,D h Nach Einfügen von 9: 17 19 10 0 9 1 Nach Löschen von 17:

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1 19 10 0 9 Alternative Lösung nach Löschen von 17: Benutze den symmetrischen Nachfolger, d.h. 19. Dann ist aber eine Rotation nötig: 19 10 0 9 1 i c d 7 f b 18 a g 1 11 e 1

Stud.-Nummer: Datenstrukturen & Algorithmen Seite Aufgabe : a n log n, n n, n log n, n, n, n! b ( n T (n = T + n + 1 ( ( n = T + n/ + 1 + n + 1 ( [ ( n ] = T T + n/ + 1 + n/ + 1 + n + 1 ( n = i T i + n (1 + 1/ +... + 1/ i 1 + (1 + +... + i 1 ( n ( = i T i + n 1 1 i 1 + ( i 1 Mit i = log (n erhalten wir Beweis per Induktion: Verankerung: T (1 = 1 =. T (n = n + n (1 1/ n + ( n 1 = n 1. Induktionsschritt: von n/ nach n: ( n T (n = T + n + 1 = (n/ 1 + n + 1 = n 1. c Die Laufzeit ist ungefähr n + n/ + n/ + n/8 +..., was insgesamt Θ(n ergibt. d n/8 (n k = Θ(n k=1 e Θ( n log n

Stud.-Nummer: Datenstrukturen & Algorithmen Seite Aufgabe : In dieser Aufgabe betrachten wir Mengen von Punkten in der Ebene. Wir sagen, dass ein Punkt (x, y einen anderen Punkt (x, y dominiert, wenn x > x und gleichzeitig y > y gilt. Ein Punkt heisst dominant, wenn er von keinem anderen Punkt dominiert wird. Im untenstehenden Bild wird beispielsweise der Punkt A vom Punkt B dominiert, aber nicht vom Punkt C. Der Punkt D ist dominant. y A C B D P a Wir benutzen einen (sehr einfachen Scanline-Ansatz mit einer vertikalen Scanline, welche von rechts nach links läuft. Dazu sortieren wir die Punkte zuerst absteigend nach x-koordinate bei gleicher x-koordinate sortieren wir aufsteigend nach y-koordinate (wichtig!. Beim Scan gehen wir alle Punkte in dieser Reihenfolge durch. In der Scanline speichern wir nur einen Punkt ab, nämlich den mit der bisher grössten y-koordinate. Bei jedem neuen Punkt beim Scan prüft man, ob dessen y-koordinate ein neues Maximum ist, oder gleich gross wie das bisherige Maximum (wichtig!. Falls ja, ist dieser Punkt dominant und man gibt ihn aus (und merkt sich diesen Punkt als neues Maximum. Dieser Ansatz hat eine Laufzeit von O(n log n (für das Sortieren, der Rest geht in Linearzeit. P b Wir benutzen einen AVL-Baum als Datenstruktur. Diese enthält per Invariante jeweils genau alle dominaten Punkte der aktuellen Punktmenge, und zwar so sortiert wie in a beschrieben: absteigend nach x-koordinate, und bei gleicher x-koordinate aufsteigend nach y-koordinate. Die Operation Init( erstellt in O(1 einen leeren AVL-Baum. Die Operation ListEfficient( traversiert einfach den AVL-Baum und gibt alle Punkte (als Liste aus. Laufzeit: O(k, wobei k die Anzahl dominater Punkte in der aktuellen Punktmenge ist. Die Operation Insert(x, y implementiert man wie folgt: Man sucht zuerst die Stelle in der sortierten Reihenfolge, und fügt den Punkt entsprechend in den AVL-Baum ein. Nun muss man noch alle Punkte löschen, die vom neu eingefügten Punkt dominiert werden und die somit nicht mehr dominant sind. Dazu verketten wir im AVL-Baum alle Knoten in Inorder- Reihenfolge miteinander: dann geht dieser Schritt in O(w log m, wobei m die Anzahl aktueller Punkte vor dem Insert ist, und w die Anzahl zu entfernender Punkte. x

Stud.-Nummer: Datenstrukturen & Algorithmen Seite Aufgabe : In dieser Aufgabe betrachten wir ein zweidimensionales Array A mit n verschiedenen Zahlen, bestehend aus n Zeilen und n Spalten. Zwei Felder im Array sind benachbart, wenn sie sich an einer Seite berühren, d.h. das Element B[i, j] ist mit den vier Elementen B[i 1, j], B[i, j 1], B[i + 1, j] und B[i, j + 1] benachbart, falls diese Felder existieren (Elemente am Rand des Arrays sind mit entsprechend weniger Elementen benachbart. Eine Folge x 1, x,..., x k von Elementen im Array heisst Sequenz, wenn folgende Bedingungen erfüllt sind: die Folge von Elementen ist aufsteigend sortiert, und für jedes i 1,..., k 1 die Elemente x i und x i+ im Array benachbart sind. P a Entwerfen Sie einen möglichst effizienten Algorithmus, der im gegebenen Array eine längste Sequenz berechnet, die sich ganz in einer Zeile oder ganz in einer Spalte befindet. Im untenstehenden Beispiel-Array wäre eine mögliche Sequenz,, 10. Diese ist jedoch keine längstmögliche Sequenz: Die Sequenz, 8, 9, 7 ist länger. Beschreiben Sie Ihren Algorithmus in Worten, und geben Sie dessen Laufzeit an. P b Wir suchen nun eine längstmögliche beliebige Sequenz im gegebenen zweidimensionalen Array. Im untenstehenden Beispiel-Array wäre eine mögliche Sequenz,, 8, 9, 7, 9. Entwerfen Sie einen möglichst effizienten Algorithmus, der eine solche längste Folge findet. Beschreiben Sie Ihren Algorithmus in Pseudocode, und geben Sie dessen Laufzeit an. Ihr Pseudocode muss in Java- Eiffel- oder C++-ähnlicher Notation geschrieben sein. Beispiel-Array: 9 7 1 8 9 8 1 9 8 1 7 9 8 19 1 10 Lösung: a Man muss offensichtlich jede Spalte und jede Zeile separat durchgehen, und jeweils die längste aufsteigende Folge darin ermitteln. Dies geht ganz einfach mit einem linearen Scan: Zuerst beginnt man die aktuelle Sequenz beim ersten Element. Solange das nächstfolgende Element nicht kleiner ist als das letzte (und somit angehängt werden kann, verlängert man die Folge. Wenn das nicht der Fall ist, beginnt man ab dem aktuellen Element eine neue Folge. Natürlich merkt man sich die längste bisherige Folge. Es gibt n Spalten und n Zeilen, die Gesamtlaufzeit beträgt somit O(n = O(n. b Hier wird ein Algorithmus nach dem Muster der dynamischen Programmierung benutzt. Die zentrale Idee ist, dass ein längster aufsteigender Pfad startend bei Feld x immer aus einem längsten Pfad besteht, der von einem Nachbarfeld von x aus startet (ausser, dies ist nicht möglich, weil alle Nachbarn von Feld x eine kleinere Zahl enthalten. Eine zweite wichtige Beobachtung: Da die Pfade aufsteigend sind und alle Zahlen im Array verschieden sind, kann man einen Pfad Greedy fortsetzen, weil nie ein Zyklus auftreten kann. Wir gehen daher einfach jedes Feld als Startfeld durch und verfolgen alle dort startenden Pfade. Damit

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 7 Felder nicht mehrfach betrachtet werden, speichern wir für jedes bereit besuchte Feld den längsten gefundenen aufsteigenden Pfad ab (es reicht, das nächste Feld in diesem Pfad abzuspeichern. Am einfachsten geht dies mit einer rekursiven Implementation. Hier ein Beispiel in Java: public class LongestPath { int[][] B; // Input d-array int n; static final int[][] neighborindex = { { 1, 0, { -1, 0, { 0, 1, { 0, -1 ; class Path { int length=0; Path next=null; int element; Path findlongest( { Path[][] p = new Path[n][n]; Path best = new Path(; for (int i = 0; i < n; i++ { for (int j = 0; j < n; j++ { Path pa = findlongest(p, i, j, Integer.MIN_VALUE; if (pa.length > best.length best = pa; return best; Path findlongest(path[][] p, int x, int y, int last { if (x < 0 y < 0 x >= n y >= n last > B[x][y] { return new Path(; // empty path, length 0 if (p[x][y] == null { // (x,y not yet visited p[x][y] = new Path(; p[x][y].element = B[x][y]; for (int[] neighbor : neighborindex { Path pa = findlongest(p, x + neighbor[0], y + neighbor[1], B[x][y]; if (pa.length + 1 >= p[x][y].length{ p[x][y].length = pa.length + 1; p[x][y].next = pa; return p[x][y]; So kann auch dieses Problem in Zeit O(n, also linear in der Anzahl der Felder, gelöst werden.

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 8 Aufgabe : Gegeben sind m Rechtecke und n Punkte. a Wir benutzen einen Scanline-Ansatz mit (z.b. einer vertikalen Scanline, welche von rechts nach links läuft. Haltepunkte sind jeweils die x-koordinaten von Anfang und Ende der Rechtecke sowie der gegebenen Punkte. Man braucht in der Scanline eine Datenstruktur, welche Aufspiess-Abfragen beantworten kann, z.b. einen Intervall-Baum. Bei den Haltepunkten, die Rechteck-Anfang (bzw. Ende sind, fügt man das entsprechende y-intervall in den Intervall- Baum ein (bzw. löscht es. Bei den Haltepunkten, die einem Punkt entsprechen, führt man eine Aufspiess-Abfrage im Intervall-Baum durch: Anstatt alle aufgespiessten Intervalle auszugeben, prüft man aber jeweils nur, ob es ein aufgespiesstes Intervall gibt. Falls man irgendwann eines findet, gibt man es aus und bricht ab. Falls man alle Punkte durchgegangen ist, ohne dass je ein Intervall aufgespiesst wurde, weiss man, dass kein Punkt im überlappten Bereich liegt. b Der Aufbau des leeren Skeletts des Intervall-Baums benötigt O(m Zeit. Die Kosten für Einfügen und Löschen der Intervalle im Intervall Baum betragen je O(log m, und es gibt O(m davon. Die Aufspiess-Abfragen kosten ebenfalls jeweils nur O(log m, wenn man sofort abbricht (also nicht auch noch alle k gefundenen Rechtecke ausgibt, und es gibt O(n davon. Insgesamt hat man also Kosten von O((m + n log m. Das Sortieren der m + n Haltepunkte kann man in höchstens O((m + n log(m + n Zeit erledigen. Der Gesamtaufwand beträgt somit O((m + n log(m + n für diese Lösung. c Eine mögliche Lösung ist, alle Punkte in einem d-range-tree zu speichern, der so abgewandelt ist, dass man effizient die Anzahl Punkte in einem Rechteck bestimmen kann (man kann dazu z.b. in jedem Knoten speichern, wie viele Schlüssel der linke Teilbaum enthält. Dann kann man einfach für jedes Rechteck eine Abfrage machen, und schliesslich das Rechteck mit den meisten Punkten darin ausgeben. Den d-range-tree für die n Punkte baut man in O(n log n Zeit auf. Ein Query kostet jeweils O(log n Zeit, wobei insgesamt m Queries ausgeführt werden. Insgesamt kommt man also auf eine Laufzeit von O(n log n + m log n. Mittels Fractional Cascading kann man die Laufzeit einer Query auf O(log n verbessern, d.h. insgesamt würde die Laufzeit nur noch O(n log n + m log n betragen.