Un deque (Deque) può essere implementato per fornire tutte queste operazioni in O (1) tempo, anche se non tutte le implementazioni fanno. Non ho mai usato ArrayDeque di Java, quindi ho pensato che stavi scherzando sul fatto che non supportava l'accesso casuale, ma hai assolutamente ragione - come un deque "puro", consente solo un facile accesso alle estremità. Posso capire perché, ma quello è sicuramente fastidioso ...
Per me, il modo ideale per implementare una deque estremamente veloce è utilizzare uno circular buffer, soprattutto perché si è interessati solo ad aggiungere la rimozione nella parte anteriore e posteriore. Non ne sono immediatamente a conoscenza in Java, ma ne ho scritto uno in Objective-C come parte di un framework open source. Sei libero di usare il codice, sia come-sia che come modello per implementare il tuo.
Ecco uno WebSVN portal to the code e lo related documentation. La vera carne è nel file CHAbstractCircularBufferCollection.m - cerca i metodi appendObject:
e prependObject:
. È anche definito un enumeratore personalizzato ("iteratore" in Java). La logica buffer circolare essenziale è abbastanza banale, ed è catturato in questi 3 centralizzati #define
macro:
#define transformIndex(index) ((headIndex + index) % arrayCapacity)
#define incrementIndex(index) (index = (index + 1) % arrayCapacity)
#define decrementIndex(index) (index = ((index) ? index : arrayCapacity) - 1)
Come si può vedere nel metodo objectAtIndex:
, tutto si fa per accedere all'elemento Nth in una deque è array[transformIndex(N)]
. Nota che faccio tailIndex
puntare sempre a uno slot oltre l'ultimo elemento memorizzato, quindi se headIndex == tailIndex
, l'array è pieno, o vuoto se la dimensione è 0.
Sperare che aiuti. Le mie scuse per la pubblicazione di codice non Java, ma l'autore della domanda ha fatto dire che le risposte generali erano accettabili.
fonte
2009-06-12 05:25:55
vettore è O (1) per l'accodamento ?! – Hexagon
Per chiarire, vuoi recuperare il valore o una chiave o la sua posizione nella coda? – Schwern
@Hexagon: ammortizzato, sì. – ephemient