Diese Frage ist von einer bestehenden Frage inspiriert, ob ein Stapel mit zwei Warteschlangen in amortisierter -Zeit pro Stapeloperation simuliert werden kann . Die Antwort scheint unbekannt zu sein. Hier ist eine spezifischere Frage, die dem Sonderfall entspricht, in dem alle PUSH-Operationen zuerst ausgeführt werden, gefolgt von allen POP-Operationen. Wie effizient kann eine Liste von N Elementen unter Verwendung von zwei anfänglich leeren Warteschlangen umgekehrt werden? Die rechtlichen Operationen sind:
- Das nächste Element aus der Eingabeliste in die Warteschlange einreihen (bis zum Ende einer der Warteschlangen).
- Das Element am Anfang einer der beiden Warteschlangen aus der Warteschlange entfernen und erneut in die Warteschlange einreihen (bis zum Ende einer der beiden Warteschlangen).
- Löscht das Element am Anfang einer der Warteschlangen und fügt es der Ausgabeliste hinzu.
Wenn die Eingangsliste besteht aus Elementen , wie funktioniert die minimale Anzahl von Operationen erforderlich , um die umgekehrte Ausgabeliste zu erzeugen [ N , N - 1 , . . . , 2 , 1 ] sich verhalten? Ein Beweis, dass es schneller wächst als O ( N ), wäre besonders interessant, da es die ursprüngliche Frage verneinen würde.
Update (15. Januar 2011): Das Problem kann in gelöst werden , wie in den eingereichten Antworten und ihren Kommentaren gezeigt; und eine Untergrenze von Ω ( N ) ist trivial. Kann eine dieser Grenzen verbessert werden?
Antworten:
Wenn N eine Zweierpotenz ist, glaube ich, dass O (N log N) -Operationen auch für ein etwas eingeschränkteres Problem ausreichen, bei dem alle Elemente in einer der Warteschlangen beginnen und in umgekehrter Reihenfolge in einer der Warteschlangen (ohne) enden müssen die Eingabe- und Ausgabelisten).
In O (N) Schritten ist es möglich, mit allen Elementen in einer Warteschlange zu beginnen, "eins für Sie eins für mich" zu spielen, um sie in abwechselnde Untergruppen in der anderen Warteschlange aufzuteilen und sie dann alle wieder in eine Warteschlange zu verketten. In Bezug auf die binären Darstellungen der Positionen der Elemente implementiert dies eine Rotationsoperation.
In O (N) Schritten ist es auch möglich, Paare von Elementen aus einer Warteschlange zu ziehen, sie auszutauschen und dann zurückzulegen, wobei alle Paare umgekehrt werden. In Bezug auf die binären Darstellungen der Positionen der Elemente ergänzt dies das niederwertige Bit der Position.
Durch das Wiederholen von O (log N) mal einem Unshuffle und einem paarweisen Swap können wir alle Bits der binären Darstellungen der Positionen ergänzen - was dasselbe ist wie das Umkehren der Liste.
quelle
Nennen wir zwei verfügbare Warteschlangen als links und rechts. Hier ist die Grundidee dieses Algorithmus mit der Annahme, dass N gerade ist:
Es ist leicht zu erkennen, wie der Algorithmus für ungerade N funktionieren sollte.
quelle