Algorithmen und Datenstrukturen CS1017

Ähnliche Dokumente
(08 - Einfache Sortierverfahren)

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

Interne Sortierverfahren

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

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

Was der Mathematiker Gauß nicht konnte, das können wir Prof. R. Zavodnik/C++ Vorlesung/Kapitel IX 1

Kapitel 3: Sortierverfahren Gliederung

Informatik II, SS 2016

Probeklausur zur Vorlesung

Algorithmen und Datenstrukturen CS1017

Endklausur 25. September 2012

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

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

Konstruktor. public Rational(int i) { Zaehler = i; Nenner = 1; }

Programmieren I. Methoden-Special 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

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Algorithmen und Datenstrukturen 2. Stefan Florian Palkovits, BSc Juni 2016

Datenstrukturen / Container in Java

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

II.3.1 Rekursive Algorithmen - 1 -

1. Rekursive Algorithmen 2. Rekursive (dynamische) Datenstrukturen

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

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

Übung Algorithmen und Datenstrukturen

Informatik II, SS 2018

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

INSERTION-SORT: Ja, Es wird immer das erste, kleinste Element an die neue Liste angehängt.

Übung Algorithmen und Datenstrukturen

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

Algorithmen & Datenstrukturen Midterm Test 2

Übungsstunde 6. Einführung in die Programmierung

ALP II Dynamische Datenmengen

Übungsstunde 5. Einführung in die Programmierung

Suchen und Sortieren Sortieren. Mergesort

Prof. H. Herbstreith Fachbereich Informatik. Leistungsnachweis. Informatik 1 WS 2001/2002

Die Schnittstelle Comparable

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Elementare Sortierverfahren

Grundlagen: Algorithmen und Datenstrukturen

Anweisungen zur Ablaufsteuerung

3.2. Divide-and-Conquer-Methoden

4. Algorithmen und Datenstrukturen I Grundlagen der Programmierung 1 (Java)

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

Algorithmen und Datenstrukturen (für ET/IT)

Grundlegende Sortieralgorithmen

Sortieralgorithmen OOPM, Ralf Lämmel

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

Aufgabenblatt: Arrays

Städtisches Gymnasium Olpe Java Ht Informatik - Q1 Die Klasse List im Abitur Methoden und Beispielcode Hier alle wichtigen Methoden. Ein Beispielcode

Kapitel 5: Iterierbare Container

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Reihungen. Prof. Dr. Christian Böhm. In Zusammenarbeit mit Gefei Zhang. WS 07/08

Überblick. Rekursive Methoden. Backtracking. Memorization. Einfache rekursive Datenstrukturen. Aufzählen, Untermengen, Permutationen, Bitmengen

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Aufgabenblatt 5. Kompetenzstufe 1. Allgemeine Informationen zum Aufgabenblatt:

Informatik II Musterlösung

Informatik II, SS 2018

Grundlegende Sortieralgorithmen

Algorithmen und Datenstrukturen CS1017

Software Entwicklung 1

Reihungen. Martin Wirsing. in Zusammenarbeit mit Michael Barth, Fabian Birzele und Gefei Zhang

Rekursive Funktionen

Programmierung mit Feldern OOPM, Ralf Lämmel

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

Kapitel 12: Induktive

7. Verkettete Strukturen: Listen

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

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

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

Aufgabe : Laufzeit von Selection Sort

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

Algorithmen und Datenstrukturen (für ET/IT)

1 Einführung. 2 Grundlagen von Algorithmen. 3 Grundlagen von Datenstrukturen. 4 Grundlagen der Korrektheit von Algorithmen

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

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Grundzüge der Wirtschaftsinformatik WS 2002/03. Wiederholung Java. Programmierzyklus. Heiko Rossnagel Problem

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Institut für Programmierung und Reaktive Systeme 6. Juli Programmieren II. Übungsklausur

Graphalgorithmen Minimale Spannbäume. Kruskal: Minimaler Spannbaum

Informatik II Sortieren

Informatik II Sortieren

Kapitel 4: Bäume i. 1. Einleitung. 2. Ein Datenmodell für Listen. 3. Doppelt-verkettete Listen. 4. Bäume. 5. Das Collections-Framework in Java

Suchen und Sortieren Sortieren. Heaps

Übungsstunde 4. Einführung in die Programmierung

7. Sortieren Lernziele. 7. Sortieren

Übung Algorithmen und Datenstrukturen

