Ho una grande mappa di String-> Intero e voglio trovare i 5 valori più alti nella mappa. Il mio approccio attuale prevede la traduzione della mappa in un elenco di array di oggetti coppia (chiave, valore) e quindi l'ordinamento con Collections.sort() prima di eseguire il primo 5. È possibile che una chiave abbia il proprio valore aggiornato durante il corso dell'operazione .Ricerca dei valori n più alti in una mappa
Penso che questo approccio sia accettabile a thread singolo, ma se avessi più thread tutti attivando la trasposizione e ordinando frequentemente non sembra molto efficiente. L'alternativa sembra essere quella di mantenere un elenco separato delle 5 voci più alte e tenerlo aggiornato quando si verificano le operazioni rilevanti sulla mappa.
Potrei avere alcuni suggerimenti/alternative sull'ottimizzazione per favore? Sono felice di prendere in considerazione diverse strutture di dati se c'è beneficio.
Grazie!
Due domande: 1) perché avere una mappa? hai bisogno di cercare valori per le chiavi date? 2) Hai anche bisogno di conoscere i tasti per i 5 valori più alti? – pgras
@pgras - sì, un'altra funzione dell'API è ricevere una chiave e restituire il valore corrente in modo che una mappa fosse un buon punto di partenza. Abbiamo bisogno di conoscere le chiavi per i valori più alti ed è per questo che sono stato costretto a usare un oggetto pair e non solo a creare un elenco di numeri interi. – Scruffers
Puoi specificare quali sono esattamente i requisiti per il tempo di esecuzione? Il tuo attuale 'getHighestFive' è' O (n log n) ', mentre cambia la mappa con' lookup', 'insert' e' delete' è 'O (log n)' ciascuno. Vuoi ottenere 'getHighestFive' fino a' O (1) 'mentre conservi gli altri tempi di esecuzione? Che cosa ha a che fare con più thread, vuoi parallelizzare 'getHighestFive'? –