Aufgabe 1: Weitere Aufgaben aus dem Buch 1. Bearbeiten Sie die Aufgaben 8.2, 8.5 und 8.6 zum DoME Beispiel.

Ähnliche Dokumente
Selbststudium OOP7 & ALG2 Auftrag

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Aufgabenblatt: Arrays

Sortieralgorithmen OOPM, Ralf Lämmel

Suchen und Sortieren Sortieren. Mergesort

Übungen / Lösungen Programmieren 1 Felix Rohrer LÖSUNGEN

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

public class Test extends MiniJava { public static void main (String [] args) { write(args[0]+args[1]); } } // end of class Test

Übung Algorithmen I

Interne Sortierverfahren

1 Klassen anlegen und Objekte erzeugen

1 Klassen anlegen und Objekte erzeugen

Lernteam OOP2 SW Programmieren 1 - H1103 Felix Rohrer

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Einfache Sortierverfahren Autor: Stefan Edelkamp

Die Schnittstelle Comparable

DAP2 Praktikum Blatt 2

Selbststudium OOP6 & ALG Programmieren 1 - H1103 Felix Rohrer

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Algorithmen und Datenstrukturen

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Lernteam OOP3 SW Programmieren 1 - H1103 Felix Rohrer

Selbststudium OOP6 & ALG1 Auftrag

Informatik II Übung 02. Benjamin Hepp 8 March 2017

Sortieralgorithmen. Selection Sort

(08 - Einfache Sortierverfahren)

Informatik II Übung 2. Pascal Schärli

Probeklausur zur Vorlesung

Einstieg in die Informatik mit Java

Beispiellösung zur Klausur AI2 im Sommersemester 2007

Übersicht. Berechnung der Potenz für zwei ganze Zahlen Klausuraufgabe SS 2010! Berechnung der Cosinus-Funktion Klausuraufgabe WS 2010/2011!

Einführung in die Informatik 1

Ziele. Kapitel 10: Komplexität von Algorithmen und Sortierverfahren. Beispiel: Lineare Suche eines Elements in einem Array (1)

Sortieren durch Mischen (Mergesort; John von Neumann 1945)

Programmiertechnik II

Programmieren in C. Strukturen und Zeiger. Prof. Dr. Nikolaus Wulff

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Selbststudium OOP1 & DAT Programmieren 2 F1203 Felix Rohrer

Objektorientierte Programmierung Studiengang Medieninformatik

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

Grundlegende Sortieralgorithmen

Algorithmen. Sortieren durch Auswählen, Sortieren durch Mischen und Vergleich der Laufzeit. Abschätzung der Laufzeit eines Algorithmus, O-Notation.

n 1. Grundzüge der Objektorientierung n 2. Methoden, Unterprogramme und Parameter n 3. Datenabstraktion n 4. Konstruktoren n 5. Vordefinierte Klassen

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Informatik II, SS 2016

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Suchen und Sortieren OOPM, Ralf Lämmel

Übung: Quicksort. Erster Schritt zu Quicksort: Felder "partitionieren"

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Informatik II, SS 2014

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Rekursive Funktionen

// Objekt-Methoden: public void insert(int x) { next = new List(x,next); } public void delete() { if (next!= null) next = next.next; } public String

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Übungsblatt 6. Thema: BubbleSort, MergeSort, Divide&Conquer, Master-Theorem

Einstieg in die Informatik mit Java

Kapitel zu bearbeitende Aufgaben: 6.1 bis :

QuickSort ist ein Sortieralgorithmus, der auf der Idee des Teile & Beherrsche beruht, und das gegebene Array an Ort und Stelle (in place) sortiert

Arrays. Gilbert Beyer und Annabelle Klarl. Einführung in die Informatik. Zentralübung zur Vorlesung Einführung in die Informatik

1 of :17:14

Programmierung für Mathematik HS11

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Grundlegende Sortieralgorithmen

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

a) Erläutern Sie die Vorteile der Konstrukte zur Fehlerbehandlung in Java.

