Un deque (cola de doble extremo) puede ser implementado para proporcionar todas estas operaciones en O (1) tiempo, aunque no todas las implementaciones lo hacen. Nunca utilicé ArrayDeque de Java, así que pensé que estabas bromeando porque no admite el acceso aleatorio, pero tienes toda la razón: como deque "puro", solo permite un fácil acceso en los extremos. Puedo ver por qué, pero eso es molesto ...
Para mí, la forma ideal de implementar una deque extremadamente rápida es utilizar un circular buffer, especialmente porque solo está interesado en agregar la eliminación en la parte delantera y posterior. No estoy al tanto de uno en Java, pero he escrito uno en Objective-C como parte de un marco de código abierto. Le invitamos a usar el código, tal como está o como un patrón para implementar el suyo.
Aquí está un WebSVN portal to the code y el related documentation. La verdadera carne está en el archivo CHAbstractCircularBufferCollection.m - busque los métodos appendObject:
y prependObject:
. Incluso hay un enumerador personalizado ("iterador" en Java) definido también. La lógica esencial buffer circular es bastante trivial, y es capturado en estas 3 centralizados #define
macros:
#define transformIndex(index) ((headIndex + index) % arrayCapacity)
#define incrementIndex(index) (index = (index + 1) % arrayCapacity)
#define decrementIndex(index) (index = ((index) ? index : arrayCapacity) - 1)
Como se puede ver en el método objectAtIndex:
, todo lo que hacen para tener acceso al elemento número n de un deque es array[transformIndex(N)]
. Tenga en cuenta que hago que tailIndex
siempre apunte a una ranura más allá del último elemento almacenado, por lo que si headIndex == tailIndex
, la matriz está llena o vacía si el tamaño es 0.
Espero que ayude. Mis disculpas por publicar código que no es de Java, pero el autor de la pregunta hizo dice que las respuestas generales fueron aceptables.
vector es O (1) para append ?! – Hexagon
Para aclarar, ¿desea recuperar el valor o una clave o su posición en la cola? – Schwern
@Hexagon: Amortizado, sí. – ephemient