Aufgabe 8. 1 Arbeitsweise illustrieren. 2 Korrektheitsbeweis führen. 3 Laufzeitanalyse durchführen.

Einführung in die Programmierung. (K-)II/Wb17

Martin Unold INFORMATIK. Geoinformatik und Vermessung

2 Sortieren. Beispiel: Es seien n = 8 und a = i : a i : ϕ(i) : a ϕ(i) :

Übung Algorithmen und Datenstrukturen

18. Natürliche Suchbäume

Transkript:

Algorithmen und Datenstrukturen CS1017 Th. Letschert TH Mittelhessen Gießen University of Applied Sciences Entwurf von Algorithmen I Rohe Kraft / Erschöpfende Suche Kombinatorische Objekte

Entwurf von Algorithmen Paradigmen des Algorithmen-Entwurfs Der Entwurf neuer Algorithmen erfordert Kreativität. Allgemeine Denk- und Lösungsansätze (Paradigmen, Strategien, Entwurfstechniken) können dabei oft sehr nützlich sein: Sie liefern uns Muster zur Lösung unterschiedlicher Probleme. Sie können systematisch in gängige Kontroll- und Datenstrukturen diverser Programmiersprachen umgesetzt werden. Das Verhalten (Effizienz, Komplexität) der entsprechenden Algorithmen ist bekannt. Bekannte Strategien für den Entwurf von Algorithmen (kurz Algorithmische Strategien) Rohe-Kraft / Erschöpfende Suche Optimierungen der erschöpfenden Suche Backtracking Branch-and-Bound Reduziere und Herrsche / Teile-und-Herrsche Dynamische Programmierung Gier... Seite 2

Rohe Kraft Rohe Kraft / rohe Gewalt (brute force)... ist das was uns oft als erstes im Angesicht eines Problems einfällt. Algorithmen, die mit der Strategie rohe Kraft entwickelt werden, verwenden eine naheliegende Methode zur Lösung des Problems basieren oft direkt auf der Beschreibung des Problems verzichten auf Optimierungen setzen auf die Kraft des Prozessors Die Strategie rohe Kraft ist angemessen wenn das Problem nur auf kleine Fälle angewendet wird nur selten gelöst werden muss der Aufwand zur Entwicklung besserer Algorithmen nicht lohnt bessere Algorithmen bisher nicht gefunden werden konnten Beispiel berechne an mod m (ein Bestandteil oft genutzter kryptographischer Algorithmen) Algorithmus: 1. multipliziere 1 n-mal mit a 2. bestimme dann den Rest bei ganzzahliger Division durch m rohe Kraft: Der Algorithmus verwendet ein naheliegendes Verfahren das sich direkt an der Problembeschreibung orientiert. Seite 3

Rohe Kraft Beispiele für brute force Sortier-Algorithmen - 1 Selection Sort ein einfacher und naheliegender Sortieralgorithmus: Teile die Sequenz in einen sortierten und einen unsortierten Teil. Bringe das jeweils kleinste (größte) Element des unsortierten Teils an das Ende des sortierten Teils. siehe auch Foliensatz 2 Aufwand: O(n2) Selection-Sort(A[0..n-1]) 1. for i 0 to n-1 do 2. min i 3. for j i+1 to n-1 do 4. if A[j] < A[min] then min j 5. swap(a[i], A[min]) Seite 4

Rohe Kraft Beispiele für brute force Sortier-Algorithmen - 2 Bubble Sort ein einfacher und naheliegender Sortieralgorithmus: Vergleiche von links nach rechts gehend je zwei nebeneinander liegende Elemente und vertausche sie, wenn sie in der falschen Reihenfolge sind. Am Ende ist das größte (kleinste) Element am Ende. ( Hoch geblubbert ) Wiederhole den Prozess, bis alle Elemente sortiert sind. Aufwand: O(n2) der schlechteste aller bekannten Sortier-Algorithmen Bubble-Sort(A[0..n-1]) 1. for i 0 to n-2 do 2. for j 0 to n-2-i do 3. if A[j+1] < A[j] then swap(a[j], A[j+1]) http://www.youtube.com/watch?v=lyzqpjut5b4 http://www.youtube.com/watch?v=mtcrehrt_k0 Seite 5

