Ich habe Leute sagen sehen, dass set
Objekte in Python eine O (1) -Mitgliedschaftsprüfung haben. Wie werden sie intern implementiert, um dies zu ermöglichen? Welche Art von Datenstruktur wird verwendet? Welche weiteren Auswirkungen hat diese Implementierung?
Jede Antwort hier war wirklich aufschlussreich, aber ich kann nur eine akzeptieren, also werde ich mit der nächsten Antwort auf meine ursprüngliche Frage fortfahren. Vielen Dank für die Info!
quelle
set
Implementierung tatsächlich wardict
mit Dummy - Werten, und es wurde später optimiert.Wenn Leute sagen, dass Sets eine O (1) -Mitgliedschaftsprüfung haben, sprechen sie über den Durchschnittsfall . Im schlimmsten Fall (wenn alle Hash-Werte kollidieren) ist die Überprüfung der Mitgliedschaft O (n). Informationen zur zeitlichen Komplexität finden Sie im Python-Wiki .
Der Wikipedia-Artikel besagt, dass die beste Zeitkomplexität für eine Hash-Tabelle, deren Größe nicht geändert wird, ist
O(1 + k/n)
. Dieses Ergebnis gilt nicht direkt für Python-Sets, da Python-Sets eine Hash-Tabelle verwenden, deren Größe geändert wird.Ein wenig weiter im Wikipedia-Artikel heißt es, dass für den Durchschnittsfall und unter der Annahme einer einfachen einheitlichen Hashing-Funktion die zeitliche Komplexität dort ist
O(1/(1-k/n))
, wok/n
sie durch eine Konstante begrenzt werden kannc<1
.Big-O bezieht sich nur auf asymptotisches Verhalten als n → ∞. Da k / n durch eine Konstante begrenzt werden kann, ist c <1, unabhängig von n ,
O(1/(1-k/n))
ist nicht größer alsO(1/(1-c))
das entsprichtO(constant)
=O(1)
.Unter der Annahme eines einheitlichen einfachen Hashing ist die Überprüfung der Mitgliedschaft für Python-Sets im Durchschnitt
O(1)
.quelle
Ich denke, es ist ein häufiger Fehler,
set
Lookup (oder Hashtable für diese Angelegenheit) sind nicht O (1).aus der Wikipedia
Verwandte: Ist eine Java-Hashmap wirklich O (1)?
quelle
Wir haben alle einen einfachen Zugang zur Quelle , wo der vorhergehende Kommentar
set_lookkey()
lautet:quelle
Um den Unterschied zwischen
set's
und etwas stärker hervorzuhebendict's
, hier ein Auszug aus densetobject.c
Kommentaren, in denen der Hauptunterschied zwischen Sätzen und Diktaten verdeutlicht wird.Quelle auf Github
quelle