20170223 BinSearch, Kollectionen-ADTs

Werbung
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
Herunterladen