Rohe Kraft Beispiele für brute force Algorithmen Vergleich von Zeichenketten String Matching ein einfacher und naheliegender Algorithmus zum Auffinden einer Zeichenkette (Pattern) p in einem Text t: Vergleiche beginnend mit dem ersten das i-te Element von p mit dem i-ten Element von t solange bis alle als gleich erkannt wurden: s wurde in t gefunden oder bis eine Nichtübereinstimmung gefunden wurde. In dem Fall beginne den gesamten Prozess mit dem nächsten Element in t. Falls t ab der Suchposition kürzer als s ist, beende die Suche mit einem Misserfolg. Aufwand: O(n*m) mit n: Länge von p, m: Länge von t Sting-Match(T[0..n-1], P[0..m-1]) t wenn süß das Mondlicht auf den Hügeln schläft 1. for i 0 to n-m do 2. j 0 3. while j<m && P[j]=T[i+j] do 4. j j+1 5. if j=m then return i 6. return -1 p wenn das Wasser im Rhein Seite 6

Erschöpfende Suche Erschöpfende Suche (Exhaustive Search)... wenn man systematisch alle möglichen Lösungen durchgehen kann, dann untersuche jede mögliche Lösung ob sie vielleicht eine Lösung ist. Algorithmen die mit der Strategie erschöpfende Suche entwickelt werden sind eine Variante der Brute-Force-Algorithmen sie benötigen eine Auflistung / Methode zur Generierung aller möglichen Lösungen Mögliche Lösungen werden dann geprüft, ob sie wirklich eine Lösung sind. Die Strategie erschöpfende Suche ist angemessen, wenn das Problem die Auflistung der Lösungskandidaten ermöglicht ansonsten gelten alle Kriterien die für Brute-Force-Algorithmen gelten Problem der Raum der möglichen Lösung ist i.d.r. sehr groß Beispiel Traveling Salesman Problem: berechne die kürzeste Rundreise in einen Graph Algorithmus: Generiere alle Permutationen von Knoten Teste, ob sie eine Rundreise darstellen Berechne dann deren Länge Gib schließlich die kürzeste aus. Seite 7

Erschöpfende Suche Generierung von Lösungskandidaten Das zentrale Problem bei einer erschöpfenden Suche ist meist die Generierung der möglichen Lösungen. Mögliche Lösungen Die Menge der möglichen Lösungen sollte eine endliche und echte Obermenge der Lösungsmenge sein leichter zu berechnen sein als die Lösungen Seite 8

Erschöpfende Suche Generierung von Lösungskandidaten Sehr oft können die Lösungs-Kandidaten als kombinatorische Objekte oder im Zuge von Traversierungen erzeugt werden. Kombinatorische Objekte sind die Dinge die der Kombinatorik (Teilgebiet der diskreten Mathem.) behandelt werden, z.b.: die Menge Permutationen einer Sequenz die Menge aller Teilmengen einer Menge die Menge aller Kombinationen von Elementen einer Menge... Traversierungen Traversierungen, also das systematischen Durchlaufen einer Datenstruktur, kann verwendet werden, um alle Lösungskandidaten zu erzeugen Alle Elemente einerliste, Alle Kanten eines Baums / Graphen bei dessen (Tiefen-/Breiten-) Traversierung... Seite 9

Kombinatorische Objekte Kombinatorische Objekte Beispiele Alle Teilmengen einer Menge (Auswahl ohne Wiederholung) Alle Permutationen einer Sequenz Alle Partitionen einer Menge Auswahl ohne Wiederholung Alle partiellen Teil-Multimengen (Auswahl mit Wiederholung) Teilsequenzen einer Sequenz... Seite 10

Kombinatorische Objekte Kombinatorische Objekte Auswahl: k aus n Elementen wählen Siehe Literatur zur Kombinatorik aus: https://homepages.thm.de/~hg51/veranstaltungen/algorithmen/folien/algorithmen-04.pdf Seite 11

Kombinatorische Objekte Kombinatorische Objekte und rohe Kraft Algorithmen Beispiel: Sortieren mit roher Kraft Rohe Kraft, hier direkte Implementierung der Definition Definition Sortieren: Gegen eine Sequenz s, finde eine Permutation von s in der die Elemente ansteigend geordnet sind Mögliche Lösungen Alle Permutationen ein kombinatorisches Objekt Korrekte Lösungen Permutationen mit aufsteigender Ordnung Seite 12