6 Speicherorganisation

Informatik II Musterlösung

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Vorkurs Informatik WiSe 16/17

Informatik II Übung 05. Benjamin Hepp 3 April 2017

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

Nachholklausur zur Vorlesung: Einführung in die objektorientierte Programmierung mit Java WS1415

Vorkurs Informatik WiSe 15/16

Schnittstellen, Stack und Queue

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

12 Abstrakte Klassen, finale Klassen und Interfaces

3.2. Divide-and-Conquer-Methoden

Grundlegende Sortieralgorithmen

Kapitel 5: Interfaces

Mergesort. Idee. Die folgende Funktion mergesort sortiert eine Folge a vom unteren Index lo bis zum oberen Index hi.

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Android will doch nur spielen. Java Vertiefung und Übung

Übung Algorithmen I

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Informatik II Übung 5 Gruppe 4

Informatik II Übung, Woche 10

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Übersicht. Datenstrukturen und Algorithmen. Divide-and-Conquer. Übersicht. Vorlesung 9: Quicksort (K7)

Informatik II Übung 5

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Mittelwert und Standardabweichung

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

Wenn... dann... if (condition) statement. if (kontostand < 0) System.out.println("Oops..."); false. condition. true. statement

Allgemeine Hinweise:

Tutoraufgabe 1 (Sortieren): Lösung: Datenstrukturen und Algorithmen SS14 Lösung - Übung 4

Transkript:

Aufgabe 1: Weitere Aufgaben aus dem Buch 1. Bearbeiten Sie die Aufgaben 8.2, 8.5 und 8.6 zum DoME Beispiel. 8.2: CD: Zeitgeist (65 mins) Schiller tracks: 13 super CD :) 8.5: Es können nun Methoden von CD und Item aufgerufen werden. title: Zeitgeist (65 mins) nice CD 8.6: public class Item [...] * Return Title public String gettitle() return title; public class CD extends Item [...] * Print Artist and Title public void printshortdetails() System.out.println(artist + ": " + gettitle()); Schiller: Zeitgeist public class DVD extends Item [...] * Print Director and Title public void printshortdetails() System.out.println(director + ": " + gettitle()); Schlümpfe: Die Rache PRG1_OOP10-ALG5_LT.docx Seite 1 von 10 http://hslu.ximit.ch

