修剪优先级队列

时间:2014-02-11 19:59:36

标签: c# priority-queue

要求: 的 我有一个带有 n 元素的最大优先级队列。现在我想只保留 m - 最大元素(其中 m < = n )并将其余部分从队列中删除。换句话说,我想修剪队列。

我如何实现这一目标?

我能提出的一种方法是,将 m 元素出列并将它们放入另一个队列。然后将新队列的引用分配给旧队列的引用。

public static PriorityQueue<int> TrimPQueue(PriorityQueue<int> paraQueue, int newSize)
{
    if (newSize >= paraQueue.Count)
        return paraQueue;
    PriorityQueue<int> newQueue = new PriorityQueue<int>(PriorityQueueType.Maximum);
    for (int i = 1; i < newSize + 1; i++)
    {
        int temp = paraQueue.Dequeue();
        newQueue.Add(temp);
    }
    return newQueue;
} 

有没有更好的方法呢?我更喜欢是否有办法修剪工作队列,而不必创建新的队列对象。

2 个答案:

答案 0 :(得分:1)

PriorityQueue实现IEnumerable接口,因此您可以将其与Linq扩展方法Last()结合使用:

while (paraQueue.Count > newSize)
{
  paraQueue.Remove(paraQueue.Last());
}

答案 1 :(得分:0)

我会做这样的事情:

public static void TrimPQueue(PriorityQueue<int> paraQueue, int newSize)
{
    if (newSize >= paraQueue.Count)
        return ;
    for (int i = 1; i < newSize + 1; i++)
        paraQueue.Dequeue();
} 

因为如果您仍在更改当前队列,则无需复制。