Deque

Diagramma UML di una deque

In informatica, una deque (solitamente pronunciato come deck, è l'abbreviazione di double-ended queue, cioè coda doppia) è una struttura dati astratta simile a una lista, anche chiamata lista concatenata testa-coda in quanto gli elementi possono essere aggiunti o rimossi solamente dalla testa o dalla coda.

Convenzioni sul nome

La deque viene a volte scritta dequeue, ma questa pratica è generalmente scoraggiata nella letteratura tecnica poiché dequeue è anche un verbo inglese che significa "rimuovere da una coda". Nonostante ciò, alcuni autori come Alfred Aho, John Hopcroft, e Jeffrey Ullman nel loro libro Data Structures and Algorithms, adoperano la parola dequeue. Inoltre, per indicare una deque vengono usati anche DEQ e DQ.

Distinzioni e sotto-tipi

Questa struttura dati differisce da una normale coda FIFO nella quale gli elementi possono essere aggiunti solo da una parte e rimossi dell'altra. Alcuni dei possibili sotto-tipi di questa struttura dati sono:

Entrambe le strutture dati più comuni e fondamentali dell'informatica, la coda e lo stack possono essere considerate particolari deque, e sono quindi implementabili usando una deque.

Operazioni

Una deque supporta le seguenti operazioni:

OperazioneAdaC++JavaJavaScriptPerlPHPPythonRuby
Inserisci elemento come ultimoAppendpush_backofferLastpushpusharray_pushappendpush
Inserisci elemento come primoPrependpush_frontofferFirstunshiftunshiftarray_unshiftappendleftunshift
Rimuovi ultimo elementoDelete_Lastpop_backpollLastpoppoparray_poppoppop
Rimuovi primo elementoDelete_Firstpop_frontpollFirstshiftshiftarray_shiftpopleftshift
Esamina ultimo elementoLast_ElementbackpeekLast<obj>[<obj>.length - 1]$_[-1]end<obj>[-1]last
Esamina primo elementoFirst_ElementfrontpeekFirst<obj>[0]$_[0]reset<obj>[0]first

Implementazioni

Esistono almeno due modi di implementare efficientemente una deque: attraverso un array dinamico modificato o tramite una lista doppiamente concatenata.

Implementazione tramite array dinamico

La deque viene spesso implementata usando una variante dell'array dinamico che può accrescere la sua capienza da entrambi i lati e che viene anche chiamato deque array. Essi hanno tutte le proprietà degli array dinamici, come tempo costante di accesso arbitrario, buona località, e inserimenti e rimozioni al centro inefficienti con l'aggiunta di inserimenti e rimozioni con tempo ammortizzato costante da entrambi i lati, invece che da un lato solo. Due implementazioni comuni sono:

Supporto nei linguaggi

La libreria C++ Standard Template Library offre la classe std::deque e la classe std::list per l'implementazione degli array dinamici e della lista concatenata rispettivamente.

Java 6 offre una nuova interfaccia Deque che permette l'inserimento e la rimozione su entrambi i lati. È implementata da classi come ArrayDeque (anch'essa introdotta in Java 6) e LinkedList che forniscono le implementazioni dell'array dinamico e della lista concatenata rispettivamente.

Python 2.4 ha introdotto il modulo collections col supporto per gli oggetti deque.

In PHP 5.3, l'estensione SPL contiene la classe SplDoublyLinkedList che può essere usata per l'implementazione di una deque.

Complessità

Bibliografia

Voci correlate

Altri progetti

Collegamenti esterni

  Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica