Zeitliche Komplexität von Python-Set-Operationen?

79

Wie hoch ist die zeitliche Komplexität der einzelnen Python-Set-Operationen in Big O- Notation?

Ich verwende Pythons Set-Typ für eine Operation für eine große Anzahl von Elementen. Ich möchte wissen, wie sich die Größe des Satzes auf die Leistung der einzelnen Vorgänge auswirkt. Fügen Sie beispielsweise hinzu und testen Sie die Mitgliedschaft:

myset = set()
myset.add('foo')
'foo' in myset

Durch das Googeln wurden keine Ressourcen gefunden, aber es erscheint vernünftig, dass die zeitliche Komplexität für die Set-Implementierung von Python sorgfältig abgewogen worden wäre.

Wenn es vorhanden ist , wird ein Link zu so etwas wie das wäre toll. Wenn da draußen nichts dergleichen ist, können wir es vielleicht herausfinden?

Zusätzliche Punkte zum Ermitteln der zeitlichen Komplexität aller festgelegten Operationen.

Stephen Emslie
quelle
2
Während der Link von GWW sehr informativ ist, können Sie über die zeitliche Komplexität der Python-Sets nachdenken, indem Sie verstehen, dass es sich lediglich um Sonderfälle des Python-Wörterbuchs handelt (Schlüssel, aber keine Werte). Wenn Sie also die zeitliche Komplexität von Vorgängen auf einer Hash-Karte kennen, sind Sie ziemlich genau dort.
Wilduck

Antworten:

66

Laut Python-Wiki: Zeitkomplexität wird set als Hash-Tabelle implementiert . Sie können also erwarten, im O (1) -Durchschnitt nachzuschlagen / einzufügen / zu löschen . Wenn der Ladefaktor Ihrer Hash-Tabelle nicht zu hoch ist, treten Kollisionen und O (n) auf.

PS Aus irgendeinem Grund beanspruchen sie O (n) für einen Löschvorgang, der wie ein Fehlertyp aussieht.

PPS Dies gilt für CPython, Pypy ist eine andere Geschichte .

Sergey Romanovsky
quelle
Set in Python führt auch die automatische Sortierung durch. Denken Sie also, dass das Einfügen eines neuen Werts immer noch O (1) Zeitkomplexität ist
Naresh Thakur
3
@thakurinbox Könnten Sie Ihre Aussage mit einem Link unterstützen?
Sergey Romanovsky
5

Der Vorgang insollte unabhängig von der Größe des Behälters sein, d. H. O (1) - bei optimaler Hash-Funktion. Dies sollte für Python-Strings nahezu zutreffen. Das Hashing von Strings ist immer wichtig, Python sollte dort clever sein und daher können Sie nahezu optimale Ergebnisse erwarten.

Towi
quelle
2

Die anderen Antworten sprechen nicht von zwei entscheidenden Operationen an Mengen: Gewerkschaften und Kreuzungen. Im schlimmsten Fall nimmt die Vereinigung O (n + m) an, während die Kreuzung O (min (x, y)) annimmt, vorausgesetzt, es gibt nicht viele Elemente in den Mengen mit demselben Hash. Eine Liste der zeitlichen Komplexitäten gängiger Operationen finden Sie hier: https://wiki.python.org/moin/TimeComplexity

Fırat Kıyak
quelle