diciamo che ho una collezione di qualche tipo, ad es.Estrai i k elementi massimi di una lista
IEnumerable<double> values;
Ora ho bisogno di estrarre i k valori più alti da quella collezione, per un certo parametro k. Questo è un modo molto semplice per farlo:
values.OrderByDescending(x => x).Take(k)
Tuttavia, questo (se ho capito bene) ordina prima l'intero elenco, quindi raccoglie i primi k elementi. Ma se la lista è molto grande, e k è relativamente piccolo (più piccolo di log n), questo non è molto efficiente - la lista è ordinata in O (n * log n), ma immagino di selezionare i k valori più alti da una lista dovrebbe essere più simile a O (n * k).
Quindi, qualcuno ha qualche suggerimento per un modo migliore, più efficiente per farlo?
Questo è noto come algoritmo di selezione. Vedi http://en.wikipedia.org/wiki/Selection_algorithm (si dice "K il più piccolo" ma puoi trovare il "K più grande" invertendo il confronto degli ordini, ovviamente). "Ordinamento parziale" è un caso speciale, che è più quello che vuoi: http: //en.wikipedia.org/wiki/Partial_sorting –
Correlati: [Algoritmo veloce per calcolare percentili per rimuovere i valori anomali] (http://stackoverflow.com/questions/3779763/fast-algorithm-for-computing-percentiles-to-remove-outliers) – sloth
Immagino un'altra soluzione sarebbe quella di ordinarlo ** quando gli articoli vengono aggiunti ** (invece di quando si accede). In questo modo, eviti di doverlo ordinare. – Default