A deque (Deque) implementiert werden können alle diese Operationen in O (1) Zeit zur Verfügung zu stellen, obwohl nicht alle Implementierungen. Ich habe nie das ArrayDeque von Java benutzt, also dachte ich, du würdest Witze darüber machen, dass es keinen Direktzugriff unterstützt, aber du hast absolut Recht - als "reines" Objekt erlaubt es nur einfachen Zugriff an den Enden. Ich kann sehen, warum, aber das ist sicher ärgerlich ...
Für mich ist der ideale Weg, um eine extrem schnelle Deque zu implementieren, eine circular buffer zu verwenden, vor allem, da Sie nur daran interessiert sind, entfernen an der Vorder- und Rückseite. Ich bin mir in Java nicht sofort bewusst, aber ich habe einen in Objective-C als Teil eines Open-Source-Frameworks geschrieben. Sie können den Code entweder unverändert oder als Muster für die Implementierung Ihres eigenen Codes verwenden.
Hier ist eine WebSVN portal to the code und die related documentation. Das echte Fleisch ist in der CHAbstractCircularBufferCollection.m Datei - suchen Sie nach den appendObject:
und prependObject:
Methoden. Es ist sogar ein benutzerdefinierter Enumerator ("Iterator" in Java) definiert. Die wesentliche Ringpuffer Logik ist ziemlich trivial und wird in diesen drei zentralen #define
Makros erfaßt:
#define transformIndex(index) ((headIndex + index) % arrayCapacity)
#define incrementIndex(index) (index = (index + 1) % arrayCapacity)
#define decrementIndex(index) (index = ((index) ? index : arrayCapacity) - 1)
Wie Sie in der objectAtIndex:
Methode sehen können, alles, was Sie tun, um das n-te Element in einer deque zuzugreifen, ist array[transformIndex(N)]
. Beachten Sie, dass ich tailIndex
immer auf einen Steckplatz hinter dem letzten gespeicherten Element zeigen, also wenn headIndex == tailIndex
, das Array voll ist, oder leer, wenn die Größe 0 ist.
Hoffe, dass hilft. Ich entschuldige mich für die Veröffentlichung von nicht-Java-Code, aber die Frage Autor tat sagen allgemeine Antworten waren akzeptabel.
Vektor ist O (1) zum Anfügen ?! – Hexagon
Um zu klären, möchten Sie den Wert oder einen Schlüssel oder seine Position in der Warteschlange abrufen? – Schwern
@ Hexagon: Amortisierte, ja. – ephemient