Sto cercando un'implementazione veloce queue
in Java. Vedo che l'interfaccia Queue
implementa l'interfaccia LinkedList
, ma sarà veloce solo come una? C'è un modo per avere una coda che sarà più veloce in particolare per add
(ho solo bisogno di poll
, add
e controllare per empty
). In fondo alla linea potrei anche aver bisogno di un PriorityQueue
ma non ancora.Una coda veloce in Java
risposta
Vedo che LinkedList implementa l'interfaccia Queue, ma sarà veloce quanto una LinkedList?
Eyeballing del codice sorgente, LinkedList è O (1) per le operazioni Queue.add, Queue.poll e Queue.peek.
Spero sia abbastanza veloce.
Stavo pensando che l'aggiunta di LinkedList sarebbe stata "O (n)" per qualche motivo. – Eqbal
Sarebbe un risultato estremamente stupido per una struttura di dati della lista collegata. –
Gli elenchi collegati sono generalmente O (n) per la ricerca, ma se lo si sta effettivamente utilizzando come una coda non verrà mai visualizzato. –
Se più thread stanno per accedere alla coda, prendere in considerazione l'utilizzo di ArrayBlockingQueue
. Altrimenti dai un'occhiata a ArrayDeque
. Dal ArrayDeque
API:
Questa classe è probabile che sia più veloce di Pila quando viene utilizzato come una pila, e più veloce rispetto ListaLinkata quando viene utilizzato come una coda.
particolare un'implementazione coda basata su array riduce la necessità di ridimensionare la matrice sottostante, se la matrice esistente ha una capacità sufficiente, rendendo così aggiunte alla coda generalmente più veloce di LinkedList
. Si noti che ArrayBlockingQueue
è un'implementazione limitata mentre ArrayDeque
verrà ridimensionata come richiesto.
Il rovescio della medaglia è che LinkedList
fornirà in genere una rappresentazione molto più compatta, in particolare nei casi in cui la coda cresce e si restringe di una grande quantità. Ad esempio, se hai aggiunto 10.000.000 elementi a ArrayDeque
e quindi rimosso 9.999.999 elementi, l'array sottostante sarebbe ancora di lunghezza 10.000.000 mentre uno LinkedList
non soffrirebbe di questo problema.
In realtà, per l'accesso a thread singolo a una coda non bloccante, tendo a favorire lo LinkedList
. Immagino che le differenze di rendimento siano così trascurabili che non noterai comunque la differenza.
LinkedBlockingQueue è in realtà più veloce di ArrayBlockingQueue. Quindi se stai usando una coda concorrente che sta bloccando usa quella. Altrimenti usare ConcurrentLinkedQueue è più veloce di entrambi i due. –
@JohnVint, hai alcune fonti che ArrayBlockingQueue è più lento di LinkedBlockingQueue? Non dovrebbe ArrayBlockingQueue essere il più veloce da quando l'array di backing non si ridimensiona mai durante l'intero ciclo di vita dell'oggetto? – Pacerier
@Adamski, l'ArrayDeque non riduce automaticamente la sua dimensione al punto di rimozione quando 'current_element_amt <0.5 * capacity'? – Pacerier
Se le prestazioni di un elenco collegato rappresentavano realmente un problema, un'alternativa consisteva nell'implementare una "coda circolare" in un array, ovvero una coda in cui il punto di inizio e fine si sposta mentre le voci vengono aggiunte ed eliminate. Posso dare maggiori dettagli se ti interessa. Quando usavo le lingue che non avevano una libreria di collezioni, questo era il modo in cui ho sempre implementato le code perché era più facile scrivere di una lista collegata ed era più veloce. Ma con le raccolte predefinite, lo sforzo di scrivere e debug della mia collezione per un caso speciale non vale la pena il 99% delle volte: quando è già scritto, il fatto che potrei scrivere in un modo diverso più velocemente di quanto avrei potuto ri-scriverlo come fa Java è praticamente un fatto irrilevante. E qualsiasi guadagno in termini di prestazioni è probabilmente troppo piccolo per valerne la pena. Sottotipo le raccolte esistenti per ottenere un comportamento speciale di cui ho bisogno di tanto in tanto, ma ho difficoltà a pensare all'ultima volta in cui ne ho scritto uno da zero.
Fare l'upvoting perché questa è una buona alternativa alla risposta selezionata se la velocità della coda è profilata come collo di bottiglia per le prestazioni. –
Ciò che descrivi è stato aggiunto in Java 6 e si chiama java.util.ArrayDeque. –
Si consiglia di dare un'occhiata a http://java.dzone.com/articles/gaplist-%E2%80%93-lightning-fast-list che introduce GapList
. Questa nuova implementazione di elenchi combina i punti di forza di ArrayList
e LinkedList
.
Implementa quindi l'interfaccia Deque
, ma può anche essere preimpostata come sopra menzionata ArrayDeque
. Inoltre, hai anche tutte le possibilità dell'interfaccia gratuitamente.
Iniziare con una rotazione veramente semplicistica Implementazione della coda con atteggiamento "C/C++ come" e dimensioni fisse.
class SimpleQueue<E>
{
int index = 0;
int head = 0;
int size = 100;
int counter = 0;
E[] data ;
@SuppressWarnings("unchecked")
SimpleQueue()
{
data = (E[]) new Object[size];
}
public void add(E e)
{
data[index]=e;
index=(index+1)%size;
counter++;
}
public E poll()
{
E value = data[head];
head=(head+1)%size;
counter--;
return value;
}
public boolean empty()
{ return counter==0; }
//Test
public static void main(String[] args)
{
SimpleQueue<Integer> s = new SimpleQueue<Integer>();
System.out.println(s.empty());
for(int i=0; i< 10; i++)
s.add(i);
System.out.println(s.empty());
for(int i=0; i<10; i++)
System.out.print(s.poll()+",");
System.out.println("\n"+s.empty());
}
}
E quindi migliorarlo.
'ArrayDeque' è una coda di rotazione. Perché reinventare la ruota quando si trova nelle librerie Java SE 6? – ThePyroEagle
- 1. Esiste una coda sincronizzata in Java?
- 2. Come si copia una coda in Java?
- 3. Contenitore coda più veloce (C++)
- 4. Convertire una coda in elenco
- 5. Coda concurrent e blocking in Java
- 6. Confronto veloce di una stringa con una raccolta in Java
- 7. C'è una coda di blocco corretto (non limitato) in java?
- 8. In Java 8, Executors.newWorkStealingPool() fornisce anche una coda di attività?
- 9. Sincronizzazione di una coda
- 10. Java EE traccia veloce (Learning Enterprise Java molto veloce)
- 11. Implementazioni della coda Java, quale?
- 12. Non dovrebbe anche una funzione ricorsiva in coda essere più veloce?
- 13. Qual è la raccolta più veloce in C# per implementare una coda di priorità?
- 14. FFT affidabile e veloce in Java
- 15. Veloce sviluppo di app Web in Java
- 16. R ha una coda di priorità come PriorityQueue di Java?
- 17. Come verificare che esista una coda JMS utilizzando Java?
- 18. Comunicazione IPC/Socket veloce in Java/Python
- 19. java ha una coda con priorità minima indicizzata?
- 20. Stack utilizzando una coda
- 21. Java più veloce di C
- 22. È una coda? (Javascript)
- 23. Qual è il metodo più veloce di gara per il polling di una coda senza blocco?
- 24. Come trovare la coda di trasmissione locale della coda MQ remota in Java?
- 25. Coda lavori in node.js
- 26. Modifica messaggi MSMQ in una coda
- 27. Inserire più elementi in una coda python
- 28. python testa e coda in una riga
- 29. Java 8 ha l'ottimizzazione della coda?
- 30. Eliminazione coda di coda in Mono
hai verificato che LinkedList non sarà abbastanza veloce? Aggiungi dovrebbe essere veloce in un elenco collegato ... –
'LinkedList's non sono abbastanza veloci? Hai provato a scrivere la tua per aggirare i bottelnecks di 'LinkedList' (qualunque essi siano)? – FrustratedWithFormsDesigner