2. Diskutieren Sie in Gruppen die Aufgaben 8.10 und 8.11. done 3. Diskutieren Sie die Aufgabe 8.12 und überprüfen Sie Ihre Antworten gemäss Aufgabe 8.13. s1 = p1; s1 = p2; p1 = s1; t1 = s1; s1 = phd1; phd1 = s1; Error: incompatible types - found Person but expected Student Error: incompatible types - found Person but expected Student OK Error: incompatible types - found Student but expected Teacher OK Error: incompatible types - found Student but expected PhDStudent Aufgabe 2: Quicksort 1. Implementieren Sie in der vorgegebenen Klasse QuickSort (siehe ILIAS) eine main(...) Methode mit Testfällen. /* Copyright 2008 - Hochschule Luzern * Eine Implementationenen von Quicksort. * * @author Peter Sollberger * @version 1.2, 31. Oktober 2008 public class Quicksort * Konstruktor macht nichts. public Quicksort() * Quicksort Algorithmus mit rechtem Trennelement. * @param a Array zum Sortieren * @param left linke Grenze * @param right rechte Grenze public void quicksort(int a[], int left, int right) int up = left; // linke Grenze int down = right - 1; // rechte Grenze (ohne Trennelement) int t = a[right]; // rechtes Element als Trennelemt boolean allelementchecked = false; do while (a[up] < t) up++; // suchen größeres Element von links an while ((a[down] > t) && (down > up)) down--; // suchen kleineres Element von rechts an if (up < down) exchange(a, up, down); // austauschen up++; // linke und rechte Grenze verschieben: down--; else allelementchecked = true; while (!allelementchecked); // Überschneidung exchange(a, up, right); // Trennelement an endgültige Position (a[up]) if (left < up - 1) // mehr als 1 Element in linker Teilfolge? quicksort(a, left, up - 1); // linke Hälfte sortieren if (up + 1 < right) // mehr als 1 Element in rechter Teilfolge? PRG1_OOP10-ALG5_LT.docx Seite 2 von 10 http://hslu.ximit.ch

quicksort(a, up + 1, right); // rechte Hälfte sortieren (ohne Trennelement) * Vertausche im übergebenen Array die beiden Elemente an der Position * firstindex und secondindex. private void exchange(int a[], int firstindex, int secondindex) int tmp; tmp = a[firstindex]; a[firstindex] = a[secondindex]; a[secondindex] = tmp; public void testquicksort(int[] myarray) System.out.print("unsortiert: "); for (int i = 0; i < myarray.length; i++) System.out.print(myArray[i] + " "); System.out.println(); // Array sortieren quicksort(myarray, 0, myarray.length-1); System.out.print("sortiert: "); for (int i = 0; i < myarray.length; i++) System.out.print(myArray[i] + " "); System.out.println("\n"); public void main() // init array int[] arrayone = 1,2,3,4,5,6,7; int[] arraytwo = 7,6,5,4,3,2,1; int[] arraythree = 3,7,2,4,6,1,5; int[] arrayfour = 0,0,1,1,2,3,4; int[] arrayfive = 4,2,1,5,1,4,7; int[] arraysix = 3,3; int[] arrayseven = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; int[] arrayeight = -2,2,-1,1,3,0; int[] arraynine = -1535437,564651866,2,56874,-4567,-10,4567; int[] arrayten = 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 1; testquicksort(arrayone); testquicksort(arraytwo); testquicksort(arraythree); testquicksort(arrayfour); testquicksort(arrayfive); testquicksort(arraysix); testquicksort(arrayseven); testquicksort(arrayeight); testquicksort(arraynine); testquicksort(arrayten); unsortiert: 3 7 2 4 6 1 5 sortiert: 1 2 3 4 5 6 7 unsortiert: 0 0 1 1 2 3 4 sortiert: 0 0 1 1 2 3 4 unsortiert: -1535437 564651866 2 56874-4567 -10 4567 sortiert: -1535437-4567 -10 2 4567 56874 564651866 unsortiert: 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 sortiert: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 PRG1_OOP10-ALG5_LT.docx Seite 3 von 10 http://hslu.ximit.ch

2. Implementieren Sie eine zweite Version von Quicksort, mit der "median-of-three" Verbesserung. * Quicksort Algorithmus mit meedian-of-three * @param a Array zum Sortieren * @param left linke Grenze * @param right rechte Grenze public void quicksortmeedianofthree(int a[], int left, int right) int up = left; // linke Grenze int down = right - 1; // rechte Grenze (ohne Trennelement) boolean allelementchecked = false; // trennelement bestimmen // int t = a[right]; // rechtes Element als Trennelemt int t; if (a[left] > a[right]) if (a[left] > a[right/2]) t = a[left]; exchange(a, left, right); // Trennelement verschieben else t = a[right/2]; exchange(a, right/2, right); // Trennelement verschieben else if (a[right] > a[right/2]) t = a[right]; else t = a[right/2]; exchange(a, right/2, right); // Trennelement verschieben do while (a[up] < t) up++; // suchen größeres Element von links an while ((a[down] > t) && (down > up)) down--; // suchen kleineres Element von rechts an if (up < down) exchange(a, up, down); // austauschen up++; // linke und rechte Grenze verschieben: down--; else allelementchecked = true; while (!allelementchecked); // Überschneidung exchange(a, up, right); // Trennelement an endgültige Position (a[up]) if (left < up - 1) // mehr als 1 Element in linker Teilfolge? quicksort(a, left, up - 1); // linke Hälfte sortieren if (up + 1 < right) // mehr als 1 Element in rechter Teilfolge? quicksort(a, up + 1, right); // rechte Hälfte sortieren (ohne Trennelement) PRG1_OOP10-ALG5_LT.docx Seite 4 von 10 http://hslu.ximit.ch

3. Vergleichen Sie die Rekursionstiefen der beiden Implementationen mit verschiedenen Testdaten (z.b. einer bereits sortierten Folge). bereits sortierte Folge: meedian-of-three wird schneller sein unsortierte Folge: meedian-of-three ggf. gleich wie normal unsortiert: 37 65 58 34 24 60 63 78 84 34 52 64 13 57 10 42 69 27 80 67 14 24 7 60 79 30 49 22 52 10 59 50 54 39 49 55 18 42 30 22 95 95 87 78 54 97 54 79 37 82 sortiert: Rekursionstiefe: 33 *sortiert: Rekursionstiefe: 35 unsortiert: 10 10 13 14 18 22 22 24 24 27 30 30 34 34 37 37 39 42 42 49 49 50 52 52 54 54 54 55 57 58 59 60 60 63 64 65 67 69 7 78 78 79 79 80 82 84 87 95 95 97 sortiert: Rekursionstiefe: 45 *sortiert: Rekursionstiefe: 35 PRG1_OOP10-ALG5_LT.docx Seite 5 von 10 http://hslu.ximit.ch

Aufgabe 3: Quicksort Speicherbedarf Die Methode Quicksort ruft sich rekursiv auf. Bei jedem Aufruf werden die Übergabeparameter auf dem Stack abgelegt, und jeder Methodenaufruf belegt für seine Variablen ebenfalls einen gewissen Platz auf dem Stack. Nennen wir diesen Platzbedarf eine Quick-Speichereinheit. 1. Aus wie vielen Bytes besteht eine Quick-Speichereinheit beim klassischen Quicksort (Implementation gemäss Folien)? Parameter: char[] a pointer => Java 32Bit => 32 Bit = 4 Byte int left 4 Byte int right 4 Byte Lokale Vars: int up 4 Byte int down 4 Byte char t 2 Byte boolean allchecked 1 Byte 23 Byte 2. Wie verändert sich die Quick-Speichereinheit beim "Quick-Insertion-Sort" Verfahren? Parameter: Gleich wie bei Aufgabe 1: char[] a pointer => Java 32Bit => 32 Bit = 4 Byte int left 4 Byte int right 4 Byte Lokale Vars: char tmp 2 Byte int i 4 Byte int j 4 Byte 22 Byte 3. Wie gross (in Quick-Speichereinheiten) muss der Stack bei Quicksort im günstigsten und im ungünstigsten Fall sein? 22 resp. 23 Byte PRG1_OOP10-ALG5_LT.docx Seite 6 von 10 http://hslu.ximit.ch

Aufgabe 4: Mergesort (optional) 1. Implementieren Sie den Mergesort Algorithmus. * Write a description of class Mergesort here. * * @author HSLU * @version 5.6 public class Mergesort private int[] b; * Nach aussen sichtbare Mergesort Methode. * Muss zuerst Zwischenspeicher bereitstellen. * @param a Array zum Sortieren public void mergesort(int[] a) b = new int[a.length]; mergesortprivate(a, 0, a.length-1); * Rekursiver Mergesort Algorithmus. * Benötigt Hilfsarray b mit der Grösse von a * @param a Array zum Sortieren * @param left Linke Grenze, zu Beginn 0 * @param right Rechte Grenze, zu Beginn a.length-1 private void mergesortprivate(int a[], int left, int right) int i, j, k, m; if(right > left) m=(right + left) / 2; // Mitte ermitteln mergesortprivate(a, left, m); // linken Teil sortieren mergesortprivate(a, m + 1, right); // rechten Teil sortieren // "Mergen" for(i = left; i <= m; i++) // linker Teil in Hilfsarray b[i] = a[i]; for(j = m; j < right; j++) // rechter Teil umgekehrt in Hilfsarray b[right + m - j] = a[j + 1]; i = left; j = right; // i für rechte und j für linke Hälfte for(k = left; k <= right; k++) // füge sortiert in a ein if(b[i] <= b[j]) a[k] = b[i]; i++; else a[k] = b[j]; j--; public void testmergesort() int[] arraytest = 10, 10, 13, 14, 18, 22, 22, 24, 24, 27, 30, 30, 34, 34, 37, 37, 39, 42, 42, 49, 49, 50, 52, 52, 54, 54, 54, 55, 57, 58, 59, 60, 60, 63, 64, 65, 67, 69, 7, 78, 78, 79, 79, 80, 82, 84, 87, 95, 95, 97; mergesort(arraytest); for (int i = 0; i < arraytest.length; i++) System.out.print(arrayTest[i] + " "); PRG1_OOP10-ALG5_LT.docx Seite 7 von 10 http://hslu.ximit.ch

2. Vergleichen Sie die Geschwindigkeit von Mergesort mit dem klassischen Quicksort für verschiedenste Eingabedaten. Wählen Sie grosse, zufällige Folgen, damit Sie Geschwindigkeitsunterschiede messen können. Verwenden Sie dabei die Methode System.currentTimeMillis() zur Zeitmessung. Können Sie die Aussage aus der Vorlesung (Geschwindigkeitsvorteil von Quicksort: 10% - 50%) beobachten? SIZE: 10 000 000 MAXVALUE: 1 000 1 2 3 4 5 6 7 8 9 10 Average [ms] Quicksort 895 894 881 890 889 894 898 898 885 886 891 Mergesort 1'898 1'865 1'868 1'871 1'865 1'870 1'866 1'863 1'865 1'867 1'870 47% 48% 47% 48% 48% 48% 48% 48% 47% 47% 48% import java.util.random; * Sortieralgorithmen vergleichen * @author Felix Rohrer * @version 1.0 public class TimeTest // instance variables - replace the example below with your own private int[] numbers; private final static int SIZE = 100000; private final static int MAXVALUE = 500; * Constructor for objects of class TimeTest public TimeTest() * Compare Selectionsort, Quicksort and Mergesort public void runtest() // init new random numbers numbers = new int[size]; Random generator = new Random(); for (int i = 0; i < numbers.length; i++) numbers[i] = generator.nextint(maxvalue); long starttime; long stoptime; long elapsedtime; // Selectionsort Selectionsort sorta = new Selectionsort(); starttime = System.currentTimeMillis(); sorta.directselect(numbers); stoptime = System.currentTimeMillis(); elapsedtime = stoptime - starttime; System.out.println("Selectionsort: " + elapsedtime); // Quicksort Quicksort sortb = new Quicksort(); starttime = System.currentTimeMillis(); sortb.quicksort(numbers, 0, numbers.length-1); stoptime = System.currentTimeMillis(); elapsedtime = stoptime - starttime; System.out.println("Quicksort: " + elapsedtime); // Mergesort Mergesort sortc = new Mergesort(); starttime = System.currentTimeMillis(); sortc.mergesort(numbers); stoptime = System.currentTimeMillis(); elapsedtime = stoptime - starttime; System.out.println("Mergesort: " + elapsedtime); PRG1_OOP10-ALG5_LT.docx Seite 8 von 10 http://hslu.ximit.ch

Aufgabe 5: Weiter Aufgaben aus dem Buch (optional) 1. Bearbeiten Sie die Aufgaben 8.15, 8.16, 8.17 und 8.19 aus dem Buch. 8.15: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/package-tree.html http://www.programcreek.com/2009/02/the-interface-and-class-hierarchy-for-collections/ 8.16: PRG1_OOP10-ALG5_LT.docx Seite 9 von 10 http://hslu.ximit.ch

8.17: 8.19: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/package-tree.html PRG1_OOP10-ALG5_LT.docx Seite 10 von 10 http://hslu.ximit.ch