Übung Algorithmen und Datenstrukturen

Ähnliche Dokumente
Übung Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

Amortisierte Analyse. C. Komusiewicz 6.1 Amortisierte Analyse: Motivation 105

Amortisierte Laufzeitanalyse

Algorithm Engineering. Amortisierung. Stefan Edelkamp

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

float: Fließkommazahl nach IEEE 754 Standard mit 32 bit

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Suchverfahren Autor: Stefan Edelkamp / Sven Schuierer

Dies ist gerade der konstruktive Schritt beim Aufbau von Binomialbäumen.

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 2: Analyse der Laufzeit von Algorithmen Gliederung

Algorithmen und Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen

Amortisierte Analyse

Datenstrukturen und Algorithmen. 7. Suchen in linearen Feldern

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

Algorithmische Intelligenz. Amortisierung. Stefan Edelkamp

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

3. Übungsblatt zu Algorithmen I im SoSe 2017

Grundlagen: Algorithmen und Datenstrukturen

MB2-ALG, SS15 Seite 1 Hauptklausur, geschrieben am

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

Die Schnittstelle Comparable

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Zentralübung Grundlagen der Programmierung

Algorithmen & Datenstrukturen 1. Klausur

Der Dreyfus-Wagner Algorithmus für das Steiner Baum Problem

Mergeable Heaps. C. Komusiewicz 7.1 Fibonacci-Heaps: Überblick 117

Nachklausur Bitte in Druckschrift leserlich ausfüllen!

Programmierkurs Java

Übung Algorithmen und Datenstrukturen

Einführung in die Informatik 2

Aufgabe (Schreibtischtest, Algorithmenanalyse)

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

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Aufgabe 1 (12 Punkte)

Lösungsvorschlag Serie 2 Rekursion

Eine JAVA Einführung ... Quellcode:... COMA Übung 3. T.Bosse. A.Griewank. Vorschau JAVA Programme Sprachen Kate

Anweisungen zur Ablaufsteuerung

Welche Informatik-Kenntnisse bringen Sie mit?

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

2. Grundlagen. Beschreibung von Algorithmen durch Pseudocode. Korrektheit von Algorithmen durch Invarianten.

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

Algorithmen & Datenstrukturen Midterm Test 2

Vorrangswarteschlangen:Operationen

Introduction to Python. Introduction. First Steps in Python. pseudo random numbers. May 2016

II.3.1 Rekursive Algorithmen - 1 -

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

Übungen zu Algorithmen

Prof. Dr. Heinrich Müller; Dr. Frank Weichert 7. September 2015

Codes und Informationsgehalt

INFORMATIK FÜR BIOLOGEN

Informatik II, SS 2014

Einführung in die Informatik 1

Einführung in die Informatik 2

Kapitel 9 Suchalgorithmen

Grundlagen der Programmierung

Algorithmen und Datenstrukturen

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

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

Grundlagen: Algorithmen und Datenstrukturen

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

Einführung in die Informatik 1

Informatik II Prüfungsvorbereitungskurs

Informatik II, SS 2014

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

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

Cognitive Interaction Technology Center of Excellence

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

12. Hashing. Hashing einfache Methode um Wörtebücher zu implementieren, d.h. Hashing unterstützt die Operationen Search, Insert, Delete.

13. Hashing. AVL-Bäume: Frage: Suche, Minimum, Maximum, Nachfolger in O(log n) Einfügen, Löschen in O(log n)

Überblick. Lineares Suchen

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

Schnittstellen, Stack und Queue

Algorithmen und Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen

Modellierung und Programmierung 1

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

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

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