Kombinatorische Objekte Kombinatorische Objekte und rohe Kraft Algorithmen Beispiel: n-damen Problem n-damen-problem: Platziere n Damen auf einem n x n Schachbrett so, dass sie sich gegenseitig nicht schlagen. Rohe Kraft Algorithmus, hier direkte Implementierung der Definition Bildquelle: Wikipedia Definition n-damen-problem: Gegeben sei ein n*n Feld (Matrix), http://en.wikipedia.org/wiki/eight_queens_puzzle finde ein Sequenz s von Positionen der Länge n, derart, dass keine Position in s eine andere Position in s nach den Schachregeln bedroht. Mögliche Lösungen Variante 1: Alle Folgen der Länge n von Zeilen- / SpaltenPositionen (Paare aus dem Kreuzprodukt {1,.. n x {1,.. n) Variante 2: Alle Folgen s der Länge n von Positionen in Zeile i (Wert aus {1.. n) si repräsentiert die Position (i, si) Korrekte Lösung Variante 1: Falls (a,b) in s dann enthält s kein Paar (x,y) mit: y=b (gleiche Position in der Senkrechten) oder (x = a-i und y = b-i) oder (x = a+i und y = b+i) für irgendein i (Positionen in der Diagonale) Variante 2 entsprechend Seite 13 Variante 1: [(0,2), (1,0), (2,1)] Variante 2 : [2, 0, 1]

