A deque (двусторонняя очередь) может быть реализовано, чтобы обеспечить все эти операции за O (1) время, хотя не все реализации делают. Я никогда не использовал Java ArrayDeque, поэтому я подумал, что вы шутите по поводу того, что он не поддерживает произвольный доступ, но вы абсолютно правы - как «чистый» deque, он обеспечивает только легкий доступ на концах. Я понимаю почему, но это точно раздражает ...
Для меня идеальный способ реализовать очень быструю деку - это использовать кольцевой буфер , тем более что вас интересует только добавление удаления спереди и сзади. Я не сразу знаю об этом на Java, но я написал один на Objective-C как часть инфраструктуры с открытым исходным кодом. Вы можете использовать код, как есть, или как шаблон для реализации своего собственного.
Вот портал WebSVN с кодом и соответствующей документацией . Настоящее мясо находится в файле CHAbstractCircularBufferCollection.m - ищите методы appendObject:
и prependObject:
. Также существует даже собственный перечислитель («итератор» в Java). Необходимая логика циклического буфера довольно тривиальна и представлена в этих 3 централизованных макросах #define
:
#define transformIndex(index) ((headIndex + index) % arrayCapacity)
#define incrementIndex(index) (index = (index + 1) % arrayCapacity)
#define decrementIndex(index) (index = ((index) ? index : arrayCapacity) - 1)
Как вы можете видеть в методе objectAtIndex:
, все, что вы делаете для доступа к N-му элементу в deque, это array[transformIndex(N)]
. Обратите внимание, что я заставляю tailIndex
всегда указывать на один слот после последнего сохраненного элемента, поэтому, если headIndex == tailIndex
, массив заполнен или пуст, если размер равен 0.
Надеюсь, это поможет. Приношу свои извинения за публикацию не Java-кода, но автор вопроса сказал , что общие ответы были приемлемы.