O (n), weil die Liste Umwandeln einzustellen O (n) Zeit ist, Einsteigen Schnitt O (n) Zeit und Len ist O (n)Warum ist dieser o (n) Drei-Wege-Disjunktion Algorithmus langsamer als dann o (n^3) Version?
def disjoint3c(A, B, C):
"""Return True if there is no element common to all three lists."""
return len(set(A) & set(B) & set(C)) == 0
oder in ähnlicher Weise, sollte klar O (N) ist,
def set_disjoint_medium (a, b, c):
a, b, c = set(a), set(b), set(c)
for elem in a:
if elem in b and elem in c:
return False
return True
doch ist diese O (n^3) Code:
def set_disjoint_slowest (a, b, c):
for e1 in a:
for e2 in b:
for e3 in c:
if e1 == e2 == e3:
return False
return True
läuft schneller
Zeit sehen, wo Algorithmus eins ist das n^3, und Algorithmus drei ist der O (n) gesetzt Code ... Algorithmus zwei ist eigentlich n^2, wo wir Algorithmus eins optimieren durch Prüfung auf Disjunktheit vor der dritten Schleife startet
Size Input (n): 10000
Algorithm One: 0.014993906021118164
Algorithm Two: 0.013481855392456055
Algorithm Three: 0.01955580711364746
Size Input (n): 100000
Algorithm One: 0.15916991233825684
Algorithm Two: 0.1279449462890625
Algorithm Three: 0.18677806854248047
Size Input (n): 1000000
Algorithm One: 1.581618070602417
Algorithm Two: 1.146049976348877
Algorithm Three: 1.8179030418395996
Sie müssen etwas über die Eingänge sagen, die Sie zum Testen verwenden. Das Timing kann bei diesen Algorithmen sehr unterschiedlich sein, je nachdem, wie viele Elemente die Eingänge gemeinsam haben. BTW, 'len (set)' in Python ist 'O (1)'. –
O (n) ist nur garantiert schneller als O (n^3) in der Grenze von großen n. Zum Beispiel ist 4000 * n + log (n) O (n), ist aber größer (oder langsamer) als 2 * n^3, was O (n^3) für n = 5 ist. – Julien
Beachten Sie, dass die Big-Oh-Notation nicht immer die Leistung diktiert. In Python ist das Iterieren über Listen sehr schnell, set/dict lookup etwas langsamer (Hashtabellen). Dann haben Sie den Aufwand, eine Liste in ein Set zu konvertieren. – TaipanRex