我有一个班级
public class Entity : IComparable<Entity>
{
public float Priority { get; set; }
{
我创建了一个列表,并用没有特定顺序的Y项填充
list <Entity> = get_unorderd_list();
现在我想根据优先级值对列表进行排序,但我只关心以正确的顺序获取最高的X项,出于性能原因我不想使用常规.sort()方法作为X比Y小很多。
我应该编写自定义排序方法吗?或者有办法做到这一点吗?
编辑:不是说通过使用.max()
来创建单个velue答案 0 :(得分:3)
我应该编写自定义排序方法吗?
我不知道从.NET本身轻松地做到这一点。当我implemented sorting for Edulinq时,我采用了这种方法 - 整个排序是一个快速排序,但我只需要尽可能多的排序,以便返回到目前为止的结果。
现在,这仍然是一种通用的方法 - 如果你事先知道需要多少结果,你可能会做得更好。您可能希望构建一个基于堆的解决方案,其中有一个有界堆(最大大小为X),然后迭代输入,随时向堆中添加值。一旦你填满了第一个X元素,就可以开始丢弃小于最小堆元素的新元素,甚至不用查看树的其余部分。对于其他元素,执行正常操作以插入元素,从而保持堆内的顺序。
有关如何构建堆的详细信息,请参阅Wikipedia article on binary heaps stored as arrays。
答案 1 :(得分:1)
如果你的意思是MAX只是使用linq Max找到最高优先级的项目。你不能写出比Max更有效的方法,因为你必须比较列表中的所有项目才能找到最大值。
var highestPeriorityItem = unorderd_list.Max(x=>x.Periority);
编辑:
还有另一种方法比这更有效,即保持列表从一开始就排序。这意味着你必须保持列表与每个插入排序(按排序顺序插入项目)。这样,查找最大项目的时间复杂度为O(1)
,插入新项目的时间复杂度为O(1) < x < O(N)
。
希望这会有所帮助。
答案 2 :(得分:1)
麻烦的是你的未排序列表中的最后一项可能是X中的最高项目,所以你必须迭代我应该想到的整个Y.