Womit ich eine Struktur meine mit:
- O (log n) Komplexität für
x.push()
Operationen - O (log n) Komplexität, um ein Element zu finden
- O (n) zu berechnende Komplexität,
list(x)
die sortiert wird
Ich hatte auch eine verwandte Frage zur Leistung, list(...).insert(...)
die jetzt hier ist .
memcpy
ist immer noch eine O (n) -Operation. Ich bin nicht sicher, wie Python Listen genau implementiert , aber ich wette, dass sie im zusammenhängenden Speicher gespeichert werden (sicherlich nicht als verknüpfte Liste). Wenn dies tatsächlich der Fall ist, hat die Einfügung, mitbisect
der Sie demonstrieren, die Komplexität O (n) .Antworten:
Die Standard-Python-Liste ist in keiner Form sortiert. Das Standard- Heapq- Modul kann verwendet werden, um O (log n) an eine vorhandene Liste anzuhängen und die kleinste in O (log n) zu entfernen, ist jedoch keine sortierte Liste in Ihrer Definition.
Es gibt verschiedene Implementierungen von ausgeglichenen Bäumen für Python, die Ihren Anforderungen entsprechen, z. B. rbtree , RBTree oder pyavl .
quelle
Gibt es einen bestimmten Grund für Ihre Big-O-Anforderungen? Oder willst du nur, dass es schnell geht? Das Sortedcontainer- Modul ist rein Python und schnell (wie bei Fast-as-C-Implementierungen wie blist und rbtree).
Der Leistungsvergleich zeigt, dass die Benchmarks schneller oder gleich dem sortierten Listentyp von blist sind. Beachten Sie auch, dass rbtree, RBTree und PyAVL sortierte Diktat- und Set-Typen bereitstellen, jedoch keinen sortierten Listentyp haben.
Wenn Leistung eine Voraussetzung ist, denken Sie immer an einen Benchmark. Ein Modul, das die Behauptung begründet, mit Big-O-Notation schnell zu sein, sollte verdächtig sein, bis es auch Benchmark-Vergleiche zeigt.
Haftungsausschluss: Ich bin der Autor des Python sortedcontainers-Moduls.
Installation:
Verwendung:
quelle
0.0845024989976
für SortedList.add () vs0.596589182518
für bisect.insort (), also einen Geschwindigkeitsunterschied von 7x! Und ich erwarte, dass die Geschwindigkeitslücke mit der Listenlänge zunimmt, da die Sortiereinfügungssortierung für sortierte Container in O (log n) funktioniert, während bisect.insort () in O (n).O(n)
Obwohl ich die "großen O" -Geschwindigkeiten grundlegender Python-Listenoperationen noch nie überprüft habe, ist das
bisect
Standardmodul in diesem Zusammenhang wahrscheinlich auch erwähnenswert:PS. Ah, sorry,
bisect
wird in der genannten Frage erwähnt. Trotzdem denke ich, dass es nicht viel schaden wird, wenn diese Informationen hier sein werden.PPS. Und CPython-Listen sind eigentlich Arrays (nicht etwa Skiplists oder so). Nun, ich denke, sie müssen etwas Einfaches sein, aber für mich ist der Name ein bisschen irreführend.
Wenn ich mich nicht irre, wären die Halbierungs- / Listengeschwindigkeiten wahrscheinlich:
Upd. Lassen Sie mich nach einer Diskussion in den Kommentaren hier die folgenden SO-Fragen verknüpfen: Wie wird die Python-Liste implementiert und wie hoch ist die Laufzeitkomplexität der Python- Listenfunktionen ?
quelle
quelle
Obwohl es (noch) keine benutzerdefinierte Suchfunktion bietet, kann das
heapq
Modul Ihren Anforderungen entsprechen. Es implementiert eine Heap-Warteschlange mithilfe einer regulären Liste. Sie müssten Ihren eigenen effizienten Mitgliedschaftstest schreiben, der die interne Struktur der Warteschlange nutzt (dies kann in O (log n) erfolgen , würde ich sagen ...). Es gibt einen Nachteil: Das Extrahieren einer sortierten Liste hat die Komplexität O (n log n) .quelle
Ich würde die
biscect
odersortedcontainers
Module verwenden. Ich bin nicht wirklich erfahren, aber ich denke, dasheapq
Modul funktioniert. Es enthält aHeap Queue
quelle
Es ist möglicherweise nicht schwierig, eine eigene Sortierliste in Python zu implementieren. Unten finden Sie einen Proof of Concept:
========= Ergebnisse ============
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 101]
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 99, 101]
101
3
50
quelle