Departement Mathematik und Informatik Algorithmen und Datenstrukturen, FS17 Prof Dr Christian Tschudin 23. Februar 2017 – Forts. Einführung: binary search – Definition Algorithms, RAM – Abstrakte Datentypen John Mauchly Algorithmen und Datenstrukturen, FS17 Uebersicht 2017-02-23 I Binary Search I Definition Algorithms I Abstract Data Types, erste Sichtung: – Sack/Menge (bag/set) – Liste (list) – Kellerstapel (stack) – Warteschlange (queue) – zweiseitige Warteschlange (deque) 23. Februar 2017 — 2 / 24 Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 3 / 24 (Binary) Search (1/3) Suche Wie findet man am schnellsten ein Element in einer Menge? Annahmen: – Elemente sind Integerwerte, voneinander verschieden – abgespeichert in einem Feld Naiver Ansatz: – Schleife über alle Elemente, Vergleichen – Problem: O(n) Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 4 / 24 Binary Search (2/3) Von J. Mauchly vorgeschlagen (1946): – Feld vorsortieren, gesuchtes Element “einmitten” 1 2 3 4 5 6 7 8 9 10 def binSearch(a, val, start, end): if end < start: return -1 mid = int((start + end) / 2) if a[mid] == val: return mid elif a[mid] < val: return binSearch(a, val, mid+1, end) else: return binSearch(a, val, start, mid-1) Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 5 / 24 Binary Search (3/3) Bewertung von Binary Search: I Komplexität: O(log2 n) I Spezielle Datenstruktur (das ist der “Trick”): – Elemente müssen vorsortiert sein I Vorsortierung: – erzeugt 1x Aufwand vor (den vielen) Anfragen – erzeugt Aufwand beim Anfügen neuer Element – erzeugt Aufwand beim Ersetzen alter Elemente Später in dieser Vorlesung: Suche geht auch mit O(1) ! Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 6 / 24 Algorithmus – eine Annäherung (1/2) Befriedigende Definition von “Algorithmus” ist überraschend schwierig zu finden. Algorithmus Verarbeitungsvorschrift, die so präzise formuliert ist, dass sie automatisch ausgeführt werden kann. Eigenschaften: I Architekturunabhängigkeit – Ein Algorithmus ist für ein abstraktes Maschinenmodell entwickelt, aber von konkreten Realisierungen unabhängig. I Sprachunabhängigkeit – Ein Algorithmus ist exakt definiert, aber von konkreten Programmiersprachen unabhängig. I Korrektheit – Der Algorithmus löst bewiesenermassen ein Problem, evtl. mit Einschränkungen. I Effizienz – Der Algorithmus löst das Problem möglichst schnell mit möglichst wenig Aufwand. Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 7 / 24 Algorithmus – eine Annäherung (2/2) Vielzahl von “abstrakten Maschinenmodellen”: I Turing-Maschine → Vorl. Theorie der Informatik I Lambda Calculus → Vorl. Theorie der Informatik I von Neumann Modell → Vorl. Rechnerarchitektur I Registermaschine, Pointermaschine, Dataflow-Maschine, DNA-Computer, Quantencomputer . . . Algorithmen sind maschinen-spezifisch. In dieser Vorlesung: von Neumann Modell – implementiert eine “Random Access Machine” (RAM) Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 8 / 24 RAM – Random Access Machine (1/2) (Eine andere Bedeutung von RAM: Random Access Memory) Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 9 / 24 RAM – Random Access Machine (2/2) RAM ist ein sequentielles Maschinenmodell: I I I I I I Speicherzellen (z.B. für Integer-Werte), potentiell unbeschränkt Programm / Kontrolleinheit Instruktionen: – Integerwerte verrechnen (inkl Speicher lesen und schreiben) – Vergleiche und Sprungbefehle Alle Operationen brauchen “1 Zeiteinheit” Zeitkomplexität: Wie lange braucht ein Algorithmus? Raumkomplexität: Wie viel Speicher braucht ein Algorithmus? PRAM (parallel RAM) u.m. → Vorl. High-Perform. Computing Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 10 / 24 Abstrakte Datentypen Wer will schon eine RAM programmieren? Anwendungsprogramm(e) Interface Abstrakte Datentypen I Einerseits: Register-Inhalte zu primitiv, um z.B. einen Web-Server zu implementieren. I Andererseits: Neue Datentypen für jede neue Anwendung? verschied. Implement. Algo1 AlgoN RAM verschiedene Materialisierungen x86 JVM I Abstrakte Datentypen: – Auswahl von “nützlichen” Datentypen – hohe Wiederverwendungschance – standardisierte Manipulation (Interface) – Suche nach effizientesten Algorithmen + DS → Inhalt dieser Vorlesung ADT = Akkumuliertes Ingenieur- und Computer Science-Wissen Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 11 / 24 Abstrakte Datentypen – erste Auswahl I I I I I Sack/Menge (bag/set) Liste (list) Kellerstapel (stack) Warteschlange (queue) zweiseitige Warteschlange (deque) Später weitere ADTs: Rekursive Datentypen, Bäume, Graphen . . . Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 12 / 24 Abstrakte Datentypen – Wie einführen? Gründe für ADTs – interne Repräsentation und Algorithmen verstecken – “state of the art” verbreiten – Fehler vermeiden ADTs haben drei Aspekte: 1. Definition (“was”: angebotener Dienst und Verhalten, Semantik) 2. Implementierung (das versteckte “wie”) 3. Typische Verwendung (“warum/wann” ein ATD nützlich ist) Diese Vorlesung: Zuerst Fokus auf Definition und Verwendung, erst dann A+DS -Implementierungsdiskussion Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 13 / 24 ADT – Bag/Set (1/2) Sack (ungeordnete Menge) Einfache Kollektion von Elementen, gegebenenfalls auch Multimenge. In Java: 1 2 3 4 5 public class Bag<Item> implements Iterable<Item> Bag() // create an empty bag void add(Item item) // add an item boolean isEmpty() // is the bag empty? int size() // number of items in the bag – Java: alle Elemente vom gleichen Typ – Java: keine Multimenge Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 14 / 24 ADT – Bag/Set (2/2) “Bag” wird in Python “counter” genannt, ist ein Multiset: Kann mehr als nur 0/1 (vorhanden/nicht vorhanden) zählen. 1 2 3 4 5 class Counter() Counter(cats=2, dogs=3) Counter(myList) c[’tigers’] = 3 len(c) # # # # create create add an number from keyword args from iterable element of elements (not their counts!) Mögliche Verwendungen: I → Graphen: Menge von Knoten und Kanten I “Sammlung” von Elementen für statistische Auswertung, Bsp: – Frequenzzählung (Integer, Worte, . . . -Werte) – darauf Standardabweichung berechnen etc Bag-Operationen: Vereinigung, Schnittmenge, Differenz Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 15 / 24 ADT – List Liste (geordnete Menge) Sammlung von Elementen mit fester Position. array / list sind ein Grundtyp in Java und Python Dito RAM: Speicher als (unendl) Liste, Pos = Speicheradresse 1 2 3 4 5 6 7 Java: int[] a = { 44, 55, 66 }; System.out.println("Element at index 0: " + a[0]); Python: b = [ 44, 55, ’hello world’ ] print b[0] Mögl. Listen-Operationen: concatenation, slicing 1 2 c = [ 2, 3, 4 ] + [ 99, 100] print c[2:4] Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 16 / 24 ADT – Pushdown Stack (1/2) Kellerstapel Dynamische Datenstruktur zur Ablage von Elementen nach dem LIFO-Prinzip (last-in-first-out) In Java: 1 2 3 4 5 6 public class Stack<Item> Stack() void push(Item item) Item pop() boolean isEmpty() int size() implements Iterable<Item> // create an empty stack // add an item // remove the most recently added item // is the stack empty? // number of items in the stack Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 17 / 24 ADT – Pushdown Stack (2/2) In Python wurde list erweitert d.h. es stehen entsprechende Stack-Methoden zur Verfügung: 1 2 3 4 s = list() s.append(23) e = s.pop() print len(s) # create an empty stack # push (add an element) # pop (remove most recently added item) Mögliche Verwendungen: I Zwischenablage (temporärer Speicher) I Implementierung von Prozedur-Aufruf → Vorl. Rechnerarchitektur I Grammatik-Parser, z.B. im Compiler-Bau → Vorl. Theorie der Informatik I klassisches Beispiel: → Auswertung arithm. Ausdrücke, reverse polnish notation (RPN) Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 18 / 24 ADT – Queue (1/2) Warteschlange Dynamische Datenstruktur zur Ablage von Elementen nach dem FIFO-Prinzip (first-in-first-out) In Java: 1 2 3 4 5 6 public class Queue<Item> implements Iterable<Item> Queue() // create an empty queue void enqueue(Item item) // add an item Item dequeue() // remove the least recently added item boolean isEmpty() // is the queue empty? int size() // number of items in the queue Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 19 / 24 ADT – Queue (2/2) In Python: I Man könnte den list Typ verwenden, ist aber nicht effizient wegen der Art, wie Listen implementiert sind. 1 2 3 4 5 6 I q = list() q.append(2) q.append(3) ... e = q[0] q = q[1:] # enqueue # enqueue # dequeue, step 1 # dequeue, step 2 Empfehlung, allgemeineren deque ADT verwenden. Mögliche Verwendungen von Queues: I I Als Warteschlange – Zwischenablage zur späteren Abarbeitung in Reihenfolge des Eingangs Als “dynamisch erweiterbare Liste”: – Einlesen von Werten aus einer Datei, unbekannte Anzahl – dann Bearbeitung in Originalreihenfolge Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 20 / 24 ADT – Deque (1/2) Zweiseitige Warteschlange Dynamische Datenstruktur zur Ablage von Elementen mit Entfernen nach FIFO- oder LIFO-Prinzip deque = Verallgemeinerung von Stack und Queue (deque = “double-ended queue”, Aussprache: “deck”) In Java: 1 2 3 4 5 6 7 8 public class Deque<Item> implements Iterable<Item> Deque() // create an empty deque boolean isEmpty() // is the deque empty? int size() // number of items in the deque void pushLeft(Item item) // add an item to the left end void pushRight(Item item) // add an item to the right end Item popLeft() // remove an item from the left end Item popRight() // remove an item from the right end Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 21 / 24 ADT – Deque (2/2) In Python im Modul collections zur Verfügung gestellt. 1 2 3 4 5 6 7 8 9 10 11 12 13 import collections d = collections.deque() append(x) # Add x to the right side of the deque. appendleft(x) # Add x to the left side of the deque. clear() # Remove all elements from the deque leaving it with length 0. count(x) # Count the number of deque elements equal to x. extend(iterable) # Extend the right side by appending extendleft(iterable) # Extend the left side appending in reverse order pop() # Remove and return from the right side popleft() # Remove and return from the left side remove(value) # Removed the first occurrence of value reverse() # Reverse the elements of the deque in-place Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 22 / 24 ADT Libraries (1/2) Python Modul? I ADTs heutzutage in Standard-Libraries angeboten, “gehören” zum Sprachumfang (Java, Python etc) I Familien von ATDs: – heute collections kennengelernt I Gegenseitiger Bezug der ADTs: – implementierungsabhängig (reuse von Code, OO) Klassenabhängigkeit in Python: Algorithmen und Datenstrukturen, FS17 23. Februar 2017 — 23 / 24 ADT Libraries (2/2) Klassenabhängigkeit in Java (nur collections): Algorithmen und Datenstrukturen, FS17 Nächste Woche: Wie werden collections-ADTs implementiert? → verkettete Listen, Ringbuffer etc 23. Februar 2017 — 24 / 24