Kombinatorische Objekte Kombinatorische Objekte und rohe Kraft Algorithmen n-damen Problem: Kombinatorische Objekte Variante 1 Jede Auswahl von n Elementen aus {1..n x {1..n n aus n2 ohne Wiederholung, Reihenfolge ohne Belang: Cnn*n = (n2 über n) = n2! / n!*(n2-n)! Variante 2-1 Jede Auswahl von n Elementen aus {1..n n aus n mit Wiederholung, Reihenfolge von Belang: nn Variante 2-2 Falls man die in der gleichen Spalte gleich ausschließt: n aus n ohne Wiederholung, Reihenfolge von Belang: Pnn*n = n2! / (n2 n)! Seite 14 Variante 1: [(0,2), (1,0), (2,1)] Variante 2 : [2, 0, 1] Enthält mehr Elemente als Variante 2-2, ist aber am einfachsten zu erzeugen.

Kombinatorische Objekte und erschöpfende Suche Erschöpfende Suche und Kombinatorische Objekte n aus einer Menge M Untersuche jede Auswahl von n Elementen aus einer Menge M Akzeptable Lösung Beispiel n-damen auf 4x4 Feld Kombinatorische Objekte: Sequenzen von Zeilen-Positionen (Variante-2-1) Akzeptable Objekte: class Queens { // Boards with queen are represented by sequences of ints // placement(i) = column position in row i static boolean acceptable(int[] placement) { for (int i=0; i<placement.length; i++) { int x = placement[i]; for (int j=0; j<placement.length; j++) { if (i!=j) { int d = i-j; // diagonal: distance between j an j if (placement[j] == x placement[j] == x-d placement[j] == x+d) { return false; return true; Seite 15 etc.

Kombinatorische Objekte und erschöpfende Suche Erschöpfende Suche und Kombinatorische Objekte: Schleife n aus einer Menge M Untersuche jede Auswahl von n Elementen aus einer Menge M Einfachste und effizienteste Methode: n geschachtelte Schleifen Beispiel n-damen auf 4x4 Feld: public class BruteForce_4_x_4 { public static void main(string[] args) { for (int c0 = 0; c0 < 4; c0++) { for (int c1 = 0; c1 < 4; c1++) { for (int c2 = 0; c2 < 4; c2++) { for (int c3 = 0; c3 < 4; c3++) { int[] placement = new int[]{c0, c1, c2, c3; if (Queens.acceptable(placement)) { System.out.println("OK: " + Arrays.toString(placement)); OK: [1, 3, 0, 2] OK: [2, 0, 3, 1] Seite 16 Wenn immer möglich: Suche mit geschachtelten Schleifen!

Kombinatorische Objekte und erschöpfende Suche Erschöpfende Suche und Kombinatorische Objekte: Rekursion n aus einer Menge M Untersuche jede Auswahl von n Elementen aus einer Menge M Problem: M ist nicht statisch bekannt Wenn M keine statisch bekannte Menge ist, dann können nicht n-schleifen über die Elemente von M angegeben werden. Beispiel n Damen public class BruteForce_4_x_4 { Implementierung einer public static void main(string[] args) { Schachtelung von n int n =...?... Schleifen? for (int c0 = 0; c0 < n; c0++) { for (int c1 = 0; c1 < n; c1++) { for (int c2 = 0; c2 < n; c2++) {... for (int cn = 0; cn < n; cn++) { int[] placement = new int[]{c0, c1, c2, c3,... cn; if (Queens.acceptable(placement)) { System.out.println("OK: " + Arrays.toString(placement));... Seite 17

Kombinatorische Objekte und erschöpfende Suche Erzeuge Kombinatorische Objekte Rekursive Erzeugung von k-tuplen aus einer Menge M Erzeuge den Suchraum rekursiv, wenn Du nicht weißt, wie viele Schleifen zu schachteln wären. Tupel: Auswahl mit Wiederholung und relevanter Reihenfolge Erzeuge jede Auswahl von k Elementen aus einer Menge M bei dynamisch festgelegtem Wert k und Menge M Algorithmus: Mk die Menge der Tupel der Länge k aus Elementen der Menge M kann rekursiv definiert werden: Mk = { [ ] falls k = 0 Mk = { t + [x] t Mk-1, x M falls k > 0 + ist das Anhängen eines Elements x an ein Tupel t Seite 18

Kombinatorische Objekte und erschöpfende Suche Erzeuge Kombinatorische Objekte Rekursive Erzeugung von k-tuplen aus einer Menge M Erzeuge jede Auswahl von k Elementen aus einer Menge M bei dynamisch festgelegtem Wert k und Menge M class AllTuples<E extends Comparable<E>> { private TreeSet<E> M = null; public AllTuples(TreeSet<E> M) { this.m = M; // all tuples of size k build from elements of set M public List<List<E>> oflength(int k) { if (k == 0) { ArrayList<List<E>> result = new ArrayList<>(); result.add(new ArrayList<E>()); return result; Implementierung Direkte Umsetzung des Algorithmus' else { List<List<E>> result = new ArrayList<>(); List<List<E>> rec = oflength(k-1); for (List<E> t: rec) { for (E x: M) { List<E> tt = new ArrayList<>(t); tt.add(x); result.add(tt); return result; Seite 19

Kombinatorische Objekte und erschöpfende Suche Erschöpfende Suche und Kombinatorische Objekte: Rekursion k-tupel (Auswahl von k Elementen mit Reihenfolge relevant) aus einer Menge M Untersuche jede Auswahl von k Elementen aus einer Menge M Anwendungs-Beispiel n-damen-problem Scanner scan = new Scanner(System.in); int n = scan.nextint(); scan.close(); TreeSet<Integer> positions = new TreeSet<>(); for (int i=0; i<n; i++) positions.add(i); for (List<Integer> placement: new AllTuples<Integer>(positions).ofLength(n)){ if (Queens.acceptable( toprimitive( placement.toarray(new Integer[n])))) { System.out.println("OK: " + placement); Integer-Array => int-array Seite 20 private static int[] toprimitive(integer[] array) { int[] res = new int[array.length]; int i = 0; for(int v: array) { res[i++] = v; return res;

Kombinatorische Objekte und erschöpfende Suche Erschöpfende Suche und Kombinatorische Objekte: Rekursion Anwendungs-Beispiel n-damen-problem / Java 8 Version class AllTuples<E> { private Set<E> M = null; public AllTuples(Set<E> M) { this.m = M; Streams sind nur eine funktionale Fassade für Sequenzen. Funktionales Programmieren ist damit nur beschränkt möglich. Einige Operationen können damit aber etwas eleganter formuliert werden. Z.B.: - das Durchlaufen einer Liste (foreach, filter) oder - die Umwandlung eines Integer-Arrays in ein int-array (maptoint). // all tuples of size k build from elements of a set M public List<List<E>> oflength(int k) { if (k == 0) { public class BruteForce_n_x_n { List<List<E>> res = new ArrayList<>(); res.add(new ArrayList<E>()); public static void main(string[] args) { return res; Scanner scan = new Scanner(System.in); else { int n = scan.nextint(); List<List<E>> res = new ArrayList<>(); scan.close(); oflength(k-1).stream().foreach( t -> M.stream().forEach( x -> { List<E> tl = new ArrayList<E>(t); tl.add(x); res.add(tl); ) ); return res; TreeSet<Integer> positions = new TreeSet<>(); for (int i=0; i<n; i++) positions.add(i); new AllTuples<Integer>(positions).ofLength(n).stream().filter( t -> Queens.acceptable( (t.stream().maptoint(i -> i).toarray() ) ) ).foreach( p -> { p.foreach( pos -> System.out.print(pos+ " ")); System.out.println(); ); Seite 21