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.