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

Ähnliche Dokumente
Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Die Welt in unseren Programmen false -1.4E-12. false. Klassen

Algorithmen und Datenstrukturen

Interfaces und Generics

Sortieren von Objekten

Klausur Algorithmen und Datenstrukturen I SS 03

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen. Übersicht. Interfaces und Generics. InsertionSort für Punkte. InsertionSort für Punkte

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

Sortieralgorithmen OOPM, Ralf Lämmel

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

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

Grundlagen: Algorithmen und Datenstrukturen

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

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

Algorithmen und Datenstrukturen

Präsenzübung Datenstrukturen und Algorithmen SS 2014

Informatik II, SS 2016

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

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

Datenstrukturen. Mariano Zelke. Sommersemester 2012

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

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

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

14. Sortieren II Heapsort. Heapsort. [Max-]Heap 7. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

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

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Java. public D find(k k) { Listnode K, D n = findnode(k); if(n == null) return null; return n.data; Java

Heapsort, Quicksort, Mergesort. 8. Sortieren II

Tutoraufgabe 1 (Sortieralgorithmus):

8. Sortieren II. 8.1 Heapsort. Heapsort. [Max-]Heap 6. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Heapsort, Quicksort, Mergesort. 8. Sortieren II

Programmieren I. Methoden-Spezial Heusch --- Ratz 6.1, Institut für Angewandte Informatik

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

Klassenvariablen, Klassenmethoden

Kapitel 6 Elementare Sortieralgorithmen

Datenstrukturen und Algorithmen (SS 2013)

(08 - Einfache Sortierverfahren)

Mergesort. Inhaltsverzeichnis. Veranschaulichung der Funktionsweise. aus Wikipedia, der freien Enzyklopädie

Übung Algorithmen und Datenstrukturen

Die Schnittstelle Comparable

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

Übungsblatt 7. Thema: Sortieren, Objektorientierung

Algorithmen und Datenstrukturen

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

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

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

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

DAP2 Praktikum Blatt 2

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

Nachklausur Bitte in Druckschrift leserlich ausfüllen!

Fallstudie: Online-Statistik

Datenstrukturen und Algorithmen

Algorithmen und Datenstrukturen

Grundlagen der Programmierung WS 15/16 (Vorlesung von Prof. Bothe)

Erste Java-Programme (Scopes und Rekursion)

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Rekursion. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

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

Kap. 3: Sortieren. Überblick. Unser Sortierproblem. Motivation. Laufzeitmessung. Warum soll ich hier bleiben? Sortierverfahren sind WICHTIG!!!

Interne Sortierverfahren

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Spezielle Sortierverfahren Autor: Sven Schuierer

Kap. 3: Sortieren. 4. VO DAP2 SS April 2009

Rekursion. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Programmieren I. Methoden-Special Heusch --- Ratz 6.1, Institut für Angewandte Informatik

4. Sortieren 4.1 Vorbemerkungen

Datenstrukturen und Algorithmen (SS 2013)

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

1. Teilklausur Gruppe A. Bitte in Druckschrift leserlich ausfüllen!

Übersicht. 4.1 Ausdrücke. 4.2 Funktionale Algorithmen. 4.3 Anweisungen. 4.4 Imperative Algorithmen Variablen und Konstanten. 4.4.

Grundlegende Sortieralgorithmen

Grundlegende Sortieralgorithmen

Tag 5. Repetitorium Informatik (Java) Dozent: Marius Kamp Lehrstuhl für Informatik 2 (Programmiersysteme)

Variablenarten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

FAKULTÄT FÜR INFORMATIK

Suchen und Sortieren Sortieren. Mergesort

CS1005 Objektorientierte Programmierung

Martin Unold INFORMATIK. Geoinformatik und Vermessung

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

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Vorkurs Informatik Wintersemester 2017/2018. Programmtexte

Suchen und Sortieren OOPM, Ralf Lämmel

Stack. Seniorenseminar Michael Pohlig

Klausur zur Lehrveranstaltung. Technische Informatik für Ingenieure WS 2009/10

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Lösung der Übungsaufgabenserie 12 Grundlagen der Informatik und Numerik

Überblick. Lineares Suchen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Algorithmen und Datenstrukturen CS1017

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

Rekursive Funktionen

Übung Algorithmen I

Transkript:

Algorithmen und Datenstrukturen Wintersemester 2012/13 8. Vorlesung Algorithmen in Java Jan-Henrik Haunert Lehrstuhl für Informatik I Übersicht Berechnung der Potenz für zwei ganze Zahlen Klausuraufgabe SS 2010! Klausuraufgabe WS 2010/2011! Standard- und Referenzdatentypen Sortieren mit InsertionSort und MergeSort Anwendung: Zählen von falsch geordneten Paaren Anpassung der Algorithmen Iterative Berechnung der Potenz Berechnung der Potenz für zwei ganze Zahlen und. public class Potenz { int x = 3; int y = 4; int potenz = 1; for (int i = 0; i < y; i++) { //wird y-mal ausgefuehrt potenz *= x; System.out.println(x + " hoch " + y + " ist " + potenz); Iterative Berechnung der Potenz Berechnung der Potenz für zwei ganze Zahlen und. public class Potenz { int x = 3; int y = 4; Besser: Potenzberechnung in eigener Methode System.out.println(x + " hoch " + y + " ist " + potenz(x,y)); Iterative Berechnung der Potenz Berechnung der Potenz für zwei ganze Zahlen und. public class Potenz { int x = 3; int y = 4; System.out.println(x + " hoch " + y + " ist " + potenz(x,y)); int potenz = 1; for (int i = 0; i < y; i++) { //wird y-mal ausgefuehrt potenz *= x; return potenz; Berechnung der Potenz für zwei ganze Zahlen und. public class Potenz { int x = 3; int y = 4; System.out.println(x + " hoch " + y + " ist " + potenz(x,y)); return x * potenz(x, y - 1); An Basisfall denken! =

Berechnung der Potenz für zwei ganze Zahlen und. public class Potenz { int x = 3; int y = 4; System.out.println(x + " hoch " + y + " ist " + potenz(x,y)); return x * potenz(x, y - 1); Wie oft wird potenz aufgerufen? = +1 -mal Berechnung der Potenz für zwei ganze Zahlen und. Geht es besser? = = falls gerade falls ungerade int p = potenz(x, y / 2) * potenz(x, y / 2); if (y % 2 == 0) return p; return p * x; Berechnung der Potenz für zwei ganze Zahlen und. Rekursionsgleichung: = 2 2 +Θ 1 log = log 2=1 z.b. für =0,5 Also gilt mit Fall 1 des Master-Theorems: Θ Berechnung der Potenz für zwei ganze Zahlen und. Geht es besser? = = falls gerade falls ungerade int p = potenz(x, y / 2); if (y % 2 == 0) return p * p; return p * p * x; Berechnung der Potenz für zwei ganze Zahlen und. Rekursionsgleichung ( = ): = 2 +Θ 1 log = log 1=0 Θ 1 Also gilt mit Fall 2 des Master-Theorems: Θ log Berechnung der Potenz für zwei ganze Zahlen und. Wie oft wird potenz aufgerufen? wird in jedem Aufruf mindestens um die Hälfte verringert. Für =2 gibt es + 2 = log +2 Aufrufe. int p = potenz(x, y / 2); if (y % 2 == 0) return p * p; return p * p * x;

Berechnung der Potenz für zwei ganze Zahlen und. Wie oft wird potenz aufgerufen? wird in jedem Aufruf mindestens um die Hälfte verringert. Es gibt log + 2 Aufrufe! int p = potenz(x, y / 2); if (y % 2 == 0) return p * p; return p * p * x; Berechnung der Potenz für zwei ganze Zahlen und. Wie oft wird potenz aufgerufen? wird in jedem Aufruf mindestens um die Hälfte verringert. Θ log Es gibt Aufrufe! int p = potenz(x, y / 2); if (y % 2 == 0) return p * p; return p * p * x; cos 71.356 =? 180 360 cos cos = 1 2 cos + cos + cos = 2cos 2 1 cos = 2cos 2 1 cos + = 2cos cos cos cos 2 = 2cos 1 cos = 2cos 2 1 public class Cosinus { for (double i = 0; i <= 360; i += 15) { System.out.println("cos " + i + " = " + cos(i * Math.PI / 180.0)); public static double cos(double x) { return 2.0 * cos(x / 2.0) * cos(x / 2.0) - 1; public class Cosinus { for (double i = 0; i <= 360; i += 15) { System.out.println("cos " + i + " = " + cos(i * Math.PI / 180.0)); public static double cos(double x) { double cosx = cos(x / 2.0); return 2.0 * cosx * cosx - 1;

cos = 2cos 2 1 cos = 2cos 2 1 cos = 2cos 2 1 Näherung für kleine Winkel ( < 0.001): cos = 1 Ausgabe: cos 0.0 = 1.0 cos 15.0 = 1.0 cos 30.0 = 1.0 cos 45.0 = 1.0 cos 360.0 = 1.0 Näherung für kleine Winkel ( < 0.001): cos = 1 public static double cos(double x) { if (x < 0.001) return 1; double cosx = cos(x / 2.0); return 2.0 * cosx * cosx - 1; 180 360 public static double cos(double x) { if (x < 0.001) return 1; double cosx = cos(x / 2.0); return 2.0 * cosx * cosx - 1; public static double cos(double x) { if (x < 0.001) return 1 0.5 * x * x; double cosx = cos(x / 2.0); return 2.0 * cosx * cosx - 1; 180 360 cos = 2cos 2 1 Näherung für kleine Winkel ( < 0.001): cos = 1 1,5 1 0,5 0 0 50 100 150 200 250 300 350 400-0,5-1 cos = 2cos 2 1 Achtung: Verwende besser Methode cos der Klasse java.lang.math Methoden mit Standarddatentypen Inkrementieren einer Zahl a. public class Zaehler { int a = 1; inkrementiere(a); System.out.println("a = " + a); public static void inkrementiere(int a) { a++; Ausgabe: a = 1-1,5

Methoden mit Standarddatentypen Inkrementieren einer Zahl a. public class Zaehler { int a = 1; inkrementiere(a); System.out.println("a = " + a); public static void inkrementiere(int a) { a++; Bei Standarddatentypen wird Wert von Variablen übergeben. Methoden mit Standarddatentypen Inkrementieren einer Zahl a. public class Zaehler { int a = 1; a = inkrementiere(a); System.out.println("a = " + a); public static int inkrementiere(int a) { return a + 1; Methoden mit Referenzdatentypen Inkrementieren der Zahlen in einem Feld. public class FeldZaehler { int[] A = {1, 3, 2, 4; inkrementiere(a); for (int i = 0; i < A.length; i++) System.out.println("A" + i + " = " + A[i]); public static void inkrementiere(int[] A) { for (int i = 0; i < A.length; i++) A[i]++; Methoden mit Referenzdatentypen Inkrementieren der Zahlen in einem Feld. public class FeldZaehler { int[] A = {1, 3, 2, 4; inkrementiere(a); Ausgabe: for (int i = 0; i < A.length; i++) A0 = 2 System.out.println("A" + i + " = " + A[i]); A1 = 4 public static void inkrementiere(int[] a) { for (int i = 0; i < A.length; i++) A2 a[i]++; = 3 A3 = 5 Methoden mit Referenzdatentypen Inkrementieren der Zahlen in einem Feld. public class FeldZaehler { int[] A = {1, 3, 2, 4; inkrementiere(a); for (int i = 0; i < A.length; i++) System.out.println("A" + i + " = " + A[i]); public static void inkrementiere(int[] A) { for (int i = 0; i < A.length; i++) A[i]++; Bei Feldern wird Referenz übergeben. Methoden mit Referenzdatentypen Sortieren der Zahlen in einem Feld. public class Sortierverfahren { int[] A = {1, 3, 2, 4; sort(a); for (int i = 0; i < A.length; i++) System.out.println("A" + i + " = " + A[i]); public static void sort(int[] A) { //TODO: Sortierverfahren Deines Vertrauens

Sortieren mit InsertionSort public static void insertionsort(int[] A) { InsertionSort(array of int ) for =2 to.h do = = 1 while >0 and +1 = = 1 +1 = > do Beispiel: Wohlstände und Fehlstände Sei =,,, eine Folge natürlicher Zahlen. Wir nennen ein Indexpaar, mit 0 << genau dann einen Wohlstand von, wenn <. genau dann einen Fehlstand von, wenn >. 4,7,1,4,5,6 Wohlstand: 1,2 Beispiel: Wohlstände und Fehlstände Sei =,,, eine Folge natürlicher Zahlen. Wir nennen ein Indexpaar, mit 0 << genau dann einen Wohlstand von, wenn <. genau dann einen Fehlstand von, wenn >. 4,7,1,4,5,6 Fehlstand: 1,3 Wohlstände und Fehlstände Sei =,,, eine Folge natürlicher Zahlen. Wir nennen ein Indexpaar, mit 0 << genau dann einen Wohlstand von, wenn <. genau dann einen Fehlstand von, wenn >. Die Folge, 1,, 1 hat die meisten Fehlstände aller Folgen mit Zahlen, nämlich: 1 2 Wohlstände und Fehlstände Sei =,,, eine Folge natürlicher Zahlen. Wir nennen ein Indexpaar, mit 0 << genau dann einen Wohlstand von, wenn <. genau dann einen Fehlstand von, wenn >. Anzahl Fehlstände + Anzahl Wohlstände = 1 2 (bei verschiedenen Elementen in ) Wohlstände und Fehlstände Sei =,,, eine Folge natürlicher Zahlen. Wir nennen ein Indexpaar, mit 0 << genau dann einen Wohlstand von, wenn <. genau dann einen Fehlstand von, wenn >. Jeder Algorithmus zur Ausgabe aller Fehlstände in braucht also im schlechtesten Fall alleine für die Ausgabe 1 Operationen. 2

Wohlstände und Fehlstände Sei =,,, eine Folge natürlicher Zahlen. Wir nennen ein Indexpaar, mit 0 << genau dann einen Wohlstand von, wenn <. genau dann einen Fehlstand von, wenn >. Idee: Fehlstände zählen, nicht ausgeben public static void insertionsort(int[] A) { 1 2 5 7 3 6 Sortierter Bereich j = 4 = 5 1 2 5 7 3 6 Sortierter Bereich

1 2 5 7 3 6 Sortierter Bereich Behebt alle Fehlstände, 5 1 2 3 5 7 6 Sortierter Bereich Behebt alle Fehlstände, 5 1 2 3 5 7 6 Sortierter Bereich Jeder Schleifendurchlauf behebt einen Fehlstand Anzahl Fehlstände Anzahl Vergleiche bei InsertionSort Anzahl Fehlstände + 1 MergeSort(array of int, int l =1, int =.h) if l < then = l+ 2 MergeSort(, l, ) MergeSort(, + 1, ) Merge (, l,, ) public static void mergesort(int[] A, int l, int r) { if (l < r) { int m = (l + r) / 2; mergesort(a, l, m); mergesort(a, m + 1, r); merge(a, l, m, r); MergeSort(array of int, int l =1, int =.h) public static void mergesort(int[] A) { mergesort(a, 0, A.length - 1); public static void mergesort(int[] A, int l, int r) { if (l < r) { int m = (l + r) / 2; mergesort(a, l, m); mergesort(a, m + 1, r); merge(a, l, m, r);

Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 4 7 2 3 6 l 1 4 7 2 3 6 Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 4 7 2 3 6 Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 1 4 7 2 3 6 Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 2 1 4 7 2 3 6 Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 2 3 1 4 7 2 3 6 Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 2 3 4 1 4 7 2 3 6

Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 2 3 4 6 1 4 7 2 3 6 Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 2 3 4 6 7 1 4 7 2 3 6 Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 4 7 2 3 6 Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 1 4 7 2 3 6 Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 2 1 4 7 2 3 6 Merge(array of int, int l, int, int ) = l+1 = let 1 +1 and [1 +1] be new arrays of int 1 =[l ] 1 =[ +1 ] +1 = +1 = ==1 for =l to do if then = = + 1 [] = [] =+1 1 2 1 4 7 2 3 6 Wird von Feld gewählt, so werden 1 +1 Fehlstände beseitigt.

=0 for =l to do if then = = + 1 [] = [] =+ +1 =+1 return Fehlstände lassen sich mit MergeSort zählen! Wird von Feld gewählt, so werden 1 +1 Fehlstände beseitigt. public static int mergesort(int[] A, int l, int r) { int fehlstaende = 0; if (l < r) { int m = (l + r) / 2; fehlstaende += mergesort(a, l, m); fehlstaende += mergesort(a, m + 1, r); fehlstaende += merge(a, l, m, r); Schluss Bei Rekursionen denkt an den Basisfall/Rekursionsabbruch! vermeidet Mehrfachaufrufe mit gleichem Argument leitet die Rekursionsgleichungen her! Aufgabe Wohlstände/Fehlstände passt bekannte Algorithmen an Ausgabe aller Fehlstände Ausgabe Anzahl Fehlstände