Datenstrukturen und Algorithmen VO 708.031 25.10.2012 [email protected] 1 Wiederholung • Wir vergleichen Algorithmen anhand des ordnungsmäßigen Wachstums von T(n), S(n),… • Asympto6sche Schranken: – O‐Nota6on: f(n) = O(g(n)) ⇔ g(n) ist eine asymptoMsch obere Schranke von f(n) – Ω‐Nota6on: f(n) = Ω(g(n)) ⇔ g(n) ist eine asymptoMsch untere Schranke von f(n) – Θ‐Nota6on: f(n) = Θ(g(n)) ⇔ g(n) ist eine asymptoMsch exakte Schranke für f(n) • f(n) = Θ(g(n)) ⇔ f(n) = O(g(n)) ⋀ f(n) = Ω(g(n)) 25.10.2012 [email protected] 2 Elementare Datenstrukturen (Tafel mit KeilschriW, Priester von Adab, 4600 Jahre alt) Peru – Inca, Aufzeichnungsform [Aus K. Mehlhorn and P. Sanders: Data Structures and Algorithms. Springer Verlag, 2008] 25.10.2012 [email protected] 3 Elementare Datenstrukturen • Lineares Feld (array): – A[1..n]; benachbarte Elemente stehen im Speicher nebeneinander; Zugriff auf i‐tes Element A[i] in O(1) Zeit • Lineare Liste (linked list): – Benachbarte Elemente sind verkecet – Varianten: einfach verkecet, doppelt verkecet, zirkulär verkecet WERT(p) HEAD(L) NACH(p) … … VOR(p) 25.10.2012 p [email protected] 4 Elementare Datenstrukturen • Lineare Liste (linked list): – Suchen eines Wertes benöMgt O(n) Zeit – Einfügen eines Elementes benöMgt O(1) Zeit – Löschen eines Elementes benöMgt O(1) Zeit (wenn Suchen erforderlich ⇒ O(n) Zeit) WERT(p) HEAD(L) NACH(p) … … VOR(p) 25.10.2012 p [email protected] 5 Elementare Datenstrukturen • Hauptopera6onen auf linearen Feldern und Listen Lineares Feld Lineare Liste Zugriff auf i‐tes Element O(1) O(i) Suchen O(n) O(n) Einfügen O(n) O(1) Enhernen O(n) O(1)* * wenn Element gegeben, sonst O(n) (zuerst suchen) 25.10.2012 [email protected] 6 Elementare Datenstrukturen • Stapel (stack): – Erlaubt nur das Enhernen des zuletzt eingefügten Elementes (LIFO‐Strategie: „last‐in first‐out“) – ImplementaMon mit einem linearen Feld S[1..n]: 25.10.2012 [email protected] 7 Elementare Datenstrukturen • Stapel (stack): Einfügen: Entfernen: PUSH(S,x) 1: IF t==n THEN „overflow“ 2: ELSE t=t+1 3: S[t]=x POP(S) 1: IF t==0 THEN „underflow“ 2: ELSE x=S[t] 3: t=t-1 4: RETURN x Alle OperaMonen benöMgen O(1) Zeit 25.10.2012 [email protected] 8 Stapel Anwendung • Umwandeln von Infix‐Ausdrücken in PosLix‐NotaMon und deren anschließende Auswertung • Beispiel: – Infix: (3+7)*(5‐1)+2 – PosLix: 3 7 + 5 1 ‐ * 2 + – Auswertung: 42 25.10.2012 [email protected] 9 Stapel Anwendung • Algorithmus zur Umwandlung Infix ‐> Poshix: – Stapel anfangs leer (enthält während des Arbeitens nur Klammern und Operatoren) – Durchlaufe die Eingabeelemente von links nach rechts: • ‘(‘: Klammer auf Stapel legen • Zahl: Zahl ausgeben • Operator o: Alle Operatoren mit gleicher oder höherer Priorität vom Stapel ausgeben, bis ‘(‘ erreicht oder Stapel leer ist. Operator o auf Stapel legen • ‘)‘: Alle Operatoren vom Stapel bis zur ersten ‘(‘ ausgeben und diese löschen – Am Ende alle verbleibenden Operatoren vom Stapel ausgeben 25.10.2012 [email protected] 10 Stapel Anwendung • Algorithmus zur Auswertung eines Poshix‐ Ausdruckes: – Stapel anfangs leer, enthält während des Arbeitens nur Zahlen – Durchlaufe die Eingabeelemente von links nach rechts: • Zahl: Lege die Zahl auf den Stapel • Operator o: Wende den Operator o auf die beiden obersten Elemente des Stapels an; ersetze diese beiden Zahlen durch das Ergebnis – Am Ende steht der Wert des Ergebnisses als einziger Wert auf dem Stapel 25.10.2012 [email protected] 11 Elementare Datenstrukturen • Schlange (queue): – Erlaubt nur das Enhernen des zuerst eingefügten Elementes (FIFO‐Strategie: „first‐in first‐out“) – ImplementaMon mit einem linearen Feld Q[1..n]: 25.10.2012 [email protected] 12 Elementare Datenstrukturen • Schlange (queue): Einfügen: Entfernen: PUT(Q,x) 1: IF anz==n THEN „overflow“ 2: ELSE anz=anz+1 3: IF e<n THEN e=e+1 4: ELSE e=1 5: Q[e]=x GET(Q) 1: IF anz==0 THEN „underflow“ 2: ELSE anz=anz-1 3: x=Q[a] 4: IF a<n THEN a=a+1 5: ELSE a=1 6: RETURN x Alle OperaMonen benöMgen O(1) Zeit IniMalisierung mit e = 1 und a = 1. 25.10.2012 [email protected] 13 Elementare Datenstrukturen • Schlange (queue): Q 15 6 9 8 4 a anz = 5 e PUT(Q,17), PUT(Q,3), PUT(Q,5): Q 3 5 e 15 6 9 8 4 17 anz = 8 a GET(Q): (=15) Q 3 5 e 25.10.2012 6 9 8 4 17 anz = 7 a [email protected] 14 Rekursionen • Rekursion: Algorithmus ruW sich selbst auf • Viele Algorithmen können sowohl itera6v als auch rekursiv implemenMert werden f (n) = n!= n ⋅ (n − 1) ⋅ (n − 2) ⋅…⋅ 2 ⋅1 • Beispiel: Fakultät T(n) = O(n) S(n) = O(1) 25.10.2012 T(n) = O(n) S(n) = O(n) (entspricht Rekursionstiefe) [email protected] 15 Rekursionen • Beispiel: Fibonacci‐Zahlen f n = f n−1 + f n−2 , n ≥ 3; f1 = f 2 = 1 ⇒ 1, 1, 2, 3, 5, 8, 13, 21, … T(n) = O(n) S(n) = O(1) T(n) = Θ(cn) (exponentiell!) S(n) = O(n) (entspricht Rekursionstiefe) Rekursive Varianten sind oW einfacher zu implemenMeren, besitzen aber oW den größeren Laufzeit‐ und Speicherbedarf! 25.10.2012 [email protected] 16 Danke für Ihre Aufmerksamkeit! Bis zum nächsten Mal. (Donnerstag, 8. Nov. 2012, 11:15, i13) 25.10.2012 [email protected] 17