假設我有一些類型的集合,例如提取列表中的k個最大元素
IEnumerable<double> values;
現在我需要從該集合中提取k個最高值,對於某個參數k。這是一個非常簡單的方法來做到這一點:
values.OrderByDescending(x => x).Take(k)
然而,這(如果我理解正確此)第一排序整個列表,然後選取前k元素。但是,如果列表非常大,並且k比較小(小於log n),這不是非常高效 - 列表按O(n * log n)排序,但是我從一個列表中選擇k個最高值應該更像O(n * k)。
那麼,有沒有人有任何建議更好,更有效地做到這一點?
這被稱爲一個選擇算法。見http://en.wikipedia.org/wiki/Selection_algorithm(它說「K最小」,但當然,您可以通過顛倒排序比較來找到「K最大」)。 「部分排序」是一種特殊情況,它更符合你的要求:http://en.wikipedia。org/wiki/Partial_sorting – 2013-02-26 12:43:52
相關:[快速算法來計算百分點來移除異常值](http://stackoverflow.com/questions/3779763/fast-algorithm-for-computing-percentiles-to-remove-outliers) – sloth 2013-02-26 12:49:41
我想另一種解決方案是在項目添加**時進行排序(而不是在訪問時)。這樣,你可以避免需要對其進行分類。 – Default 2013-02-26 12:58:49