Ing Mathematik: Landau
Landau-Symbole werden in der Mathematik und Informatik verwendet, um das asymptotische Verhalten von Funktionen und Folgen zu beschreiben oder auch um das Zeitverhalten von Algorithmen abzuschätzen. Konkrete Laufzeitmessungen sind abhängig von der verwendeten Hardware. Um das auf abstrakterer Ebene durchzuführen verwendet man die Landau-Notation (auch O-Notation, auf englisch Big Oh Notation genannt). Eingeführt wurde das -Symbol durch den Zahlentheoretiker Paul Bachmann. Bekannt wurde diese Notation durch den Mathematiker Edmund Landau. Es gibt mehrere Landau-Symbole, von denen die Gebräuchlichsten im Nachfolgenden kurz vorgestellt werden.
-
Paul Gustav Heinrich Bachmann (deutscher Mathematiker, 1837-1920)
-
Edmund Georg Hermann Landau (deutscher Mathematiker, 1877-1938)
Das -Symbol
BearbeitenDie Definition bedeutet: für alle und ein .
Genaugenommen ist das Gleichheitssymbol bei nicht korrekt. Es müsste heißen . Aber in der Literatur ist meistens die Variante mit dem Gleichheitszeichen zu finden und das wird auch hier so gehandhabt. Dieses -Symbol ist das von den Landau-Symbolen am meisten verwendete.
Beispiel 1
BearbeitenGilt ?
Lösung:
Es muss gelten: , mit , d.h.,
Mit gilt für alle : , was zu zeigen war.
Nachfolgende Grafik zeigt obigen Sachverhalt für eine Konstante c=3.
Das zugehörige Python-Programm:
import matplotlib.pyplot as plt import numpy as np n = np.arange(0, 20, .1) f = 2**(n+1) g = 2**n c = 3 plt.plot(n, f, label = "f = 2**(n+1)", color="orange") plt.plot(n, c*g, label = "g = 2**n", color ="blue") plt.grid() plt.title("O-Notation") plt.xlabel("n") plt.ylabel("f,g") plt.legend(loc="best") plt.text(10,1e6,"mit c=3") plt.show()
Beispiel 2
BearbeitenGilt ?
Lösung:
Ja, denn gilt für alle und z.B. .
Das -Symbol
BearbeitenDie Definition bedeutet: für alle und ein .
Beispiel
BearbeitenGilt ?
Lösung:
Wir müssen zeigen, dass mit einem beliebigen , bspw. . Am einfachsten machen wir das mit einer vollständigen Induktion.
Induktionsanfang:
passt!
Induktionsschritt:
Die Induktionsvoraussetzung war aber, dass , somit gilt auch immer , was zu zeigen war. Es gilt somit .
Python-Code:
import matplotlib.pyplot as plt import numpy as np import scipy.special as scs n = np.arange(0.5, 5, 0.1) f = n**n g = scs.factorial(n) c = 1 plt.plot(n, f, label = "f = n**n", color="orange") plt.plot(n, c*g, label = "g = n!", color ="blue") plt.grid() plt.title("Omega-Notation") plt.xlabel("n") plt.ylabel("f,g") plt.legend(loc="best") plt.text(2,20,"mit c=1") plt.semilogy() plt.show()
Das -Symbol
BearbeitenDie Definition bedeutet: für alle und .
Hier gilt es zu zeigen, dass ab einem zwischen und liegt.
Aufgaben
Bearbeiten- Gilt ?
- Gilt ?
Rechnen mit der Landau-Notation
BearbeitenAddition
Bearbeiten
Beispiel:
Multiplikation
Bearbeiten
mit c > 0.
Beispiel:
Beispiel:
Grenzwertregeln
BearbeitenAb und zu finden sich auch folgende Regeln zur Definition von und .
Komplexitätsklassen
BearbeitenNachfolgend eine leicht überarbeitete Tabelle aus Wikipedia mit gebräuchlichen Komplexitätsklassen. Wenn Sie am Anfang nicht alles verstehen - kein Problem, die Tabelle geht schon sehr ins Detail und ist eher für Informatiker von Interesse.
Notation | Bedeutung | Anschauliche Erklärung | Beispiele für Laufzeiten |
---|---|---|---|
ist beschränkt. | überschreitet einen konstanten Wert nicht (ist unabhängig vom Wert des Arguments ). | Feststellen, ob eine Binärzahl gerade ist Nachschlagen des -ten Elementes in einem Feld in einer Registermaschine | |
wächst doppel-logarithmisch. | Bei Basis 2 erhöht sich um 1, wenn quadriert wird. | Interpolationssuche im sortierten Feld mit gleichförmig verteilten Einträgen | |
wächst logarithmisch. | wächst ungefähr um einen konstanten Betrag, wenn sich verdoppelt. Die Basis des Logarithmus ist dabei egal. |
Binäre Suche im sortierten Feld mit Einträgen | |
wächst wie die Wurzelfunktion. | wächst ungefähr auf das Doppelte, wenn sich vervierfacht. | Anzahl der Divisionen des naiven Primzahltests (Teilen durch jede ganze Zahl ) | |
wächst linear. | wächst ungefähr auf das Doppelte, wenn sich verdoppelt. | Suche im unsortierten Feld mit Einträgen (Bsp. Lineare Suche) | |
hat super-lineares Wachstum. | Vergleichbasierte Algorithmen zum Sortieren von Zahlen
Mergesort, Heapsort | ||
wächst quadratisch. | wächst ungefähr auf das Vierfache, wenn sich verdoppelt. | Einfache Algorithmen zum Sortieren von Zahlen
Selectionsort | |
wächst polynomiell. | wächst ungefähr auf das -Fache, wenn sich verdoppelt. | „Einfache“ Algorithmen | |
wächst exponentiell. | wächst ungefähr auf das Doppelte, wenn sich um 1 erhöht. | Erfüllbarkeitsproblem der Aussagenlogik (SAT) mittels erschöpfender Suche | |
wächst faktoriell. | wächst ungefähr auf das -Fache, wenn sich um 1 erhöht. | Problem des Handlungsreisenden (mit erschöpfender Suche) | |
wächst wie die modifizierte Ackermannfunktion. | Problem ist berechenbar, aber nicht notwendig primitiv-rekursiv |
Abschätzungen mit der Landau-Notation
BearbeitenMeist wird man an der worst-case-Laufzeit interessiert sein, d.h. die Abschätzungen erfolgen mit dem -Symbol, z.B.
n = 5 # O(1) m = 5 # O(1) for i in range(0, n, 1): # O(n) print("Hallo Welt") # O(1) print(m) # O(1) m += 1 # O(1) print("Ende") # O(1)
Es ergibt sich .
Dieses Beispiel ist von der Komplexitätsklasse . Auch wenn hier die print-Befehle sicher mehr Ressourcen verbrauchen wie einfache Zuweisungen, so wird dies bei der Auswertung mit der Landau-Notation vernachlässigt.