Aufwand Aufwand Gliederung Algorithmen und Datenstrukturen I Aspekte von Algorithmen: Aufwand 1 D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Aufwand Einleitung O-Notation Listenfunktionen c Winter 2009/10, 26. Oktober 2009, 2009/10 D.Rösner D. Rösner AuD I 2009/10 . . . Aufwand 1 Einleitung O-Notation Listenfunktionen D. Rösner AuD I 2009/10 . . . Aufwand Aufwandbetrachtungen: 2 Einleitung O-Notation Listenfunktionen Beispiel: Berechnung der Fibonacci-Zahlen für ein Problem gibt es oft unterschiedlich aufwendige Lösungen Beispiel: Fibonacci-Zahlen die Definition der Fibonacci-Zahlen lässt sich direkt in einen rekursiven Algorithmus umsetzen die Folge der Fibonacci-Zahlen ist definiert durch: Anfangswerte: in Haskell: Variante mit Pattern matching fib :: Int -> Int fib0 = 1, fib1 = 1 für alle anderen Werte (d.h. für n ≥ 2) gilt die folgende rekursive Definition: fib 0 = 1 fib 1 = 1 fib n = fib (n - 1) + fib (n - 2) fibn = fibn−1 + fibn−2 die Fibonacci-Zahlen wurden von Leonardo von Pisa (ca. 1170 – 1250; genannt Fibonacci) entwickelt, um u.a. die Vermehrung von Kaninchen-Populationen zu beschreiben D. Rösner AuD I 2009/10 . . . 4 D. Rösner AuD I 2009/10 . . . 5 Aufwand Einleitung O-Notation Listenfunktionen Aufwand Beispiel: Berechnung der Fibonacci-Zahlen Beispiel: Berechnung der Fibonacci-Zahlen die direkte Umsetzung der Definition erfordert einen Aufwand, der exponentiell in Abhängigkeit von n anwächst dies ergibt sich aus folgender Abschätzung nach unten für den mindestens erforderlichen Aufwand (hier gemessen in Anzahl von Funktionsaufrufen): die Werte in der Folge wachsen sehr schnell an so ergeben sich die ersten 30 Fibonacci-Zahlen als Main> take 30 [(n, fib n)| n <- [0 ..]] [(0,1),(1,1),(2,2),(3,3),(4,5),(5,8),(6,13),(7,21), (8,34),(9,55),(10,89),(11,144),(12,233),(13,377), (14,610),(15,987),(16,1597),(17,2584),(18,4181), (19,6765),(20,10946),(21,17711),(22,28657), (23,46368),(24,75025),(25,121393),(26,196418), (27,317811),(28,514229),(29,832040)] D. Rösner AuD I 2009/10 . . . Aufwand Einleitung O-Notation Listenfunktionen wegen fib n = fib (n - 1) + fib (n - 2) : aufwand(fib n) ≥ 2 * aufwand(fib (n - 2)) ≥ 2 * 2 * aufwand(fib (n - 4)) ... für n gerade: ≥ 2(n/2−1) * aufwand(fib 2) = 2n/2 analog für n ungerade: ≥ 2(n−1)/2−1 * aufwand(fib 3) ≥ 2(n−1)/2 D. Rösner AuD I 2009/10 . . . 6 Einleitung O-Notation Listenfunktionen Aufwand Beispiel: Berechnung der Fibonacci-Zahlen 7 Einleitung O-Notation Listenfunktionen Vergleich von Funktionen asymptotischer Vergleich von Funktionen zusammengefasst: O (sprich: gross-0) Aufwand für Berechnung von fib n (hier gemessen in Anzahl von Funktionsaufrufen) wächst in Abhängigkeit von n mindestens so stark wie 2(n−1)/2 für “asymptotisch kleiner als oder gleich“ im Kontrast dazu ist der Aufwand für die Berechnung von fastFib n (vgl. letzte Vorlesung und [Tho99], pp. 75) nur eine lineare Funktion von n Definition (vgl. [GT01], 3.6): D. Rösner AuD I 2009/10 . . . Seien im folgenden f und g Funktionen von den natürlichen Zahlen in die nichtnegativen reellen Zahlen. f(n) ist O(g(n)) wenn es eine reelle Konstante c > 0 und eine natürliche Zahl n0 ≥ 1 gibt, so dass f(n) ≤ c g(n) für alle n ≥ n0 8 D. Rösner AuD I 2009/10 . . . 10 Aufwand Einleitung O-Notation Listenfunktionen Aufwand Vergleich von Funktionen Einleitung O-Notation Listenfunktionen Vergleich von Funktionen Θ (sprich: gross-Theta) Ω (sprich: gross-0mega) für “asymptotisch gleich“ für “asymptotisch grösser als oder gleich“ Definition (vgl. [GT01], 3.6): Definition (vgl. [GT01], 3.6): f(n) ist Θ(g(n)) wenn f(n) ist Ω(g(n)) wenn g(n) ist O(f(n)) d.h. es gibt eine reelle Konstante c > 0 und eine natürliche Zahl n0 ≥ 1, so dass f(n) ≥ c g(n) für alle n ≥ n0 D. Rösner AuD I 2009/10 . . . Aufwand f(n) ist O(g(n)) und f(n) ist Ω(g(n)) m.a.W. es gibt reelle Konstanten c > 0 und d > 0 und eine natürliche Zahl n0 ≥ 1, so dass c g(n) ≤ f(n) ≤ d g(n) für alle n ≥ n0 11 Einleitung O-Notation Listenfunktionen Aufwand Vergleich von Funktionen 12 Einleitung O-Notation Listenfunktionen Vergleich von Funktionen Beispiele (vgl. [GT01], 3.6): Beispiele (vgl. [GT01], 3.6): 20 n3 + 10 n log n + 5 ist O(n3 ) jedes Polynom ak nk + ak −1 nk −1 + . . . + a0 ist O(nk ) Begründung: 3 log n + log log n ist O(log n) Begründung: für n ≥ 1 : log n < n n log n < n2 ≤ n3 10 n log n ≤ 10 n3 Damit: 20 n3 + 10 n log n + 5 ≤ 35 n3 D. Rösner AuD I 2009/10 . . . D. Rösner AuD I 2009/10 . . . für n ≥ 2 : log log n ≤ log n Damit: 3 log n + log log n ≤ 4 log n für n ≥ 2 13 D. Rösner AuD I 2009/10 . . . 14 Aufwand Einleitung O-Notation Listenfunktionen Aufwand Aufwand bei Listenfunktionen Einleitung O-Notation Listenfunktionen Aufwand bei Listenfunktionen Test, ob ein Element in einer Liste der Länge n enthalten Zugriff auf das erste Listenelement (den Listenkopf) im Prelude definiert als: head head (x:_) elem elem _ [] elem y (x:xs) :: [a] -> a schlechtester Fall (sog. “worst case“): y ist überhaupt nicht in der Liste enthalten (oder als letztes Element) der Aufwand ist unabhängig von der Länge der Liste konstant, d.h. O(1) D. Rösner AuD I 2009/10 . . . Aufwand (hier z.B. Zahl der rekursiven Aufrufe und der Tests auf Gleichheit) ist linear bezogen auf n, d.h. O(n) 16 D. Rösner AuD I 2009/10 . . . Einleitung O-Notation Listenfunktionen Aufwand Aufwand bei Listenfunktionen 17 Einleitung O-Notation Listenfunktionen Literatur: I Schnittbildung zweier Listen, d.h. Bestimmung derjenigen Elemente, die in beiden Listen enthalten intersect intersect _ [] intersect [] _ intersect (x:xs) y = False = if y == x then True else elem y xs günstigster Fall: y ist gleich dem ersten Listenelement = x Aufwand :: a -> [a] -> Bool Michael T. Goodrich and Roberto Tamassia. Data Structures and Algorithms in Java. John Wiley & Sons, New York, 2001. ISBN 0-471-38367-8; 2nd edition. :: [a] -> [a] -> [a] = [] = [] = if elem x y then x:(intersect xs y) else (intersect xs y) Simon Thompson. Haskell - The Craft of Functional Programming. Addison Wesley Longman Ltd., Essex, 1999. 2nd edition, ISBN 0-201-34275-8; Accompanying Web site: http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e. schlechtester Fall: die Listen haben keine gemeinsamen Elemente mit m = length (x:xs) und n = length y ergeben sich m mal n Tests auf Enthaltensein m.a.W.: Aufwand ist quadratisch, d.h. O(n2 ) D. Rösner AuD I 2009/10 . . . 18 D. Rösner AuD I 2009/10 . . . 19