2009-07-07 20 views
10

java.util.PriorityQueue consente di passare uno Comparator in fase di costruzione. Quando si inseriscono elementi, vengono ordinati in base alla priorità specificata dal comparatore.Code prioritarie in Java

Cosa succede quando la priorità di un elemento cambia dopo che è stata inserita? Quando sono gli elementi di riordino PriorityQueue? È possibile eseguire il polling di un elemento che in realtà non ha priorità minima?

Esistono buone implementazioni di una coda di priorità che consentono aggiornamenti di priorità efficienti?

+0

Posso chiedere con quale soluzione sei andato? Sto avendo problemi simili, ma allo stesso tempo molto diversi, in cui ho bisogno di ricalcolare le priorità di ** tutte le voci ** in base al tempo rimasto (programmazione Least Slack Time). –

risposta

13

È necessario rimuovere l'elemento, modificarlo e reinserirlo, poiché l'ordine si verifica quando viene inserito. Anche se comporta diversi passaggi, è efficiente potrebbe essere abbastanza buono. (Ho appena notato che il commento sulla rimozione è O (n).)

Un problema è che verrà anche riordinato quando si rimuove l'elemento, che è ridondante se si sta per reinserirlo un momento dopo. Se implementi la tua coda di priorità da zero, potresti avere un update() che salta questo passaggio, ma l'estensione della classe di Java non funzionerà perché sei ancora limitato a remove() e add() fornito dalla base.

6

avrei aspetterebbe il PriorityQueue di non riordinare le cose - e si potrebbe ottenere molto confuso se si cerca di fare una ricerca binaria per trovare il posto giusto per mettere le nuove voci.

In generale, mi aspetto che cambiare la priorità di qualcosa già in coda sia una cattiva idea, proprio come cambiare i valori che costituiscono una chiave in una tabella hash.

+0

Sarebbe davvero utile per alcuni algoritmi (ad esempio Algoritmo di Dijkstra) essere in grado di cambiare la priorità di qualcosa già in coda. –

+1

Ma ci dovrebbe essere una notifica di ciò. Si potrebbe simulare questo senza alcun aiuto da PriorityQueue rimuovendo e riaggiungendo l'oggetto se cambia priorità. –

+1

@Jon correggimi se ho torto, ma credo che la rimozione sia O (n) per l'implementazione di Sun, quindi questo finisce per essere O (n log n), mentre se potessi aggiornare internamente sarebbe solo O (log n). Sembrerebbe che la possibilità di forzare un aggiornamento sarebbe piacevole. –