Was ist über Datenstrukturen bekannt, die eine Abfolge von Elementen verwalten können, die den folgenden beiden Operationen unterliegen?
- Drücken Sie (x): Fügen Sie x am Ende der Sequenz hinzu und geben Sie einen Bezeichner für die Position in der Sequenz zurück
- Extrakt (S): Bei einem ungeordneten Satz von Bezeichnern entfernen Sie die Elemente an diesen Positionen aus der Sequenz und geben eine Liste der entfernten Elemente in der Sequenzreihenfolge zurück
Wenn Sie möchten, können Sie sich dies als einen Stapel oder eine Warteschlange mit einer Aufteilungsoperation vorstellen, die ihn in zwei Stapel aufteilt: Die Extraktionsoperation kann verwendet werden, um eine Pop- oder Dequeue-Operation zu implementieren, und die extrahierte Sequenz von Elementen könnte auch abgelegt werden zurück in einen anderen Stapel oder eine andere Warteschlange.
Was ich bereits weiß: Man kann die Sequenz als doppelt verknüpfte Liste verwalten, wobei jeder Bezeichner nur ein Zeiger auf einen Knoten mit verknüpfter Liste ist und jeder Knoten auch eine Positionsnummer speichert, die einen schnellen Vergleich zwischen den Positionen zweier nicht miteinander verbundener Elemente ermöglicht in der Reihenfolge. Es ist nicht schwierig, die Positionsnummern im Verlauf der Datenstruktur so zu aktualisieren, dass sie alle positive ganze Zahlen mit dem Maximalwert , wobei die aktuelle Anzahl der Elemente in der Liste ist. Bei dieser Datenstruktur besteht der einzige schwierige Teil einer Extraktionsoperation darin, die extrahierten Elemente nach ihren Positionsnummern zu sortieren. Eine Extraktion von Elementen dauertn k O ( k √ erwartete zufällige Zeit unter Verwendung des Ganzzahl-Sortieralgorithmus von Han und Thorup von FOCS 2002, und eine Push-Operation benötigt konstante Zeit.
Was ich nicht weiß: Ist es möglich, Extrakt in -Zeit zu verarbeiten und konstante Zeit einzugeben? Gibt es Literatur zu diesem Problem? Ist es so schwer wie eine Ganzzahlensortierung?
Motivation: Dies ist der grundlegende Schritt, der erforderlich ist, um die Elemente im Coffman-Graham-Planungsalgorithmus zu ordnen, der auch Anwendungen für das Zeichnen von Diagrammen bietet. Der schwierige Teil von Coffman-Graham ist eine lexikografische topologische Anordnung. Dies kann durchgeführt werden, indem für jeden unterschiedlichen Grad eine Folge der Eckpunkte mit demjenigen Grad in dem Teilgraphen beibehalten wird, der durch die verbleibenden Eckpunkte induziert wird. Entfernen Sie dann wiederholt den ersten Scheitelpunkt aus der Folge der Scheitelpunkte mit dem Grad Null und fügen Sie ihn der topologischen Reihenfolge hinzu. extrahieren sie die nachbarn von aus den graden, zu denen sie vorher gehörten und schieben sie sie für den nächst kleineren grad auf die folge. Also einv O ( k ) Die Zeit für die Extraktionsoperationen in dieser Datenstruktur würde zu einer linearen Zeitimplementierung des Coffman-Graham-Algorithmus führen.
Seitdem ich dies ursprünglich gefragt habe, habe ich einen Artikel von Sethi aus dem Jahr 1976 gefunden , der es ermöglicht, den Coffman-Graham-Algorithmus in linearer Zeit zu implementieren, und ihn in meinen Wikipedia-Artikel über den Coffman-Graham-Algorithmus aufgenommen , sodass die ursprüngliche Motivation weniger aussagekräftig ist. Ich bin immer noch gespannt, wie die Antwort lautet.