Es gibt einen wohlbekannten Satz in der Komplexitätstheorie, der Hauptsatz genannt wird. Sein Fall sagt, dass, wenn die Komplexität T(n)
einen Algorithmus erfüllt die Gleichung
T(n) = a T(n/a) + b*n (1)
dann
T(n) = O (n log n) (2)
Die Gleichung (1) oben, als ob der Algorithmus funktioniert interpretiert werden kann, indem das Problem in a
Aufspalten Teile und wendet sich für jeden Teil separat und dann etwas Arbeit an der vollständigen Eingabe. Dieses algorithmische Muster wird manchmal Merge and Recombine genannt.
betrachte das folgende Beispiel in Python
def f(x):
if len(x) > 1:
x1 = [z for z in x[1:] if z <= x[0]]
x2 = [z for z in x[1:] if z > x[0]]
return f(x1) + [x[0]] + f(x2)
else:
return x
Diese Funktion implementiert einen rekursiven Algorithmus, der die Eingabeliste in zwei Teile aufspaltet und wendet sich unabhängig zu jedem Teil, die Ergebnisse dann verkettet. Wenn wir Glück haben und x
und y
Teile die gleiche Länge haben, dann kann die Komplexität des Algorithmus mit der Formel (2)
oben mit a = 2
berechnet werden.
Wenn Sie mit der Sortierung und der Python-Sprache vertraut sind, würden Sie hier einen Algorithmus erkennen, der Quicksort emuliert, jedoch ohne die Komplexität der Sortierung in Place. Ein etwas saubereres Beispiel ist Merge sort, das in der Antwort von Christos erwähnt wird.
Es ist nicht klar, was Sie fragen. Der Titel lautet "wie berechnet man, aber dann sagt man, dass man nach Beispielen sucht" und dann nach einem "zufrieden stellenden Beispiel oder einer Implementierung" fragt, wo man "Komplexität von O (n log n)" sehen kann. Die Funktionen f (n) = n log n, f (n) = n, f (n) = 1 sind alle O (n log n). Viele effiziente Sortieralgorithmen führen O (n log n) -Vergleiche durch. Was ist das spezifische Problem, das Sie haben? –
Ich lerne und habe diese Frage gepostet. Ich suchte nach weiteren Beispielen für O (n log n). Danke, ich habe meine Frage bearbeitet –