deque (kolejka dwukierunkowa) mogą być realizowane, aby zapewnić wszystkie te operacje w czasie O (1) czasu, chociaż nie wszystkie wdrożenia to robią. Nigdy nie korzystałem z Java ArrayDeque, więc myślałem, że żartujesz, że nie obsługuje on dostępu losowego, ale masz absolutną rację - jako "czysty" deque, pozwala on tylko na łatwy dostęp na końcach. Rozumiem, dlaczego, ale to na pewno jest denerwujące ...
Dla mnie idealnym sposobem na wdrożenie wyjątkowo szybkiego deque jest użycie circular buffer, szczególnie, że jesteś zainteresowany tylko dodaniem usuwania z przodu iz tyłu. Nie jestem natychmiast świadomy jednego w Javie, ale napisałem jeden w Objective-C jako część open-source framework. Możesz użyć kodu tak jak jest lub jako wzorzec do implementacji własnego.
Oto WebSVN portal to the code i related documentation. Prawdziwe mięso znajduje się w pliku CHAbstractCircularBufferCollection.m - poszukaj metod: CHAbstractCircularBufferCollection.m. Istnieje również zdefiniowany niestandardowy moduł wyliczający ("iterator" w Javie). Zasadniczą okrągły logika bufor jest dość trywialne i jest ujęte w tych 3 scentralizowanych #define
makr:
#define transformIndex(index) ((headIndex + index) % arrayCapacity)
#define incrementIndex(index) (index = (index + 1) % arrayCapacity)
#define decrementIndex(index) (index = ((index) ? index : arrayCapacity) - 1)
Jak widać w sposobie objectAtIndex:
, wszystko, co zrobić, aby uzyskać dostęp do elementu n-tym w deque jest array[transformIndex(N)]
. Zauważ, że robię tailIndex
zawsze wskazywać na jeden slot poza ostatnim zapisanym elementem, więc jeśli headIndex == tailIndex
, tablica jest pełna lub pusta, jeśli rozmiar wynosi 0.
Nadzieję, że pomaga. Moje przeprosiny za opublikowanie kodu innego niż Java, ale pytanie autora czy powiedzieć ogólne odpowiedzi były dopuszczalne.
Vector wynosi O (1) dla append ?! – Hexagon
Aby wyjaśnić, czy chcesz odzyskać wartość lub klucz lub jego pozycję w kolejce? – Schwern
@ Hexagon: Amortyzowane, tak. – ephemient