Il PriorityQueue
viene implementato come heap binario bilanciato implementato come array. Quando un elemento viene rimosso, l'heap deve riordinare se stesso per mantenere l'ordine dell'heap.
La prova è nei commenti
/**
* Priority queue represented as a balanced binary heap: the two
* children of queue[n] are queue[2*n+1] and queue[2*(n+1)]. The
* priority queue is ordered by comparator, or by the elements'
* natural ordering, if comparator is null: For each node n in the
* heap and each descendant d of n, n <= d. The element with the
* lowest value is in queue[0], assuming the queue is nonempty.
*/
private transient Object[] queue;
Anche nel javadoc classe
nota implementazione: questa implementazione fornisce O (log (n)) per l'Enqueing e metodi dequeing (offrire, sondare, rimuovere() e aggiungere); tempo lineare per il metodo remove (Object) e contiene (Object); e tempo costante per i metodi di recupero (peek, elemento e dimensione).
Per remove()
, ad esempio, si rimuove la radice dell'heap. Prendi l'ultimo elemento, cioè. all'estrema destra all'ultimo livello dell'albero binario e posizionalo come root e fai lo svergolamento fino a quando non trova il suo posto (basato su Comparator
). Nel peggiore dei casi è il momento O(log n)
.
fonte
2013-10-08 02:46:55
Ho appena controllato la documentazione e non c'era niente specificato su questo. Sono curioso di sentire la risposta! – templatetypedef
Grazie, felice di sapere che non mi manca niente di troppo ovvio! – chm