Algorithmen und Datenstrukturen (fur ET/IT)Sommersemester 2015
Dr. Tobias Lasser
Computer Aided Medical ProceduresTechnische Universitat Munchen
Programm heute
1 Einfuhrung
2 Grundlagen von Algorithmen
3 Grundlagen von DatenstrukturenPrimitive Datentypen und ZahldarstellungFelder als sequentielle ListeZeichen und ZeichenfolgenFelder als verkettete ListeAbstrakte DatentypenStacksQueues
2
Was sind primitive Datentypen?
Primitive Datentypen
Wir bezeichnen grundlegende, in Programmiersprachen eingebauteDatentypen als primitive Datentypen.
Durch Kombination von primitiven Datentypen lassen sichzusammengesetzte Datentypen bilden.
Beispiele fur primitive Datentypen in C:
• int fur ganze Zahlen
• float fur floating point Zahlen
• bool fur logische Werte
3
Bits und Bytes
1 Byte = 8 Bit
Bit 0Bit 7
Bytes als Maßeinheit fur Speichergrossen (nach IEC, traditionell):
• 210 Bytes = 1024 Bytes = 1 KiB, ein Kilo Byte (Kibi Byte)
• 220 Bytes = 1 MiB, ein Mega Byte (bzw. MebiByte)
• 230 Bytes = 1 GiB, ein Giga Byte (bzw. GibiByte)
• 240 Bytes = 1 TiB, ein Tera Byte (bzw. TebiByte)
• 250 Bytes = 1 PiB, ein Peta Byte (bzw. PebiByte)
• 260 Bytes = 1 EiB, ein Exa Byte (bzw. ExbiByte)
4
Bits und Bytes
1 Byte = 8 Bit
Bit 0Bit 7
Bytes als Maßeinheit fur Speichergrossen (nach IEC, metrisch):
• 103 Bytes = 1000 Bytes = 1 kB, ein kilo Byte (großes B)
• 106 Bytes = 1 MB, ein Mega Byte
• 109 Bytes = 1 GB, ein Giga Byte
• 1012 Bytes = 1 TB, ein Tera Byte
• 1015 Bytes = 1 PB, ein Peta Byte
• 1018 Bytes = 1 EB, ein Exa Byte
Hinweis: auch Bits werden als Maßangabe verwendet, z.B. 16 Mbitoder 16 Mb (kleines b).
5
1001110010001
0101001001000100010001
001000101010100100100010001
1110010001010101001001000100011
10010001 010101 00100100
01001110 00101 00010011
001001110 10011 011100101
10010001010 0100110 00111010111
010011100001001110000100111011101100110
110100 1001110010100011010001110 101001
11010 01001110010001110101100 01011
10011 000100111010010100111 10100
010100 01001110100101100 001001
10101110 010010100 10011101
100101010 010011101
001001110100110110010
0010011101011
6
Primitive Datentypen in C-ahnlichen Sprachen
Wir betrachten im Detail primitive Datentypen fur:
1 naturliche Zahlen (unsigned integers)
2 ganze Zahlen (signed integers)
3 floating point Zahlen (floats)
7
Zahldarstellung
• Dezimalsystem:• Basis x = 10
• Koeffizienten cn ∈ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}• Beispiel: 12310 = 1 · 102 + 2 · 101 + 3 · 100
• Binarsystem:• Basis x = 2
• Koeffizienten cn ∈ {0, 1}• Beispiel: 11012 = 1 · 23 + 1 · 22 + 0 · 21 + 1 · 20 = 1310
8
Zahldarstellung
• Oktalsystem:• Basis x = 8 (= 23)
• Koeffizienten cn ∈ {0, 1, 2, 3, 4, 5, 6, 7}• Beispiel: 1738 = 1 · 82 + 7 · 81 + 3 · 80 = 12310
• Hexadezimalsystem:• Basis x = 16 (= 24)
• Koeffizienten cn ∈ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,A,B,C ,D,E ,F}• Beispiel: 7B16 = 7 · 161 + B · 160 = 12310
9
Wie viele Ziffern pro Zahl?
Problem
Gegeben Zahl z ∈ N, wie viele Ziffern m werden bezuglich Basis xbenotigt?
Losung
m = blogx(z)c+ 1
Erlauterung: (a ∈ R)
• bac = floor(a) = großte ganze Zahl kleiner gleich a
• dae = ceil(a) = kleinste ganze Zahl großer gleich a
a− 1 < bac ≤ a ≤ dae < a + 1
• logx(z) = ln(z)ln(x) , wobei
”ln“ der naturliche Logarithmus ist
10
Wie viele Ziffern pro Zahl?
Losung
m = blogx(z)c+ 1
Beispiele: z = 123
• Basis x = 10:
m = blog10(123)c+ 1 = b2.0899 . . .c+ 1 = 3
• Basis x = 2:
m = blog2(123)c+ 1 = b6.9425 . . .c+ 1 = 7
• Basis x = 8:
m = blog8(123)c+ 1 = b2.3141 . . .c+ 1 = 3
• Basis x = 16:
m = blog16(123)c+ 1 = b1.7356 . . .c+ 1 = 2
11
Großte Zahl pro Anzahl Ziffern?
Problem
Gegeben Basis x und m Ziffern, was ist die großte darstellbareZahl?
Losung
zmax = xm − 1
Beispiele:
• x = 2, m = 4:
zmax = 24 − 1 = 15 = 11112
• x = 2, m = 8:
zmax = 28 − 1 = 255 = 111111112
• x = 16, m = 2:
zmax = 162 − 1 = 255 = FF16
12
Naturliche Zahlen in C-ahnlichen Sprachen
Naturliche Zahlen
In Computern verwendet man Binardarstellung mit einer fixenAnzahl Ziffern (genannt Bits).
Die primitiven Datentypen fur naturliche Zahlen sind:
• 8 Bits (ein Byte), darstellbare Zahlen: {0, . . . , 255}in C: unsigned char
• 16 Bits, darstellbare Zahlen: {0, . . . , 65535}in C: unsigned short
• 32 Bits, darstellbare Zahlen: {0, . . . , 4294967295}in C: unsigned long
• 64 Bits, darstellbare Zahlen: {0, . . . , 264 − 1}in C: unsigned long long
13
Negative Zahlen
Darstellung durch 2-Komplement
Beispiel fur 4 Bits (darstellbare Zahlen: 24 = 16):
-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9-9
Damit erhalt man:
0000 = +0 0100 = +4 1000 = -8 1100 = -40001 = +1 0101 = +5 1001 = -7 1101 = -30010 = +2 0110 = +6 1010 = -6 1110 = -20011 = +3 0111 = +7 1011 = -5 1111 = -1
Das erste Bit ist also das Vorzeichen!
14
2-Komplement Darstellung I
2-Komplement Darstellung
Sei x ∈ N, x > 0. Die 2-Komplement Darstellung −xz von −xmittels n Bits ist gegeben durch
−xz = 2n − x .
Vorheriges Beispiel war: −5 = 1011, also x = 5 und n = 4.
Nun:−5z = 24 − 5 = 16− 5 = 11 = 10112
15
2-Komplement Darstellung II
Sei bnbn−1 . . . b1 eine Bitfolge.
• (bnbn−1 . . . b1)z sei der Zahlwert in 2-Komplement Darstellung
• fur positive Zahlen von 0 bis 2n−1 − 1 entspricht(bnbn−1 . . . b1)z der Binardarstellung:
(0bn−1 . . . b1)z = (0bn−1 . . . b1)2
• fur negative Zahlen von −2n−1 bis −1 gilt
(1bn−1 . . . b1)z = −2n−1 + (0bn−1 . . . b1)2
• allgemein:
(bnbn−1 . . . b1)z = bn · (−2n−1) + (bn−1 . . . b1)2
16
Eigenschaften 2-Komplement
• Fur n ∈ N gilt
(111 . . . 11)z = (−2n−1) + 2n−2 + . . . + 21 + 20
= −2n−1 + (2n−1 − 1)
= −1
• Um −x aus x in 2-Komplement Darstellung zu erhalten:
Bilde bitweises Komplement und addiere 1.
• Beispiel: Negatives von 6 = (0110)2 mit n = 4
−6 = (0110)z + 1 = (1001)z + 1 = (1010)z
• und zuruck:
6 = (1010)z + 1 = (0101)z + 1 = (0110)z
17
Ganze Zahlen in C-ahnlichen Sprachen
Ganze Zahlen
Die primitiven Datentypen fur ganze Zahlen sind:
• 8 Bits: unsigned char {0, . . . , 255}signed char {−128, . . . , 127}
• 16 Bits: unsigned short {0, . . . , 65535}signed short {−32768, . . . , 32767}
• 32 Bits: unsigned long {0, . . . , 232 − 1}signed long {−231, . . . , 231 − 1}
• 64 Bits: unsigned long long {0, . . . , 264 − 1}signed long long {−263, . . . , 263 − 1}
• signed kann weggelassen werden (ausser bei char!)
• unsigned int und signed int sind je nach System 16, 32oder 64 Bit
18
Rationale Zahlen I
Festkomma Darstellung:
• Komma an fester Stelle in Zahl
• Beispiel mit n = 32:
32 1
ganzzahliger Anteil gebrochener AnteilKomma
• Nachteile:• weniger große Zahlen darstellbar• feste Genauigkeit der Nachkommastellen
19
Rationale Zahlen II
32 1
ganzzahliger Anteil gebrochener AnteilKomma
• Interpretation fur r ∈ Q:
r = cn · 2n + . . . + c0 · 20 + c−12−1 + . . . + c−m · 2−m
mit n Vorkomma- und m Nachkomma-Ziffern
• Beispiel:
11.012 = 1 · 21 + 1 · 20 + 0 · 2−1 + 1 · 2−2
= 2 + 1 + 0 + 14 = 3.2510
20
Floating Point Zahlen I
Wissenschaftliche Notation:
• x = a · 10b fur x ∈ R, wobei:• a ∈ R mit 1 ≤ |a| < 10• b ∈ Z
• Beispiele:• −2.7315 · 102 ◦C absoluter Nullpunkt• 1.5 · 109 Hz Taktfrequenz A8X Prozessor
• Drei Bestandteile:• Vorzeichen• Mantisse |a|• Exponent b
• Problem: bei fester Lange der Mantisse (z.B. 3 Ziffern)• zwischen 1.23 · 104 = 12300 und 1.24 · 104 = 12400 keine Zahl
darstellbar!
21
Floating Point Zahlen II
V Exponent E Mantisse M
23 Bit8 Bit 32 Bit float64 Bit double52 Bit11 Bit
1 Bit1 Bit
• wissenschaftliche Darstellung mit Basis 2
f = (−1)V · (1 + M) · 2E−bias
• Vorzeichen Bit V
• Mantisse M hat immer die Form 1.abc, also wird erste Stelleweggelassen (
”hidden bit“)
• Exponent E wird vorzeichenlos abgespeichert, verschoben umbias• bei 32 bit float: bias = 127, bei 64 bit double: bias = 1023
22
Floating Point Zahlen III
Ubliche Floating Point Formate:
Bit Vorz. Exponent Mantisse gultigeDezimalst.
darstellbarerBereich
32 1 Bit 8 Bit 23 Bit ∼ 7 ±2 · 10−38 bis± 2 · 1038
64 1 Bit 11 Bit 52 Bit ∼ 15 ±2 · 10−308 bis± 2 · 10308
80 1 Bit 15 Bit 64 Bit ∼ 19 ±1 · 10−4932 bis± 1 · 104932
In C:
float (32 Bit), double (64 Bit), long double (80 Bit)
23
Vorsicht mit Floating Point!
Floating Point Zahlen sind bequem, aber Vorsicht!
• Viele Dezimalzahlen haben keine Floating Point Darstellung• Beispiel: 0.110 = 0.0001100110011 . . .2 (periodisch)
• Durch feste Lange der Mantisse sind ebenfalls viele Zahlennicht darstellbar• Beispiel: mit 3 Ziffern Mantisse ist zwischen 1.23 · 104 = 12300
und 1.24 · 104 = 12400 keine Zahl darstellbar!
• Kritisch sind Vergleiche von Floating Point Zahlen• Beispiel: (0.1 + 0.2 == 0.3) ist meist FALSE!
• Zins-Berechnungen und dergleichen NIE mit Floating PointZahlen!• Stattdessen: spezielle Bibliotheken wie GMP
24
Definition Datenstruktur
Definition Datenstruktur (nach Prof. Eckert)
Eine Datenstruktur ist eine
• logische Anordnung von Datenobjekten,
• die Informationen reprasentieren,
• den Zugriff auf die reprasentierte Information uberOperationen auf Daten ermoglichen und
• die Information verwalten.
Zwei Hauptbestandteile:
• Datenobjekte• z.B. definiert uber primitive Datentypen
• Operationen auf den Objekten• z.B. definiert als Funktionen
25
Primitive Datentypen in C
• Naturliche Zahlen, z.B. unsigned short, unsigned long
• Wertebereich: bei n Bit von 0 bis 2n − 1• Operationen: +, -, *, /, %, <, ==, !=, >
• Ganze Zahlen, z.B. int, long• Wertebereich: bei n Bit von −2n−1 bis 2n−1 − 1• Operationen: +, -, *, /, %, <, ==, !=, >
• Floating Point Zahlen, z.B. double, float• Wertebereich: abhangig von Große• Operationen: +, -, *, /, <, ==, !=, >
• Logische Werte, bool
• Wertebereich: true, false• Operationen: &&, ||, !, ==, !=
26
Programm heute
1 Einfuhrung
2 Grundlagen von Algorithmen
3 Grundlagen von DatenstrukturenPrimitive Datentypen und ZahldarstellungFelder als sequentielle ListeZeichen und ZeichenfolgenFelder als verkettete ListeAbstrakte DatentypenStacksQueues
27
Definition Feld
Definition Feld
Ein Feld A ist eine Folge von n Datenelementen (di )i=1,...,n,
A = d1, d2, . . . , dn
mit n ∈ N0.
Die Datenelemente di sind beliebige Datentypen (z.B. primitive).
Beispiele:
• A sind die naturlichen Zahlen von 1 bis 10, aufsteigendgeordnet:
A = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
• Ist n = 0, so ist das Feld leer.
28
Feld als sequentielle Liste
Reprasentation von Feld A als sequentielle Liste (oder Array)
• feste Anzahl n von Datenelementen
• zusammenhangend gespeichert
• in linearer Reihenfolge mit Index
• Zugriff auf i-tes Element uber Index i: A[i]
...Feld A: A[n-1] A[n-2] A[2] A[1] A[0]
Achtung: Indizierung startet meist bei 0!
29
Beispiel sequentielle Liste
Feld A: 15 8 0
A[0]A[1]A[2]
• Feld-Deklaration in C (optionales Beispiel):
int A[3];
• Zugriff auf Elemente:
A[0] = 0;
A[1] = 8;
A[2] = A[1] + 7; // nun: A[2] == 15
30
Eigenschaften sequentielle Liste
Feld A mit Lange n als sequentielle Liste (Array)
• Vorteile:• direkter Zugriff auf Elemente in konstanter Zeit mittels A[i]• sequentielles Durchlaufen sehr einfach
• Nachteile:• Verschwendung von Speicher falls Liste nicht voll belegt• Verlangern der sequentiellen Liste aufwendig• Hinzufugen und Loschen von Elementen aufwendig
31
Verlangern der sequentiellen Liste
Gegeben: Feld A, Lange n+1, als sequentielle Liste
Gewunscht: Feld A erweitert auf Lange n+2
• neuen Speicher der Große n+2 reservieren
• alte Liste in neuen Speicher kopieren
...Feld A: A[n] A[n-1] A[2] A[1] A[0]
...neuesFeld A: A[n] A[n-1] A[2] A[1]A[n+1] A[0]
32
Loschen von Element aus Liste
Gegeben: Feld A, Lange n, als sequentielle Liste
Gewunscht: Element i aus Feld A loschen
• Element i entfernen
• Listenelemente nach i umkopieren
25 16 4 1 09
25 9 4 116
33
Einfugen von Element in Liste
Gegeben: Feld A, Lange n, als sequentielle Liste
Gewunscht: neues Element in Feld A an Stelle i einfugen
• Listenelemente nach i umkopieren
• Element i einfugen
25 9 4 116
25 16 8 4 19
34
Ausblick: Anwendung von sequentiellen Listen
in 2D und 3D Bildern!
35
Programm heute
1 Einfuhrung
2 Grundlagen von Algorithmen
3 Grundlagen von DatenstrukturenPrimitive Datentypen und ZahldarstellungFelder als sequentielle ListeZeichen und ZeichenfolgenFelder als verkettete ListeAbstrakte DatentypenStacksQueues
36
Bytes und ASCII
Interpretation eines Bytes als Zeichen (anstatt Zahlen)−→ z.B. ASCII Code
7 Bit ASCII Code:
Code ..0 ..1 ..2 ..3 ..4 ..5 ..6 ..7 ..8 ..9 ..A ..B ..C ..D ..E ..F
0.. nul soh stx etx eot enq ack bel bs ht lf vt ff cr so si
1.. dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us
2.. sp ! “ # $ % & ’ ( ) * + , - . /
3.. 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4.. @ A B C D E F G H I J K L M N O
5.. P Q R S T U V W X Y Z [ \ ] ˆ
6.. ‘ a b c d e f g h i j k l m n o
7.. p q r s t u v w x y z { ‖ } ˜ del
37
ASCII Erweiterungen, Unicode
• ASCII verwendet nur 7 Bit von einem Byte• enthalt z.B. keine Umlaute (a, o, u) oder Akzente (e, c)
• es gibt verschiedene Erweiterungen von ASCII auf 8 Bit• in Europa ist ISO Latin-1 verbreitet (ISO Norm 8859-1)• belegt die Codes von 128-255 (bzw. 80-FF in hex)
• Unicode wurde als 16 Bit Codierung eingefuhrt• erste 128 Zeichen stimmen mit ASCII uberein• die nachsten 128 Zeichen mit ISO Latin-1• danach z.B. kyrillische, arabische, japanische Schriftzeichen
• UTF-8 ist eine Mehrbyte-Codierung von Unicode (1-6 Bytes)• Code-Lange wird durch die ersten Bits codiert
38
Zeichen und Zeichenfolgen
Reprasentation eines ASCII Zeichens in C: char
• Zeichen-Literale in einfachen Anfuhrungszeichen
Beispiele: ’A’, ’u’, ’D’
char zeichen = ’A’;
• Vorsicht bei nicht-ASCII Zeichen!
Reprasentation einer Zeichenfolge? (Englisch: String)
• String-Literale in doppelten Anfuhrungszeichen
Beispiel: “AuD“
• in C gespeichert als Feld (sequentielle Liste) von Zeichen:
'D' 'u' 'A''\0'0123 Index
39
Programm heute
1 Einfuhrung
2 Grundlagen von Algorithmen
3 Grundlagen von DatenstrukturenPrimitive Datentypen und ZahldarstellungFelder als sequentielle ListeZeichen und ZeichenfolgenFelder als verkettete ListeAbstrakte DatentypenStacksQueues
40
Definition Feld
Definition Feld
Ein Feld A ist eine Folge von n Datenelementen (di )i=1,...,n,
A = d1, d2, . . . , dn
mit n ∈ N0.
Die Datenelemente di sind beliebige Datentypen (z.B. primitive).
41
Feld als sequentielle Liste
Reprasentation von Feld A als sequentielle Liste (oder Array)
• feste Anzahl n von Datenelementen
• zusammenhangend gespeichert
• in linearer Reihenfolge mit Index
• Zugriff auf i-tes Element uber Index i: A[i]
...Feld A: A[n-1] A[n-2] A[2] A[1] A[0]
42
Operationen auf sequentiellen Listen
Sei A sequentielle Liste.
Operationen:
• initialize: Initialisiere seq. Liste A mit nElementen
• elementAt(i): Zugriff auf i-tes Element von A:A[i]
• insert: fuge Element in seq. Liste A ein
(erfordert Umkopieren und evtl. Verlangernvon A)
• erase: entferne Element aus seq. Liste A
(erfordert Umkopieren)
A[n-1] A[n-2] .. A[1] A[0]..
25 9 4 116
25 16 8 4 19
25 16 4 1 09
25 9 4 116
43
Feld als einfach verkettete Liste
Reprasentation von Feld A als verkettete Liste
• dynamische Anzahl von Datenelementen
• in linearer Reihenfolge gespeichert (nicht notwendigerweisezusammenhangend!)
• mit Referenzen oder Zeigern verkettet
Daten Daten DatenDatenstart
nullnext next next next
auf Englisch: linked list
44
Verkettete Liste
Daten Daten DatenDatenstart
nullnext next next next
• Folge von miteinander verbundenen Elementen
• jedes Element di besteht aus• Daten: Wert des Feldes an Position i• next: Referenz auf das nachste Element di+1
Daten
next
Node:
• start ist Referenz auf erstes Element des Feldes d1
• letztes Element dn hat keinen Nachfolger• symbolisiert durch null-Referenz
45
Operationen auf verketteter Liste
Zugriff auf Element i:
• beginne bei start Referenz
• “vorhangeln” entlang next Referenzen bis zum i-ten Element
Beispiel fur i=3:
Daten Daten DatenDatenstart
nullnext next next next
Hilfsreferenz
46
Operationen auf verketteter Liste
Loschen von Element i:
• Zugriff auf Element i-1
• “umhangen” von next Referenz von Element i-1 auf Elementi+1
Beispiel fur i=3:
Daten Daten DatenDatenstart
nullnext next next next
Hilfsreferenz
47
Operationen auf verketteter ListeEinfugen von Element an Stelle i:
• Zugriff auf Element i-1
• “umhangen” von next Referenz von Element i-1 auf neuesElement
• next Referenz von neuem Element setzen auf altes Element i
Beispiel fur i=3:
Daten Daten DatenDatenstart
nullnext next next next
HilfsreferenzDaten
next
neues Element
48
Gegenuberstellung sequentielle Liste und verkettete Liste
Sequentielle Liste Verkettete Liste
⊕ Direkter Zugriff auf i-tesElement
Zugriff auf i-tes Element er-fordert i Iterationen
⊕ sequentielles Durchlaufensehr einfach
⊕ sequentielles Durchlaufensehr einfach
statische Lange, kann Spei-cher verschwenden
⊕ dynamische Lange
zusatzlicher Speicher furZeiger benotigt
Einfugen/Loschen erforderterheblich Kopieraufwand
⊕ Einfugen/Loschen einfach
49
Feld als doppelt verkettete Liste
Reprasentation von Feld A als doppelt verkettete Liste
• verkettete Liste
• jedes Element mit Referenzen doppelt verkettet
Daten Daten DatenDatenstart
null
null
next next next next
prev prev prev prev
stop
auf Englisch: doubly linked list
50
Doppelt verkettete Liste
Daten Daten DatenDatenstart
null
null
next next next next
prev prev prev prev
stop
• Folge von miteinander verbundenen Elementen• jedes Element di besteht aus
• Daten: Wert des Feldes an Position i• next: Referenz auf das nachste Element di+1
• prev: Referenz auf das vorherige Element di−1
Daten
next
Node:
prev
• start/stop sind Referenzen auf erstes/letztes Element desFeldes
• letztes Element dn hat keinen Nachfolger• symbolisiert durch null-Referenz
51
Operationen auf doppelt verketteter Liste
Loschen von Element i:
• Zugriff auf Element i
• “umhangen” von next von Element i-1 auf Element i+1
• “umhangen” von prev von Element i+1 auf Element i-1
Beispiel fur i=3:
Daten Daten DatenDatenstart
null
null
next next next next
prev prev prev prev
stop
52
Operationen auf doppelt verketteter ListeEinfugen von Element an Stelle i:• Zugriff auf Element i• “umhangen” von next von Element i-1 auf neues Element,
sowie “umhangen” von prev von altem Element i auf neuesElement
• next bzw. prev von neuem Element setzen auf altes Element ibzw. Element i-1
Beispiel fur i=3:
Daten Daten DatenDatenstart
null
null
next next next next
prev prev prev prev
stop
Daten
next
prev
53
Eigenschaften doppelt verkettete Liste
Feld A als doppelt verkettete Liste
• Vorteile:• Durchlauf in beiden Richtungen moglich• Einfugen/Loschen potentiell einfacher, da man sich Vorganger
nicht extra merken muss
• Nachteile:• zusatzlicher Speicher erforderlich fur zwei Referenzen• Referenzverwaltung komplizierter und fehleranfallig
54
Zusammenfassung Felder
Ein Feld A kann reprasentiert werden als:
• sequentielle Liste (array)• mit fixer Lange
• verkettete Liste (linked list)• mit dynamischer Lange
• doppelt verkettete Liste (doubly linked list)• mit dynamischer Lange
Eigenschaften:
• einfach und flexibel
• aber manche Operationen aufwendig
Als nachstes −→ Aufgabe von Flexibilitat fur Effizienz
55
Programm heute
1 Einfuhrung
2 Grundlagen von Algorithmen
3 Grundlagen von DatenstrukturenPrimitive Datentypen und ZahldarstellungFelder als sequentielle ListeZeichen und ZeichenfolgenFelder als verkettete ListeAbstrakte DatentypenStacksQueues
56
Definition Abstrakter Datentyp
Abstrakter Datentyp (englisch: abstract data type, ADT)
Ein abstrakter Datentyp ist ein mathematisches Modell furbestimmte Datenstrukturen mit vergleichbarem Verhalten.
Ein abstrakter Datentyp wird indirekt definiert uber
• mogliche Operationen auf ihm sowie
• mathematische Bedingungen (oder: constraints) uber dieAuswirkungen der Operationen (u.U. auch die Kosten derOperationen).
57
Beispiel abstrakter Datentyp: abstrakte Variable
Abstrakte Variable V ist eine veranderliche Dateneinheit
mit zwei Operationen
• load(V) liefert einen Wert
• store(V, x) wobei x ein Wert
und der Bedingung
• load(V) liefert immer den Wert x der letzten Operationstore(V, x)
58
Beispiel abstrakter Datentyp: abstrakte Liste (Teil 1)
Abstrakte Liste L ist ein Datentyp
mit Operationen
• pushFront(L, x) liefert eine Liste
• front(L) liefert ein Element
• rest(L) liefert eine Liste
und den Bedingungen
• ist x Element, L Liste, dann liefert front(pushFront(L, x)) dasElement x.
• ist x Element, L Liste, dann liefert rest(pushFront(L, x)) dieListe L.
59
Beispiel abstrakter Datentyp: abstrakte Liste (Teil 2)
Abstrakte Liste L. Weitere Operationen sind
• isEmpty(L) liefert true oder false
• initialize() liefert eine Listen Instanz
mit den Bedingungen
• initialize() 6= L fur jede Liste L (d.h. jede neue Liste istseparat von alten Listen)
• isEmpty(initialize()) == true (d.h. eine neue Liste ist leer)
• isEmpty(pushFront(L, x)) == false (d.h. eine Liste ist nacheinem pushFront nicht leer)
60
Programm heute
1 Einfuhrung
2 Grundlagen von Algorithmen
3 Grundlagen von DatenstrukturenPrimitive Datentypen und ZahldarstellungFelder als sequentielle ListeZeichen und ZeichenfolgenFelder als verkettete ListeAbstrakte DatentypenStacksQueues
61
Definition Stack
Stack (oder deutsch: Stapel, Keller)
Ein Stack ist ein abstrakter Datentyp. Er beschreibt eine spezielleListenstruktur nach dem Last In – First Out (LIFO) Prinzip mitden Eigenschaften
• loschen, einfugen ist nur am Ende der Liste erlaubt,
• nur das letzte Element darf manipuliert werden.
Operationen auf Stacks:
• push: legt ein Element auf den Stack (einfugen)
• pop: entfernt das letzte Element vom Stack (loschen)
• top: liefert das letzte Stack-Element
• isEmpty: liefert true falls Stack leer
• initialize: Stack erzeugen und in Anfangszustand (leer) setzen
62
Definition Stack
Stack (oder deutsch: Stapel, Keller)
Ein Stack ist ein abstrakter Datentyp. Er beschreibt eine spezielleListenstruktur nach dem Last In – First Out (LIFO) Prinzip mitden Eigenschaften
• loschen, einfugen ist nur am Ende der Liste erlaubt,
• nur das letzte Element darf manipuliert werden.
Pizza #1
Pizza #2
neue Pizza
Pizza #3
"push"
63
Definition Stack (exakter)
Stack S ist ein abstrakter Datentyp mit Operationen
• pop(S) liefert einen Wert
• push(S, x) wobei x ein Wert
mit der Bedingung
• ist x Wert und V abstrakte Variable, dann ist die Sequenzpush(S, x); store(V, pop(S)) aquivalent zu store(V, x)
sowie der Operation
• top(S) liefert einen Wert
mit der Bedingung
• ist x Wert und V abstrakte Variable, dann ist die Sequenzpush(S, x); store(V, top(S)); aquivalent zupush(S, x); store(V, x)
64
Definition Stack (exakter, Teil 2)
Stack S. Weitere Operationen sind
• isEmpty(S) liefert true oder false
• initialize() liefert eine Stack Instanz
mit den Bedingungen
• initialize() 6= S fur jeden Stack S (d.h. jeder neue Stack istseparat von alten Stacks)
• isEmpty(initialize()) == true (d.h. ein neuer Stack ist leer)
• isEmpty(push(S, x)) == false (d.h. ein Stack nach push istnicht leer)
65
Anwendungsbeispiele Stack
• Auswertung arithmetischer Ausdrucke (s. nachste Folie)
• Call-Stack bei Funktionsaufrufen
• Einfache Vorwarts- / Ruckwarts Funktion in Software• z.B. im Internet-Browser
• Syntaxanalyse eines Programms• z.B. zur Erkennung von Syntax-Fehlern durch Compiler
66
Auswertung arithmetischer Ausdrucke
Gegeben sei ein vollstandig geklammerter, einfacher arithmetischerAusdruck mit Bestandteilen Zahl, +, *, =
Beispiel: (3 * (4 + 5)) =
Schema:
• arbeite Ausdruck von links nach rechts ab, speichere jedesZeichen ausser ) und = in Stack S
• bei ) werte die 3 obersten Elemente von S aus, dann entfernedie passende Klammer ( vom Stack S und speichere Ergebnisin Stack S
• bei = steht das Ergebnis im obersten Stack-Element von S
67
Implementation Stack
Stack ist abstrakter Datentyp.
• Implementation ist nicht festgelegt
• nur Operationen und Bedingungen sind festgelegt
Stack kann auf viele Arten implementiert werden, zum Beispiel als:
• sequentielle Liste
• verkettete Liste
69
Implementation Stack als sequentielle Liste
• Stack-Elemente speichern in sequentieller Liste A (Lange n)
• oberstes Stack-Element merken mittels Variable top
• falls Stack leer ist top == -1
01n-2n-1 ...
top
-1
• push(x) inkrementiert top und speichert x in A[top]
• pop() liefert A[top] zuruck und dekrementiert top
• top() liefert A[top] zuruck
70
Implementation Stack als sequentielle Liste
01n-2n-1 ...
top
-1
9 4 101n-2n-1 ...
top
-1
9 4 101n-2n-1 ...
top
-1
push(1);push(4);push(9);
initialize();
pop();
71
Implementation Stack als verkettete Liste
• Stack-Elemente speichern in verketteter Liste L
• oberstes Stack-Element wird durch start Referenz markiert
Daten Daten DatenDatenstart
nullnext next next next
• push(x) fugt Element an erster Position ein
• pop() liefert Element an erster Position zuruck und entfernt es
• top() liefert Element an erster Position zuruck
72
Zusammenfassung Stack
• Stack ist abstrakter Datentyp als Metapher fur einen Stapel• wesentliche Operationen: push, pop
• Implementation als sequentielle Liste• fixe Große (entweder Speicher verschwendet oder zu klein)• push, pop sehr effizient
• Implementation als verkettete Liste• dynamische Große, aber Platz fur Zeiger “verschwendet”• push, pop sehr effizient
73
Programm heute
1 Einfuhrung
2 Grundlagen von Algorithmen
3 Grundlagen von DatenstrukturenPrimitive Datentypen und ZahldarstellungFelder als sequentielle ListeZeichen und ZeichenfolgenFelder als verkettete ListeAbstrakte DatentypenStacksQueues
74
Definition Queue
Queue (oder deutsch: Warteschlange)
Eine Queue ist ein abstrakter Datentyp. Sie beschreibt einespezielle Listenstruktur nach dem First In – First Out (FIFO)Prinzip mit den Eigenschaften
• einfugen ist nur am Ende der Liste erlaubt,
• entfernen ist nur am Anfang der Liste erlaubt.
Person stellt sich anPerson verlässt Schlange
75
Definition Queue
Queue (oder deutsch: Warteschlange)
Eine Queue ist ein abstrakter Datentyp. Sie beschreibt einespezielle Listenstruktur nach dem First In – First Out (FIFO)Prinzip mit den Eigenschaften
• einfugen ist nur am Ende der Liste erlaubt,
• entfernen ist nur am Anfang der Liste erlaubt.
Operationen auf Queues:
• enqueue: fugt ein Element am Ende der Schlange hinzu
• dequeue: entfernt das erste Element der Schlange
• isEmpty: liefert true falls Queue leer
• initialize: Queue erzeugen und in Anfangszustand (leer) setzen
76
Definition Queue (exakter)Queue Q ist ein abstrakter Datentyp mit Operationen
• dequeue(Q) liefert einen Wert
• enqueue(Q, x) wobei x ein Wert
• isEmpty(Q) liefert true oder false
• initialize liefert eine Queue Instanz
und mit Bedingungen
• ist x Wert, V abstrakte Variable und Q eine leere Queue,dann ist die Sequenz enqueue(Q, x); store(V, dequeue(Q))aquivalent zu store(V, x)
• sind x,y Werte, V abstrakte Variable und Q eine leere Queue,dann ist die Sequenz enqueue(Q, x); enqueue(Q, y); store(V,dequeue(Q)) aquivalent zu store(V, x); enqueue(Q, y)
• initialize() 6= Q fur jede Queue Q
• isEmpty(initialize()) == true
• isEmpty(enqueue(Q, x)) == false
77
Beispiel: Queue
Q:
Anfang
Q:
Anfang
Q:
Anfang
Q:
Anfang
Q:
Anfang
1
2
32
1
1
Q:
Anfang
2
3
3
Q = initialize();
enqueue(1);
enqueue(2);
enqueue(3);
dequeue();
dequeue();
78
Anwendungsbeispiele Queue
• Druckerwarteschlange
• Playlist von iTunes (oder ahnlichem Musikprogramm)
• Kundenauftrage bei Webshops
• Warteschlange fur Prozesse im Betriebssystem (Multitasking)
79
Anwendungsbeispiel Stack und Queue
Palindrom
Ein Palindrom ist eine Zeichenkette, die von vorn und von hintengelesen gleich bleibt.
Beispiel: Reittier
• Erkennung ob Zeichenkette ein Palindrom ist
• ein Stack kann die Reihenfolge der Zeichen umkehren
• eine Queue behalt die Reihenfolge der Zeichen
80
Palindrom Erkennung
Algorithmus:
• Eingabe: Zeichenkette k
• durchlaufe k von links nach rechts• fuge dabei jedes Zeichen in Stack S
(push) und Queue Q (enqueue) ein
• leere den Stack S (pop) und die Queue Q(dequeue) und vergleiche die Zeichen• falls die Zeichen nicht gleich sind, ist k
kein Palindrom• ansonsten ist k Palindrom
• Ausgabe: k ist Palindrom oder nicht
Zeichenkette k: RADAR
Queue Q:
RADAR
Stack S:
R A D A R
Anfang
top
81
Implementation Queue
Auch Queue ist abstrakter Datentyp.
• Implementation ist nicht festgelegt
• nur Operationen und Bedingungen sind festgelegt
Queue kann auf viele Arten implementiert werden, zum Beispielals:
• verkettete Liste
• sequentielle Liste
82
Implementation Queue als verkettete Liste
• Queue-Elemente speichern in verketteter Liste L
• Anfang der Queue wird durch anfang Referenz markiert
• Ende der Queue wird durch extra ende Referenz markiert
Daten Daten DatenDatenanfang
NULLnext next next next
ende
• enqueue(x) fugt Element bei ende Referenz ein
• dequeue() liefert Element bei anfang Referenz zuruck undentfernt es
83
Implementation Queue als sequentielle Liste
• Queue-Element speichern in sequentieller Liste L (Lange n)
• Anfang der Queue wird durch Index anfang markiert
• Ende der Queue wird durch Index ende markiert
15 8 001n-2n-1 2
anfang
...
ende
• enqueue(x) fugt Element bei Index ende+1 ein
• dequeue liefert Element bei Index anfang zuruck und entferntes durch Inkrement von anfang
84
Implementation Queue als sequentielle Liste 2
Problem:
15 8 001n-2n-1 2
anfang
...
ende
wird nach ein paar Operationen zu
47 11 301n-2n-1 2
anfang
...
ende
Linksdrift!
Losungsansatz: zirkulare sequentielle Liste.
85
Implementation Queue als zwei Stacks
• Queue Q kann mittels zwei Stacks implementiert werden
• erster Stack inbox wird fur enqueue benutzt:• Q.enqueue(x) resultiert in inbox.push(x)
• zweiter Stack outbox wird fur dequeue benutzt:• falls outbox leer, kopiere alle Elemente von inbox zu outbox:
outbox.push( inbox.pop() )
• Q.dequeue liefert outbox.pop() zuruck
1
2
3
inbox outbox
enqueue
3
2
1
inbox outbox
dequeue
86
Zusammenfassung Queue
• Queue ist abstrakter Datentyp als Metapher fur eineWarteschlange• wesentliche Operationen: enqueue, dequeue
• Implementation als verkettete Liste• dynamische Große, aber Platz fur Referenzen “verschwendet”• enqueue, dequeue sehr effizient
• Implementation als sequentielle Liste• fixe Große (entweder Speicher verschwendet oder zu klein)• enqueue, dequeue sehr effizient• Queue sehr schnell voll durch “Linksdrift”
(ist aber durch zirkulare sequentielle Liste losbar)
87
Zusammenfassung
1 Einfuhrung
2 Grundlagen von Algorithmen
3 Grundlagen von DatenstrukturenPrimitive Datentypen und ZahldarstellungFelder als sequentielle ListeZeichen und ZeichenfolgenFelder als verkettete ListeAbstrakte DatentypenStacksQueues
88
Top Related