Gibt es eine Datenstruktur, um eine geordnete Liste zu führen, die die folgenden Operationen in Amortized Time unterstützt?
GetElement (k) : Liefert das te Element der Liste.
InsertAfter (x, y) : Fügt das neue Element y unmittelbar nach x in die Liste ein.
Löschen (x) : Entfernen Sie x aus der Liste.
Bei den letzten beiden Operationen können Sie davon ausgehen, dass x als Zeiger direkt in die Datenstruktur gegeben ist. InsertElement gibt den entsprechenden Zeiger für y zurück. InsertAfter (NULL, y) fügt y am Anfang der Liste ein.
Ausgehend von einer leeren Datenstruktur aktualisieren beispielsweise die folgenden Vorgänge die geordnete Liste wie folgt:
- InsertAfter (NULL, a) [a]
- InsertAfter (NULL, b) [b, a]
- InsertAfter (b, c) [b, c, a]
- InsertAfter (a, d) [b, c, a, d]
- Löschen (c) [b, a, d]
Nach diesen fünf Aktualisierungen sollte GetElement (2) d und GetElement (3) einen Fehler zurückgeben.
Antworten:
NEIN.
Fredman und Saks haben bewiesen, dass jede Datenstruktur, die diese Operationen unterstützt, mindestens Amortisationszeit pro Operation benötigtΩ ( logn / logLogn ) . (Dies ist Referenz [1] in dem Artikel von Dietz, den Sie in Ihrem ersten Kommentar erwähnt haben.) Die untere Schranke gilt für das sehr leistungsfähige Zellsondenmodell der Berechnung, bei dem nur die Anzahl der unterschiedlichen Speicheradressen berücksichtigt wird, auf die durch die Aktualisierung und Abfrage zugegriffen wird Algorithmen.
Ohne zusätzliche Annahmen zu den Aktualisierungs- und Abfragevorgängen ist die Datenstruktur von Dietz bestmöglich (zumindest bis zu konstanten Faktoren).
quelle
[1] Patrascu, Mihai und Erik D. Demaine. "Logarithmische untere Grenzen im Zell-Sonden-Modell". SIAM J. Comput. 35, nein. 4 (April 2006): 932–963. doi: 10.1137 / S0097539705447256.
quelle