假设我有一些类型的集合,例如提取列表中的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