Ing Mathematik: Landau

Aus Wikibooks


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.

Wikipedia hat einen Artikel zum Thema:


Das -Symbol[Bearbeiten]

Die 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[Bearbeiten]

Gilt ?

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[Bearbeiten]

Gilt ?

Lösung:

Ja, denn gilt für alle und z.B. .

Das -Symbol[Bearbeiten]

Die Definition bedeutet: für alle und ein .

Beispiel[Bearbeiten]

Gilt ?

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[Bearbeiten]

Die 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[Bearbeiten]

Addition[Bearbeiten]

Beispiel:

Multiplikation[Bearbeiten]

mit c > 0.

Beispiel:


Beispiel:

Grenzwertregeln[Bearbeiten]

Ab und zu finden sich auch folgende Regeln zur Definition von und .

Komplexitätsklassen[Bearbeiten]

Nachfolgend 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.

Wikipedia hat einen Artikel zum Thema:


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[Bearbeiten]

Meist 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.