40 Algorithmen und Datenstrukturen 2 Wachstumsverhalten von Funktionen Beim Vergleich der Worst-Case-Laufzeiten von Algorithmen in Abhängigkeit von der Größe n der Eingabedaten ist oft nur deren Verhalten für große Werte von n von Interesse, also deren asymptotisches Verhalten. In diesem Kapitel werden Begriffe und Notation zur Beschreibung dieses asymptotischen Verhaltens eingeführt sowie einige Hilfsmittel für die asymptotische Analyse vorgestellt. 2 Wachstumsverhalten von Funktionen TU Bergakademie Freiberg, WS 2005/06 41 Algorithmen und Datenstrukturen 2.1 Asymptotische Notation Wir betrachten Funktionen f, g, . . . deren Definitionsbereich die natürlichen Zahlen (N oder N0 ) sind mit Werten in R (R+ ). 2.1.1 Die Θ-Notation Für eine gegebene Funktion g = g(n) ist Θ(g(n)) definiert als die Menge von Funktionen Θ(g(n)) := f (n) : es existieren positive Konstanten c1 , c2 sowie n0 , sodass 0 ≤ c1 g(n) ≤ f (n) ≤ c2 g(n) ∀n ≥ n0 Somit bezeichnet Θ(g(n)) alle Funktionen, deren asymptotisches Wachstumsverhalten bis auf multiplikative Konstanten gleich ist. 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 42 Algorithmen und Datenstrukturen Bemerkungen 2.1 1. Obgleich Θ(g(n)) eine Menge ist, wird Enthaltensein von f in Θ(g(n)) nicht durch f ∈ Θ(g(n)) sondern durch f = Θ(g(n)) ausgedrückt. Diese Abweichung von der üblichen Notation hat gewisse Vorteile. 2. Gemäß unserer Definition sind alle Funktionen in Θ(g(n)) asymptotisch nichtnegativ, d.h. f (n) ≥ 0 für alle hinreichend große n. Ferner muss g selbst asymptotisch nichtnegativ sein, da ansonsten die Menge leer wäre. Wir gehen daher bei unseren Betrachtungen stets von asymptotisch nichtnegativen Funktionen aus. 3. Für jedes Polynom p von exaktem Grad d ∈ N0 gilt p(n) = Θ(nd ). Für jede Konstante c ≥ 0 gilt c = Θ(n0 ) = Θ(1). 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 43 Algorithmen und Datenstrukturen Beispiel: Im vorigen Kapitel hatten wir informell die Θ-Notation so eingeführt, dass Terme niedriger Ordnung sowie multiplikative Konstanten einfach ignoriert werden. Wir überprüfen dieses Vorgehen und weisen anhand der Definition nach, dass 12 n2 − 3n = Θ(n2 ). Gesucht: c1 , c2 , n0 sodass c1 n2 ≤ 12 n2 − 3n ≤ c2 n2 ∀n ≥ n0 . Division durch n2 (n ≥ 1) führt auf c1 ≤ 1 3 − ≤ c2 2 n ∀n ≥ n0 , was z.B. für c1 = 1/14, c2 = 1/2 und n0 = 7 erfüllt ist. (Die genaue Wahl ist uninteressant, wesentlich ist nur die Existenz solcher Konstanten.) Übung: 6n3 6= Θ(n2 ) 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 44 Algorithmen und Datenstrukturen 2.1.2 Die O-Notation Die O-Notationa ist für den Fall, dass lediglich obere asymptotische Schranken vorliegen. Für eine gegebene Funktion g = g(n) ist O(g(n)) definiert als die Funktionenmenge O(g(n)) := f (n) : ∃ Konstanten c, n0 sodass 0 ≤ f (n) ≤ cg(n) ∀n ≥ n0 Klar: mengentheoretisch gilt Θ(g(n)) ⊂ O(g(n)), d.h. f = Θ(g(n)) impliziert f = O(g(n)). a gesprochen 2.1 Asymptotische Notation groß O von“ bzw. nur O von“ ” ” TU Bergakademie Freiberg, WS 2005/06 45 Algorithmen und Datenstrukturen Bemerkungen 2.2 1. O(g(n)) enthält auch alle Funktionen mit niedrigerer Wachstumsordnung als g. So liegt neben g1 (n) = an2 + bn + c auch die Funktion g2 (n) = an + b in O(n2 ). 2. In der (vor allem älteren) Literatur wird die O-Notation oft anstelle der Θ-Notation verwendet, hier soll O aber ausschließlich asymptotische obere Schranken beschreiben. 3. Wort-Case-Laufzeit von O(g(n)) impliziert Laufzeit in O(g(n)) für alle möglichen Eingaben. Worst-Case-Laufzeit von Θ(g(n)) heißt dagegen nicht notwendig Laufzeit von Θ(g(n)) für alle möglichen Eingaben. (Gegenbeispiel: Insertion-Sort, mit einer Worst-Case-Laufzeit von Θ(n2 ), aber einer Laufzeit von Θ(n) für bereits sortierte Eingabe.) 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 Algorithmen und Datenstrukturen 46 Beispiele: 2n2 = O(n3 ) mit c = 1 und n0 = 2. Weitere Funktionen in O(n2 ): n2 n2 + n n2 + 1000n 1000n2 + 1000n n n/1000 n1.9999 n2 / log log log n 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 47 Algorithmen und Datenstrukturen 2.1.3 Die Ω-Notation Analog der asymptotischen oberen Schranke bei der O-Notation bezeichnet die Ω-Notation eine asymptotische untere Schranke: Ω(g(n)) := f (n) : ∃ Konstanten c, n0 sodass 0 ≤ cg(n) ≤ f (n) ∀n ≥ n0 Gemäß der bisherigen Definitionen folgt sofort Satz 2.3 Für zwei Funktionen f und g gilt f (n) = Θ(g(n)) genau dann, wenn sowohl f (n) = O(g(n)) als auch f (n) = Ω(g(n)). 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 48 Algorithmen und Datenstrukturen Bemerkungen 2.4 1. Da die Ω-Notation eine untere asymptotische Schranke angibt, setzen wir sie zur Beschreibung der Best-Case-Laufzeit von Algorithmen ein. Eine Ω-Schranke für die Laufzeit im günstigsten Fall liefert eine entsprechende Laufzeit für alle möglichen Eingaben. Beispiel: Best-Case-Laufzeit von Insertion-Sort: Ω(n), damit ist die Laufzeit von Insertion-Sort Ω(n). 2. Laufzeit von Insertion-Sort somit zwischen Ω(n) und O(n2 ). Diese Schranken sind asymptotisch bestmöglich. 3. Man kann jedoch sagen: die Worst-Case-Laufzeit von Insertion-Sort ist Ω(n2 ), da für gewisse Eingaben die Laufzeit Ω(n2 ) ist. 4. Sprechweise Laufzeit eines Algorithmus ist Ω(g(n))“ bedeutet: egal ” welche Eingabe der Länge n, die Laufzeit ist mindestens Konstante ·g(n) für n hinreichend groß. 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 Algorithmen und Datenstrukturen 49 Beispiele: √ n = Ω(log2 n) mit c = 1 und n0 = 16. Weitere Funktionen in Ω(n2 ): n2 n2 + n n2 − n n2 + 1000n 1000n2 + 1000n 1000n2 − 1000n n3 n2.0001 n2 log log log n 2n 2 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 50 Algorithmen und Datenstrukturen 2.1.4 Asymptotische Notation in Gleichungen und Ungleichungen • Auf der rechten Seite einer (Un-)Gleichung: O(n2 ) steht für eine beliebige Funktion f ∈ O(n2 ). Beispiel: 2n2 + 3n + 1 = 2n2 + Θ(n) bedeutet 2n2 + 3n + 1 = 2n2 + f (n) mit f (n) ∈ Θ(n) (etwa f (n) = 3n + 1). • Auf der linken Seite einer (Un-)Gleichung: Egal wie die anonyme Funktion auf der linken Seite gewählt wird, es gibt stets eine Wahl einer Funktion auf der rechten Seite, damit die (UN-)Gleichung wahr ist. Beispiel: 2n2 + Θ(n) = Θ(n2 ) bedeutet, dass für alle Funktionen f ∈ Θ(n) eine Funktion g(n) ∈ Θ(n2 ) existiert mit 2n2 + f (n) = g(n). 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 51 Algorithmen und Datenstrukturen Verkettung: 2n2 + 3n + 1 = 2n2 + Θ(n) = Θ(n2 ) Interpretation: • Erste Gleichung: es existiert f (n) ∈ Θ(n) sodass 2n2 + 3n + 1 = 2n2 + f (n). • Zweite Gleichung: für jede Funktion g(n) ∈ Θ(n) (beispielsweise für die Funktion f (n) für welche die erste Gleichung gültig ist) existiert eine Funktion h(n) ∈ Θ(n2 ) sodass 2n2 + g(n) = h(n). 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 52 Algorithmen und Datenstrukturen 2.1.5 Die o-Notation Asymptotische obere Schranken ausgedrückt in O-Notation sind nicht notwendig asymptotisch scharf. Dies ist etwa für 2n2 = O(n2 ) der Fall, nicht aber für 2n = O(n2 ). Die o-Notation beschreibt obere Schranken, die nicht asymptotisch scharf sind. Wir definieren o(g(n)) ( klein O von g von n“) als die Menge ” o(g(n)) := f (n) : ∀ Konstanten c > 0, ∃n0 > 0 sodass 0 ≤ f (n) < cg(n) ∀n ≥ n0 Beispiel: 2n = o(n2 ), aber 2n2 6= o(n2 ). Intuitiv: für n hinreichend groß wird f (n) beliebig kleiner als g(n), oder f (n) = 0. n→∞ g(n) lim 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 Algorithmen und Datenstrukturen 53 Beispiele: n1.9999 = o(n2 ) n2 / log n = o(n2 ) n2 6= o(n2 ) n2 /1000 6= o(n2 ) 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 54 Algorithmen und Datenstrukturen 2.1.6 Die ω-Notation Beschreibt nicht asymptotisch scharfe untere Schranken: ω(g(n)) := f (n) : ∀ Konstanten c > 0, ∃n0 > 0 sodass 0 ≤ cg(n) < f (n) ∀n ≥ n0 So gilt etwa n2 /2 = ω(n), nicht aber n2 /2 6= ω(n2 ). Die Beziehung f (n) = ω(g(n)) impliziert f (n) lim = ∞, n→∞ g(n) d.h. f (n) wird, sofern n hinreichend groß, beliebig größer als g(n). Beispiele: n2.0001 = ω(n2 ), n2 log n = ω(n2 ), n2 6= ω(n2 ). 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 55 Algorithmen und Datenstrukturen 2.1.7 Vergleich von Funktionen Viele Relationen zwischen reellen Zahlen gelten auch für asymptotische Vergleiche. Zunächst kann man folgende Analogien/Entsprechungen ausmachen: O ≈ ≤ Ω ≈ ≥ Θ ≈ = o ≈ < ω ≈ >. Sprechweisen: f (n) asymptotisch kleiner“ als g(n) falls f (n) = o(g(n)) ” f (n) asymptotisch größer“ als g(n) falls f (n) = ω(g(n)). ” 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 56 Algorithmen und Datenstrukturen Relationseigenschaften: Transitivität f (n) = Θ(g(n)) und g(n) = Θ(h(n)) ⇒ f (n) = Θ(h(n)), analog für O, Ω, o, ω. Reflexivität f (n) = Θ(f (n)), analog für O, Ω. Symmetrie f (n) = Θ(g(n)) ⇔ g(n) = Θ(f (n)). Transponierte Symmetrie f (n) = O(g(n)) ⇔ g(n) = Ω(f (n)), f (n) = o(g(n)) ⇔ g(n) = ω(f (n)). 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 57 Algorithmen und Datenstrukturen Was nicht gilt: Trichotomie, d.h. für zwei reelle Zahlen a, b gilt stets eines von a < b, a = b oder a > b. Nicht alle Funktionen sind asymptotisch vergleichbar. Beispiel: Die Funktionen f (n) = n und g(n) = n1+sin n sind nicht asymptotisch vergleichbar, da der Wert des Exponenten 1 + sin n zwischen 0 und 2 oszilliert und alle dazwischenliegenden Werte annimmt. 2.1 Asymptotische Notation TU Bergakademie Freiberg, WS 2005/06 58 Algorithmen und Datenstrukturen 2.2 Bezeichnungen und Wissenswertes Monotonie • f ist monoton wachsend falls m ≤ n ⇒ f (m) ≤ f (n). • f ist monoton fallend falls m ≤ n ⇒ f (m) ≥ f (n). • f ist streng monoton wachsend falls m < n ⇒ f (m) < f (n). • f ist streng monoton fallend falls m < n ⇒ f (m) > f (n). 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 59 Algorithmen und Datenstrukturen 2.2.1 Floor- und Ceiling-Funktionen Für x ∈ R definieren wir die (monoton wachsenden) Funktionen bxc := max{z ∈ Z : z ≤ x}, dxe := min{z ∈ Z : z ≥ x}. • Für alle x ∈ R gilt x − 1 < bxc ≤ x ≤ dxe < x + 1. • Für alle z ∈ Z gilt bz/2c + dz/2e = z. • Für alle reellen x ≥ 0 und p, q ∈ Z gelten ddx/pe/qe = dx/(pq)e, bbx/pc/qc = bx/(pq)c, dp/qe ≤ (p + (q − 1))/q, bp/qc ≥ (p − (q − 1))/q. 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 60 Algorithmen und Datenstrukturen 2.2.2 Restklassenarithmetik Für z ∈ Z und n ∈ N wird die Zahl z mod n definiert als Divisionsrest des Quotienten z/n, d.h. z mod n = z − bz/ncn. Man sagt, zwei ganze Zahlen z1 , z2 seien kongruent modulo n (für ein n ∈ N) falls diese bei Division durch n denselben Rest liefern. Wir schreiben z1 ≡ z2 mod n falls z1 mod n = z2 mod n Äquivalent: z1 ≡ z2 mod n genau dann, wenn n die Zahl z2 − z1 teilt. Wir schreiben z1 6≡ z2 mod n falls z1 , z2 nicht kongruent modulo n. 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 61 Algorithmen und Datenstrukturen 2.2.3 Polynome Ein Polynom vom Grad d (d ∈ N0 ) ist ein Ausdruck der Form p(n) = d X aj nj . j=0 Die Konstanten {aj }dj=0 heißen Koeffizienten des Polynoms. Das Polynom p ist von exaktem Grad d, falls ad 6= 0 und ist in diesem Fall asymptotisch positiv genau dann, wenn ad > 0. Für ein asymptotisch positives Polynom p von exaktem Grad d gilt p(n) = Θ(nd ). Für jede reelle Zahl a ≥ 0 ist die Funktion na monoton wachsend, für jede reelle Zahl a ≤ 0 ist na monoton fallend. Wir nennen eine Funktion f polynomiell beschränkt, falls f (n) = O(nk ) für eine Konstante k. 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 62 Algorithmen und Datenstrukturen 2.2.4 Exponentialfunktionen Für alle n ∈ N0 und a ≥ 1 ist an eine monoton wachsende Funktion von n. Wir vereinbaren 00 := 1. Die Wachstumsraten von Polynomen und Exponentialfunktionen werden durch folgende Tatsache in Beziehung gesetzt: für alle reelle Konstanten a, b mit a > 1 gilt nb lim = 0, n→∞ an d.h. nb = o(an ). (2.1) Jede Exponentialfunktion zu einer Basis a > 1 wächst somit schneller als jedes Polynom. 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 63 Algorithmen und Datenstrukturen Die Exponentialfunktion ex besitzt die (auf ganz R konvergente) Potenzreihe ∞ X xk x2 x3 x =1+x+ + + ... . e = k! 2 3! k=0 Für alle x ∈ R gilt ex ≥ 1 + x mit Gleichheit genau für x = 0. Ferner gilt 1 + x ≤ ex ≤ 1 + x + x2 für alle |x| < 1. Für x → 0 ist die Approximation von ex durch 1 + x recht gut, es gilt ex = 1 + x + Θ(x2 ), wobei mit Θ(x2 ) hier die Asymptotik im Grenzwert x → 0 gemeint ist. Schließlich gilt für alle x ∈ R x n x e = lim 1 + . n→∞ n 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 64 Algorithmen und Datenstrukturen 2.2.5 Logarithmen Für alle reellen positiven Zahlen a, b, c und n ∈ N gelten a = blogb a , logc (ab) = logc a + logc b, logb an = n logb a, logb a = logc a , logc b 1 logb = − logb a, a 1 logb a = , loga b alogb c = clogb a . (In allen Gleichungen seien alle Basen 6= 1.) 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 65 Algorithmen und Datenstrukturen • logb n = loga n/ loga b, d.h. bei asymptotischen Betrachtungen (n → ∞) spielt Basis des Logarithmus keine Rolle. • Informatik: Basis 2 von besonderer Bedeutung, da viele Algorithmen und Datenstrukturen auf Zerlegung von Problemen in zwei gleich große Teilprobleme beruhen. Potenzreihe: x2 x3 x4 log(1 + x) = x − + − + −..., 2 3! 4! |x| < 1. Ferner gilt für x > −1 x ≤ log(1 + x) ≤ x 1+x mit Gleichheit nur für x = 0. 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 66 Algorithmen und Datenstrukturen Wir nennen eine Funktion f polylogarithmisch beschränkt, fallsa f (n) = O(logk n) für eine Konstante k. Der Vergleich zwischen den Wachstumsverhalten von Polynomen und Polylogarithmen ist gegeben durch (ersetze n durch log n in (2.1)) logk n logk n 0 = lim a log n = lim n→∞ (e ) n→∞ na und somit logk n = o(na ) für jede positive Konstante a. Somit wächst jede polylogarithmische Funktion langsamer als jedes positive Polynom. a Schreibweise: logk n := (log n)k 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 67 Algorithmen und Datenstrukturen 2.2.6 Fakultäten Die Funktion n! ( n Fakultät“) ist definiert als ” ( 1 falls n = 0, n! = n · (n − 1)!, falls n > 0. M.a.W. : n! = 1 · 2 · 3 · . . . · n. Eine offensichtliche obere Schranke für n! ist n! ≤ nn . Eine asymptotisch exakte Schranke liefert die Stirlingsche Approximation n n √ 1 n! = 2πn . 1+Θ e n Ferner gelten die asymptotischen Aussagen n! = o(nn ), 2.2 Bezeichnungen und Wissenswertes n! = ω(2n ), log(n!) = Θ(n log n). TU Bergakademie Freiberg, WS 2005/06 68 Algorithmen und Datenstrukturen Schließlich gilt für alle n ≥ 1 n n √ n! = 2πn eαn e 2.2 Bezeichnungen und Wissenswertes mit 1 1 < αn < . 12n + 1 12n TU Bergakademie Freiberg, WS 2005/06 69 Algorithmen und Datenstrukturen 2.2.7 Iteration von Funktionen Mit f (i) (n) bezeichnen die i-malige Anwendung der Funktion f auf das Argument n: f (i) (n) = ( n f (f (i−1) (n)) falls i = 0, falls i > 0. Beispiel: für f (n) = 2n erhalten wir f (i) (n) = 2i n. 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 70 Algorithmen und Datenstrukturen 2.2.8 Der iterierte Logarithmus Mit log∗ n ( log Stern von n“) bezeichnen wir den iterierten Logarithmus, ” der wie folgt definiert ist: Sei log(i) n wie oben definiert mit f (n) = log n. Da Logarithmen nur für positive Argumente definiert sind, setzen wir log∗ n := min{i ≥ 0 : log(i) n ≤ 1}. Beispiele: log∗2 2 = 1, log∗2 4 = 2, log∗2 16 = 3, log∗2 65536 = 4, log∗2 (265536 ) = 5. 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 71 Algorithmen und Datenstrukturen An diesen Beispielen erkennt man, dass der iterierte Logarithmus extrem langsam anwächst. Da die Anzahl der Atome im beobachtbaren Universum auf etwa 280 geschätzt wird, eine Zahl die wesentlich kleiner ist als 265536 , sind Eingabegrößen n mit log∗ n > 5 eher selten zu erwarten. 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 72 Algorithmen und Datenstrukturen 2.2.9 Fibonacci-Zahlen Die Fibonacci-Zahlen sind definiert durch die Rekursion i = 0, 0 Fi = 1 i = 1, F + F , (i ≥ 2). i−1 i−2 Ab i = 2 ist also jede Fibonacci-Zahl die Summe ihrer beiden Vorgänger, wir erhalten die Folge 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, . . . . 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06 73 Algorithmen und Datenstrukturen Fibonacci-Zahlen sind verwandt mit dem goldenen Schnitt φ und dessen negativen Kehrwert φb gegeben durch √ 1+ 5 φ= ≈ 1.61803 . . . , 2√ 1− 5 φb = ≈ −0.61803 . . . . 2 Genauer: φi − φbi Fi = √ . 5 √ √ i b b Wegen |φ| < 1 folgt |φ |/ 5 < 1/ 5 < 1/2. Somit ist Fi gegeben durch √ φi / 5 gerundet zur nächsten ganzen Zahl. Insbesondere wachsen die Fibonacci-Zahlen exponentiell. 2.2 Bezeichnungen und Wissenswertes TU Bergakademie Freiberg, WS 2005/06