public static void main(string[] args) {

Schleifeninvarianten. Dezimal zu Binär

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

12. Rekursion Grundlagen der Programmierung 1 (Java)

12 Abstrakte Klassen, finale Klassen und Interfaces

Informatik II, SS 2014

8 Komplexitätstheorie

Algorithmen und Datenstrukturen

Übung zur Vorlesung Berechenbarkeit und Komplexität

Java programmieren mit JavaKara. Eine Zusammenfassung in Beispielen

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

Teil 1: Suchen. Ausgeglichene Bäume B-Bäume Digitale Suchbäume. M.O.Franz, Oktober 2007 Algorithmen und Datenstrukturen - Binärbäume 1-1

Abschnitt: Algorithmendesign und Laufzeitanalyse

Transkript:

Übung Algorithmen und Datenstrukturen Sommersemester 2017 Patrick Schäfer, Humboldt-Universität zu Berlin

Agenda: Suchen und Amortisierte Analyse Heute: Suchen / Schreibtischtest Amortisierte Analyse Nächste Woche: Vorrechnen (first-come first-served) Gruppe 5 13-15 Uhr https://dudle.inf.tu-dresden.de/algodatgr5u3/ Gruppe 6 15-17 Uhr https://dudle.inf.tu-dresden.de/algodatgr6u3/ Übung: Vorlesung: https://hu.berlin/algodat17 https://hu.berlin/vl_algodat17 2

Organisatorisches Abholung alter Übungsaufgaben: Montag, der 12.06. 14:45-15:15 RUD 25, 3.321 Tutorium (amortisierte Analyse, etc.) Zusätzlich zu den Übungsterminen gibt es noch ein Tutorium Montag 17:00-19:00 s.t. RUD 26, 1'303 Freitag 11:00-13:00 c.t. RUD 26, 1'303, Stefanie Lowski In dieser Woche kann leider am Freitag (9.6.) kein Tutorium stattfinden Ersatztermin: heute, am Mittwoch (7.6.), von 17:00-18:30, RUD 26, 1'303. 3

Suche in sortierten Arrays '/2 '/2 Suchverfahren aus der Vorlesung: Binäre Suche (Aufgabe 2)! = + +, 2 =, + +, 2 '/4 '/8 '/4 c=8 A: l=1 r=12 1 2 4 8 16 32 64 128 256 512 1024 2048! = 12 + 1 2 = 6 4

Suche: Schreibtischtest Führen Sie einen Schreibtischtest für die binäre Suche durch, bei dem das folgende Array. nach dem Wert / = 68 durchsucht wird. Geben Sie dazu an, mit welchen Werten die Variablen l, r und m nach jedem Aufruf von Zeile 4 belegt sind.. = 5, 12, 15, 17, 22, 29, 45, 47, 60, 61, 68, 74, 77 l r m 1 13 14/2=7 Algorithmus BinarySearch(A, c) Input: Sortiertes Array A und Integer c Output: TRUE, falls das Element c in A ist. 1: l := 1; 2: r := A ; 3: while l Æ r do 4: m := (l + r) div 2; 5: if c<a[m] then 6: r := m 1; 7: else if c>a[m] then 8: l := m +1; 9: else 10: return true; 11: end if 12: end while 13: return false; 5

Suche in sortierten Arrays Suchverfahren aus der Vorlesung: Fibonacci-Suche (Aufgabe 1) 2 3 5 8 1 2 C 1 = 1, C 2 = 2, C D = C DEF + C DEG c=8 A: l=1 r=12 1 2 4 8 16 32 64 128 256 512 1024 2048 =>?2~ 1 3 (+,) =>?1~ 2 (+,) 3! 678 = min (=>?2, ') fib=13, fib1=8, fib2=5 6

Suche: Schreibtischtest Führen Sie einen Schreibtischtest für die Fibonacci-Suche durch, bei dem das folgende Array. nach dem Wert / = 34 durchsucht wird. Geben Sie die aktuellen Belegungen der Variablen fib2, fib3, und m vor jedem Aufruf von Zeile 8 im Pseudocode von Folie 13 an.. = 5, 6, 9, 10, 12, 13, 34, 39, 43, 52, 63, 76 fib2 fib3 m fib(5)=5 fib(4)=3 5 1. A: sorted_int_array; 2. c: int; 3. compute i; #fib(i) smallest 4. fib3 := fib(i-3); 5. fib2 := fib(i-2); 6. m := fib2; 7. repeat 8. if c>a[m] then 9. if fib3=0 then return false 10. else 11. m := m+fib3; 12. tmp := fib3; 13. fib3 := fib2-fib3; 14. fib2 := tmp; 15. end if; 16. else if c<a[m] 17. if fib2=1 then return false 18. else 19. m := m-fib3; 20. fib2 := fib2 fib3; 21. fib3 := fib3 fib2; 22. end if; 23. else return true; 24. until true; 7

Suche in sortierten Arrays Suchverfahren aus der Vorlesung: Interpolations-Suche (Aufgabe 2) rank =, + (+,) /.,. +.[,] c=8 l=1 r=12 A: 1 2 4 8 16 32 64 128 256 512 1024 2048 rank = 1 + GFEG KEG FLMKEG =1 8

Suche in sortierten Arrays Suchverfahren aus der Vorlesung: Exponentielle Suche (Aufgabe 2): Suche zunächst rechten Rand. Suche im Suchbereich mit binärer Suche 1 2 4 8... A[2 7 ] / < min (. 2 7YG, ') c=16 l=1 r=12 A: 1 2 4 8 16 32 64 128 256 512 1024 2048 A[2 F ] / <. 2 X ) 10

Aufgabe 2: SortedSearch.java Unsere Vorlage verwendet ein Comparator-Objekt, das mitzählt, wie oft verglichen wird. Ein Comparator in JAVA liefert >0, falls element > key =0, falls element == key <0, falls element < key public static class LinearSearch extends Search { } @Override public boolean search(long[] sortedlist, Long key) { for (Long element : sortedlist) { // compare returns a negative integer, zero, or // a positive integer if the first argument is // less than, equal to, or greater than the second. int comparison = this.comparator.compare(element, key); if (comparison == 0) { return true; } } return false; } 11

Agenda: Suchen und Amortisierte Analyse Suchen / Schreibtischtest Amortisierte Analyse Binärzähler Account-Methode Potentialmethode 12

Binärzähler Geg.: Z-Bit Binärzähler Entspricht Binärzahl b k 1 b 1 b 0 bzw. Dezimalzahl i b i 2 i Operation: Zahl inkrementieren (um 1 erhöhen) Kosten: Anzahl der Bitänderungen (jedes Bit kostet 1) n b 4 b 3 b 2 b 1 b 0 0 0 0 0 0 0 1 0 0 0 0 1 1 Bitwechsel n b 4 b 3 b 2 b 1 b 0 23 1 0 1 1 1 24 1 1 0 0 0 4 Bitwechsel 13

Binärzähler Kostenabschätzung Gesucht: Kosten für ' Inkrement-Operationen, wenn Zähler bei 0 beginnt. Best Case: Eine Bitänderung Ω(') Worst Case: Alle Z Bits werden verändert: Ο('Z) Problem: sehr pessimistische Abschätzung, da Worst Case eher selten vorkommt n b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 127 0 1 1 1 1 1 1 1 128 1 0 0 0 0 0 0 0 Z Bitwechsel 14

n b 3 b 2 b 1 b 0 #BW 0 0 0 0 0 1 0 0 0 1 1 2 0 0 1 0 2 3 0 0 1 1 1 4 0 1 0 0 3 5 0 1 0 1 1 6 0 1 1 0 2 7 0 1 1 1 1 8 1 0 0 0 4 9 1 0 0 1 1 10 1 0 1 0 2 Summe der Kosten T(n) ]#BW ^ _ ` n=1 1 4 2 3 8 3 4 12 4 7 16 5 8 20 6 10 24 7 11 28 8 15 32 9 16 36 10 18 40 Häufig geringe Kosten Abschätzung zu pessimistisch 15

Amortisierte Analyse Kosten werden über eine Sequenz von Operationen gemittelt. Amortisierte Analyse beschreibt mittlere Kosten einer Operation im schlechtesten Fall (Worst-Case). Grundidee von Account- und Potentialmethode: Anfänglich günstige Operation teurer bewerten, um spätere (teure) Operationen auszugleichen. Überschuss wird als Kredit/Potential gespeichert. Kredit/Potential wird verwendet, um für teurere Operation zu zahlen. Verfahren unterstützten mehr als einen Operationstypen. 16

Account-Methode (Bankkonto~, Guthaben~) Idee: Operationen werden Kosten zugewiesen, wobei für einige mehr und für andere weniger als die tatsächlichen Kosten berechnet wird. Diese zugewiesenen Kosten nennen wir amortisierte Kosten. Übersteigen die amortisierten Kosten die tatsächlichen Koten, so wird die Differenz als Kredit in der Datenstruktur gespeichert. Der Kredit ist definiert als die Differenz zwischen den amortisierten Kosten mit / b 7 und den tatsächlichen Kosten / 7 der i-ten Operation: d d 7eG / b 7 7eG / 7 0 (nichtnegativ) Der Kredit muss zu allen Zeiten nichtnegativ sein, damit die amortisierten Kosten eine obere Schranke der Gesamtkosten bilden. Dieser Kredit kann später verwendet werden, um Operation zu bezahlen, deren tatsächliche Kosten höher als die amortisierten Kosten sind. 17

Binärzähler (Account-Methode) Tatsächliche Kosten: Wir verwenden 1$, um das Kippen eines Bits zu bezahlen. Idee: Der gespeicherte Kredit soll der Anzahl 1en im Zähler entsprechen. Wir berechnen: 2$, um irgendein Bit von 0 auf 1 zu kippen. 1$ für das Setzen des Bits und 1$ für das (spätere) Rücksetzen auf 0. 0$, um irgendein Bit von 1 auf 0 zu setzen. Diese Kosten wurden bereits mit dem Setzen verrechnet. Amortisierte Kosten: Es kippt (maximal) eine 0 zu einer 1: entweder direkt an Stelle? L oder als Übertrag. Die amor. Kosten sind somit: / b 7 2. Nichtnegativ: Zu jedem Zeitpunkt hat jede 1 im Zähler 1$ Kredit, um das Rücksetzen zu bezahlen. Somit befinden sich immer ausreichend $ im Kredit, um das Rücksetzen eines Bits zu bezahlen. Þ Die amortisierten Kosten / b 7 bilden eine obere Schranke der tatsächlichen Kosten / 7 : d g / 7 7eG d g / b 7 7eG d g 2 = 2' 7eG Þ Und somit ist die Worst-Case Komplexität h(') n? 3? 2? 1? 0 / 7 / b 7 Kredit 0 0 0 0 0-0 1 0 0 0 1 1 2 1 2 0 0 1 0 2 2 1 3 0 0 1 1 1 2 2 4 0 1 0 0 3 2 1 5 0 1 0 1 1 2 2 6 0 1 1 0 2 2 2 7 0 1 1 1 1 2 3 8 1 0 0 0 4 2 1 9 1 0 0 1 1 2 2 10 1 0 1 0 2 2 2 ] 18 20 18

Potentialmethode Die vorausbezahlten Kosten werden in der Datenstruktur D als Potential gespeichert, das freigegeben werden kann für zukünftige Operationen. Die Potentialfunktion Φ bildet die Datenstruktur j 7 auf eine reelle Zahl ab, welche dieses Potential von j nach der i-ten Operation repräsentiert. Die amortisierten Kosten / b 7 der i-ten Operation sind somit definiert als: / b 7 = / 7 + Φ j 7 Φ j 7EG D.h., die amortisierten Kosten von n Operationen sind: d g / b 7 7eG d = g(/ 7 7eG + Φ j 7 Φ j 7EG ) = g / 7 d 7eG + Φ j d Φ j L Diese bilden eine obere Schranke der tatsächlichen Kosten, wenn gilt: Φ j 7 Φ j L 0, für alle > (nichtnegativ) 19

Potentialmethode - Herangehensweise Ziel: Finde eine Potentialfunktion Φ, so dass 1. Φ j von einer Eigenschaft von j abhängt, 2. Φ j 7 Φ j L (nichtnegativ), 3. / b 7 lässt sich für alle > berechnen. Dann sind die amortisierten Gesamtkosten obere Schranke für die tatsächlichen Gesamtkosten Herangehensweise: Ermitteln einer Potentialfunktion, die hinreichend (aber nicht unnötig viel) Potential für spätere teure Operationen sammelt 20

Binärzähler (Potentialmethode) Idee: Das Potential des Zählers entspricht der im Zähler gespeicherten Einsen nach der i-ten Operation: Φ j 7 = Anzahl 1en in j 7 nach der i-ten Operation Das Potential Φ j 7 hängt von D ab und ist anfangs Φ j L = 0 Das Potential ist nichtnegativ, denn es gilt für alle >: Φ j 7 Φ j L = Φ j 7 0 Wir berechnen nun die amortisierten Kosten / b: 7 Φ j 7EG : Angenommen j 7EG endet auf, Einsen und enthält insgesamt, + x Einsen Φ j 7 : Nun kippen in j 7, Einsen auf 0. Zusätzlich springt (maximal) eine 0 auf eine 1 (Übertrag). Beispiel: 1101 + 1 = 1110 Es gilt: / b 7 = / 7 + Φ j 7 Φ j 7EG, + 1 + x + 1 x +, = 2 Es gilt weiter: / 7 = / b 7 Φ j d + Φ j L 2' und somit ist die Worst-Case Komplexität h ' n b 3 b 2 b 1 b 0 / 7 Φ j 7 / b 7 0 0 0 0 0 0-1 0 0 0 1 1 1 1+1-0=2 2 0 0 1 0 2 1 2+1-1=2 3 0 0 1 1 1 2 1+2-1=2 4 0 1 0 0 3 1 3+1-2=2 5 0 1 0 1 1 2 1+2-1=2 6 0 1 1 0 2 2 2+2-2=2 7 0 1 1 1 1 3 1+3-2=2 8 1 0 0 0 4 1 4+1-3=2 9 1 0 0 1 1 2 1+2-1=2 10 1 0 1 0 2 2 2+2-2=2 ] 18 20 21