3

我有一堂课

public class Entity : IComparable<Entity>
{

    public float Priority { get; set; }

{

我创建了一个列表并在其中填充了 Y 项没有特定顺序的项目

list <Entity> = get_unorderd_list();

现在我想根据优先级值对列表进行排序,但我只关心以正确的顺序获得最高的 X 项,出于性能原因,我不想使用常规的 .sort() 方法,因为 X 很多小于 Y。

我应该编写自定义排序方法吗?或者有没有办法做到这一点?

编辑:不是在谈论使用 .max() 获得一个单一的价值

4

3 回答 3

3

我应该编写自定义排序方法吗?

我不知道从 .NET 本身轻松做到这一点的方法。当我为 Edulinq 实现排序时,我采用了这种方法 - 整个排序是快速排序,但我只排序了我需要的排序,以便返回迄今为止的结果。

现在,这仍然是一种通用方法 - 如果您事先知道需要多少结果,您可能会做得更好。您可能想要构建一个基于堆的解决方案,其中您有一个有界堆(最大大小 X),然后迭代您的输入,在您进行时将值添加到您的堆中。一旦你填满了第一个 X 元素,你就可以开始丢弃小于最小堆元素的新元素,甚至不需要查看树的其余部分。对于其他元素,您执行正常操作来插入元素,保持堆内的顺序。

有关如何构建堆的更多信息,请参阅关于存储为数组的二进制堆的 Wikipedia 文章。

于 2012-11-26T07:03:02.957 回答
1

如果你的意思是 MAX 只是使用 linq Max 来查找最高优先级的项目。你不能写比 Max 更有效的方法,因为你必须比较列表中的所有项目才能找到 max 无论如何。

var highestPeriorityItem = unorderd_list.Max(x=>x.Periority);

编辑:

还有另一种比这更有效的方法,那就是从一开始就保持列表排序。这意味着你必须保持列表在每次插入时都排序(按排序顺序插入项目)。这样找到最大项目的O(1)时间复杂度是 ,插入新项目的时间复杂度是O(1) < x < O(N)

希望这可以帮助。

于 2012-11-26T06:55:09.260 回答
1

问题是未排序列表中的最后一项可能是 X 中的最高项,因此您将不得不遍历我应该认为的整个 Y。

于 2012-11-26T06:57:34.303 回答