Double Linked List
Statt eines großen Speicherebereichs in dem sich die Pointer auf die Elemente/Objekte hintereinander befinden (so wie das List macht) wird eine Kette benutzt und die Speicherbereiche der Pointer können irgendwo im Speicher liegen.
Neben dem Pointer auf das eigentliche Objekt wird ein Pointer auf das Element vor dem jeweiligen in der „Liste“ und einer auf das nächste Element in der „Liste“ gespeichert.
Dadurch kann von einem Eintrag aus problemlos zum vorhergehenden oder nachfolgenden gesprungen werden.
Praktisch stimmt das obige wohl nur in der Theorie, in der Praxis (CPython) reserviert Python Speicherblöcke und speichert darin immer einen Satz von Pointern. Ist der Block voll alloziert es den nächsten Speicherblock und verweist zwischen diesen Speicherblöcken per Double Links aufeinander, aber nicht innerhalb des Blocks.
Das heißt in CPython ist deque eigentlich ein Hybrid aus Liste und double linked list.
Vorteile (gegenüber List):
Einfügeoperation (insert) sind schneller (O(1) vs (O(n))
da bei List die Pointer alle nacheinander liegen müssen beim Einfügen alle nachfolgenden Pointer um 1 nach Rechts verschoben werden im Speicher
deque hingegen kann einfach beim vorhergehenden Element den Nachfolge-Pointer und beim nachfolgenden Element den Vorgänger-Pointer auf das neu eingefügte Element ändern
remove-Operationen sind schneller (O(1) vs O(1)), Grund siehe bei Einfügeoperationen
append und pop können schneller sein
Speicher in CPython ist in Blöcken organisiert → es wird immer eine bestimmte Anzahl Blöck für eine Datenstruktur reserviert
Lists benötigen zusammenhängende Blöcke (da die Daten hintereinander weg abgelegt werden)
Deque benutzt ebenfalls Blöcke in denen Daten hintereinander abgelegt sind
aber die Blöcke untereinander verweisen per Double Links (jeder Block kennt seinen Vorgänger und seinen Nachfolger) aufeinander → die Blöcke müssen also nicht hintereinander im Speicher liegen
die Daten müssen nicht kopiert werden, es werden einfach weitere Blöcke reserviert
geringere Speicher-Fragmentierung/weniger Speicherbedarf?
Listen benötigen zusammenhängende Speicherbereiche, deque kann verteilte Blöcke nutzen
wenn die Liste also groß ist und das Programm eine Weile läuft ist der Speicher vermutlich fragmentiert, es gibt in CPython wenig zusammenhängende große Speicherbereiche, das heißt es muss neuer Speicherbereich vom System genommen werden
deque kann vermutlich einfach verteilte Blöcke die frei sind wieder recyclen → der Gesamtspeicherbedarf steigt nicht
Nachteile (gegenüber List):