Ich muss eine RandomQueue schreiben, die das Anhängen und zufällige Entfernen in konstanter Zeit (O (1)) ermöglicht.
Mein erster Gedanke war, es mit einer Art Array zu unterstützen (ich habe eine ArrayList gewählt), da Arrays über einen Index ständigen Zugriff haben.
Beim Durchsehen der Dokumentation wurde mir jedoch klar, dass die Additionen von ArrayLists als Amortized Constant Time betrachtet werden, da für eine Addition möglicherweise eine Neuzuweisung des zugrunde liegenden Arrays erforderlich ist, nämlich O (n).
Sind Amortized Constant Time und Constant Time effektiv gleich, oder muss ich eine Struktur betrachten, die nicht bei jeder Addition eine vollständige Neuzuweisung erfordert?
Ich frage dies, weil ich neben Array-basierten Strukturen (die meines Wissens immer Amortized Constant Time-Zusätze enthalten) nichts finden kann, was die Anforderungen erfüllt:
- Alles, was auf einem Baum basiert, hat bestenfalls Zugriff auf O (log n)
- Eine verknüpfte Liste könnte möglicherweise O (1) -Additionen enthalten (wenn ein Verweis auf den Schwanz beibehalten wird), eine zufällige Entfernung sollte jedoch bestenfalls O (n) sein.
Hier ist die vollständige Frage. Für den Fall, dass ich einige wichtige Details übersehen habe:
Entwerfen und implementieren Sie eine RandomQueue. Dies ist eine Implementierung der Warteschlangenschnittstelle, bei der die Operation remove () ein Element entfernt, das unter allen Elementen, die sich derzeit in der Warteschlange befinden, gleichmäßig zufällig ausgewählt wird. (Stellen Sie sich eine RandomQueue als eine Tasche vor, in der wir Elemente hinzufügen oder zufällige Elemente erreichen und blind entfernen können.) Die Operationen add (x) und remove () in einer RandomQueue sollten pro Operation in konstanter Zeit ausgeführt werden.
1/a
Chance auf eine O (n) -Operation), aber das Wachstum um einen konstanten Faktor a > 1
ist O (1) für die Addition amortisiert: Wir haben die (1/a)^n
Chance auf ein O (n) Operation, aber diese Wahrscheinlichkeit nähert sich Null für große n
.