Raphael Fischer fischrap@student.ehtz.ch 18.05.2014 Informatik II - Übung 11 Raphael Fischer fischrap@student.ehtz.ch 18.05.2014
Divide and conquer: Mergesort Array: 5, 4, -7, 2, 5, 5, -20, 4, 7, -1 Sortiere es Divide: Teile Array in zwei Hälften Rekursion gibt zwei sortierte Arrays Zusammefügen: Zwei Pointer auf Beginn der Teilarrays Schaue, welches Element kleiner ist Füge dieses in neue Liste ein und verschiebe diesen Pointer Gehe zu 2. -7, 2, 4, 5, 5 -20, -1, 4, 5, 7 Achtung Implementation: Was, wenn ein Pointer am Ende angelangt ist? -20 , -7 , -1 , 2, 4, 4, 5, 5, 5, 7 Raphael Fischer 13.11.2018
U10.A1 b): Divide and conquer / Mergesort public ArrayList<T> sort(ArrayList<T> items) { if(items.size() <= 1) return items; int middle = items.size()/2; ArrayList<T> res1 = sort(new ArrayList<T>(items.subList(0, middle))); ArrayList<T> res2 = sort(new ArrayList<T>(items.subList(middle, items.size()))); int pt1 = 0, pt2 = 0; ArrayList<T> sorted = new ArrayList<T>(); while(pt1 < res1.size() || pt2 < res2.size()) { if(pt2 == res2.size() || res1.get(pt1).compareTo(res2.get(pt2)) < 0) sorted.add(res1.get(pt1++)); else sorted.add(res2.get(pt2++)); } return sorted; } trivialer Fall Divide Die beiden Pointer Diese Liste wird aus den anderen aufgebaut Wenn beide Pointer am Ende, höre auf Wenn pt2 am Ende, nimm in jedem Fall Liste 1 Achtung Fehler: Wenn pt1 == res1.size(), gibt es beim if eine Exception Raphael Fischer 13.11.2018
U10.A1 b): Divide and conquer / Mergesort public ArrayList<T> sort(ArrayList<T> items) { if(items.size() <= 1) return items; int middle = items.size()/2; ArrayList<T> res1 = sort(new ArrayList<T>(items.subList(0, middle))); ArrayList<T> res2 = sort(new ArrayList<T>(items.subList(middle, items.size()))); int pt1 = 0, pt2 = 0; ArrayList<T> sorted = new ArrayList<T>(); while(pt1 < res1.size() || pt2 < res2.size()) { if(pt1 == res1.size()) sorted.add(res2.get(pt2++)); else if(pt2 == res2.size()) sorted.add(res1.get(pt1++)); else if(res1.get(pt1).compareTo(res2.get(pt2)) < 0) else } return sorted; } trivialer Fall korrigiert Divide Die beiden Pointer Diese Liste wird aus den anderen aufgebaut Wenn beide Pointer am Ende, höre auf Wenn pt2 am Ende, nimm in jedem Fall Liste 1 «Normaler» Fall Raphael Fischer 13.11.2018
U10.A1 c): Merge sort (Measure) Legende: ms Elemente Raphael Fischer 13.11.2018
U10.A2 a): Türme von Hanoi 3 2 1 3 2 1 3 … Zusammenfassung: Nicht benutzt wird: Zusammenfassung: Anzahl der Scheiben (n): 4 Anzahl der Schritte (2n-1): 15 Nicht benutzt werden: 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 … Raphael Fischer 13.11.2018
U10.A2 b): Türme von Hanoi (Pseudocode) moves = 2^n-1; counter = 0; if n even then while (counter < moves) make possible move between tower 1 and tower 2 make possible move between tower 1 and tower 3 make possible move between tower 2 and tower 3 increment counter by 3 units else [n is odd] while (counter < moves-1) make possible move between tower 3 and tower 2 make available move between tower 1 and tower 3 make possible move es gibt immer nur eine Möglichkeit (die kleinere Scheibe) Raphael Fischer 13.11.2018
U10.A2 c): Was ist mit n=5? Es geht nicht. Argument? 25-1 = 31 Züge 30. Zug ist 1, 31. Zug ist 3 letzte Scheibe sollte auf 3 Raphael Fischer 13.11.2018
U10.A2 c): Was ist mit n=5? Genauer (ohne Begründung): 5 Scheiben (31 Schritte): 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 4 Scheiben (15 Schritte): 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 Scheiben (7 Schritte): 2 3 1 2 3 1 2 2 3 1 wenn ungerade 3 2 1 wenn gerade Raphael Fischer 13.11.2018
U10.A3: Reversi (Alpha-Beta-Spieler) Kleine Änderungen gegenüber der Minimax-Version Der Code ist auf der Website Raphael Fischer 13.11.2018
Komplexität von Algorithmen Ziel: Algorithmen vergleichen (die sich ganz Grundsätzlich in ihrer Struktur unterscheiden) Unabhängig von der Hardware Bsp.: Tatsächliche Zeit: 𝑡 𝑛 = 2𝑛 2 ∙ms+3𝑛∙s + 6 𝑛 ∙ms 𝑡 𝑛 ≈2𝑛 2 ∙ms 𝑡 𝑛 ∝𝑛 2 𝑡 𝑛 =𝑂(𝑛 2 ) bzw. 𝑡 𝑛 ∈𝑂(𝑛 2 ) Man kann auch die Komplexität des Speicherverbrauchs analysieren 𝑛 gross Nehme nur den grössten Term und lasse Konstanten weg Raphael Fischer 13.11.2018
Aufgabe 1: Komplexität von Funktionen Lösung: 𝑓 1 𝑛 =4 𝑛 2 +𝑛+9 𝑛 3 ∈𝑂( 𝑛 3 ) 𝑓 2 𝑛 = 2 𝑛 + 𝑛 8 +9ln 𝑛 ∈𝑂( 2 𝑛 ) 𝑓 3 𝑛 =4 𝑛 2 +5 𝑛 2 +9 𝑛 ∈𝑂( 𝑛 2 ) 𝑓 4 𝑛 = 2 𝑛 +10∙ 3 𝑛 ∈𝑂 (3 𝑛 ) 𝑓 5 𝑛 =5 𝑛 + ln 𝑛 ∈𝑂( 𝑛 ) 𝑓 6 𝑛 = n 2 log 2 𝑛 +4⋅ ln 𝑛 2 + 5 𝑛 2 log 4 𝑛 𝑛 ∈𝑂( n 2 log 𝑛 ) 𝑓 7 𝑛,𝑚 =4 𝑛 2 +6𝑚∈𝑂( 𝑛 2 +𝑚) Raphael Fischer 13.11.2018
Aufgabe 2: Komplexität von Algorithmen Lösung: Code 1: 𝑂 𝑛 2 Code 2: 𝑂 𝑛 log𝑛 Code 3: 𝑂 𝑛 Code 4: 𝑂 𝑛 2 Code 5: 𝑂 𝑛 log 𝑛 //Code 4 LinkedList<String> ll = new LinkedList<String>(); for(int i = 0; i < n; i++) ll.add(getRandomString()); System.out.println(ll.get(i)); Get von LinkedList muss die ganze Liste durchlaufen und braucht O(i) //Code 5 ArrayList<Integer> al = new ArrayList<Integer>(); //Fill al with n random integers void foo(int a) { if(a == 0) return; for(int i = 0; i < n; i++) al.set(i, al.get(i)+a); foo(a/2); } Get und set von ArrayList braucht aber nur O(1) Raphael Fischer 13.11.2018
Nun mathematisch etwas präziser: 𝑡 𝑛 ∈𝑂 𝑓 𝑛 ⇔ ∃ 𝑛 0 ,𝑐>0 s.t. ∀𝑛≥ 𝑛 0 holds 𝑡(𝑛)≤𝑐⋅𝑓(𝑛) c=0.5 wäre hier noch zu klein Das bedeutet aber, dass z.B. 𝑛∈𝑂(5𝑛)∈𝑂(𝑛 log 𝑛)∈𝑂 𝑛 2 ∈𝑂( 2 𝑛 ) Das schreibt aber niemand so… Hoffentlich (für den Prof), sind die Aufgaben in der Prüfung gut gestellt (geben Sie die minimale Schranke an, oder so) Raphael Fischer 13.11.2018
Nun mathematisch etwas präziser: Es gibt auch eine untere Schranke Omega: (Algorithmus ist mind. so schlecht wie): 𝑡 𝑛 ∈Ω 𝑓 𝑛 ⇔ ∃ 𝑛 0 ,𝑐>0 s.t. ∀𝑛≥ 𝑛 0 holds 𝑡 𝑛 ≥𝑐⋅𝑓(𝑛) Und die scharfe Schranke Theta: 𝑡 𝑛 ∈Θ 𝑓 𝑛 ⇔𝑡 𝑛 ∈𝑂 𝑓 𝑛 ∩Ω(𝑓 𝑛 ) Raphael Fischer 13.11.2018
Übungsblatt 11 rückwärts Raphael Fischer 13.11.2018
U11.A4: Ein Springer auf dem Schachbrett Raphael Fischer 13.11.2018
U11.A4 a) Erreichbare Felder Finde Menge von Feldern: Erreichbar mit maximal n Zügen Gegeben: startPosition Komplexität der Laufzeit ist egal (nicht optimieren) Fokus auf Implementierung: Schöner Code = wenig copy- paste Schaut euch Fähigkeiten der Position-Klasse an Raphael Fischer 13.11.2018
U11.A4 b) Kompletter Pfad Finde einen Weg mit dem Springer, der ... ... alle Felder besucht ... Jedes Feld nur 1x besucht Dieses mal optimieren: Backtracking Abbruchbedingung: Alle Sprungmöglichkeiten wurden schon mal angesprungen Raphael Fischer 13.11.2018
U11.A3) Komplexität Angenommen, ein Algorithmus hat 𝑂 𝑡(𝑛) und kann in 𝑇 auf einem langsamen Rechner Daten der grösse 𝑀 bearbeiten. Ein neuer Recher sei 3x schneller: Wie viele Daten 𝑀′ kann dieser in 𝑇 bearbeiten? Raphael Fischer 13.11.2018
U11.A2) Komplexität von Codefragmenten Genau wie die Aufgabe in der Übungsstunde Achtung: Solche Aufgaben kommen praktisch sicher an der Prüfung! Raphael Fischer 13.11.2018
U11.A1) Sortieren mit Suchbäumen a) Wie benutzt man Suchbäume dafür? Nur grobe Beschreibung, kein Pseudocode b) Wie verändert sich die Geschwindigkeit, wenn die ursprünglichen Daten Aufsteigend sortiert, absteigend sortiert oder durchmischt sind? Annahme: Wir wollen aufsteigend sortieren c) Angabe der Laufzeit-Komplexität für schlechtesten & besten Fall Raphael Fischer 13.11.2018
Sortieralgorithmen Schon kennengelernt: Insertionsort 𝑂 𝑛 2 Gehe durch Liste, suche kleinstes Element, setze es an Anfang etc. Mergesort 𝑂 𝑛 log 𝑛 Sort with search-Trees 𝑂 ?? Werdet ihr noch kennenlernen: Heapsort 𝑂 𝑛 log 𝑛 <- Letztes wichtiges Thema für Prüfung! Raphael Fischer 13.11.2018
Weitere Sortieralgorithmen >> Sortieren geht i.A. nicht effizienter als O(n log(n)) Raphael Fischer 13.11.2018
Bogosort Komplexität: 𝑂(𝑛⋅𝑛!) Raphael Fischer 13.11.2018
Halfhearted Mergesort Raphael Fischer 13.11.2018
Stacksort StackSort connects to StackOverflow, searches for ‘sort a list’, and downloads and runs code snippets until the list is sorted. http://gkoberger.github.io/stacksort/ Raphael Fischer 13.11.2018
Reversi-Turnier: Mittwoch, den 31.05.2014 um 12:30 Uhr, Stuz2 http://www.vs.inf.ethz.ch/edu/FS2017/I2/reversi/ Abgabe: Bis Mittwoch, den 23.05.2013 bis 23:59 über Reversi-Plattform Raphael Fischer 13.11.2018
…viel Erfolg und Glück bei der Prüfung! Raphael Fischer 13.11.2018