【发布时间】:2012-03-03 04:58:08
【问题描述】:
我按照this question(Jason 的回答)中给出的指示使用SortedList 编写我的PriorityQueue<T>。我了解此类中的 count 字段用于确保唯一的优先级并保持相同优先级之间的入队顺序。
但是,当count达到最大值并且我对其加1时,后者又会从0开始,所以后续项的优先级会高于前面项的优先级。使用这种方法,我可能需要一种“安全地”重置计数器count...事实上,假设具有以下队列状态(格式为 priority | count | item):
0 | 123 |一个
0 | 345 |乙
1 | 234 | C
2 | 200 | D
现在假设计数器已达到限制,所以我必须将其重置为 0:因此,下一个插入的项目将具有计数器 0:例如,如果我插入一个优先级等于 1 的元素,它将是在 1 之前错误插入 | 234 | D
0 | 123 |一个
0 | 345 | B
1 | 000 |新元素
1 | 234 | C
2 | 200 | D
优先级问题可以通过实现堆来解决:我创建了一个Heap 类,然后我使用Heap<KeyValuePair<TPriority, TElement> 和一个自定义PriorityComparer 来按TPriority 对元素进行排序。
给定 TPriority 作为 int 和 TElement 作为 string,PriorityComparer 如下:
public class MyComparer : IComparer<KeyValuePair<int, string>>
{
public int Compare(KeyValuePair<int, string> x, KeyValuePair<int, string> y)
{
return x.Key.CompareTo(y.Key);
}
}
...
int capacity = 10;
Heap<KeyValuePair<int, string>> queue;
queue = new Heap<KeyValuePair<int, string>>(capacity, new PriorityComparer());
...
更新
通过这种方式(使用PriorityComparer),我已经成功实现了一个优先级队列。
现在我想添加支持以在运行时修改其行为,即从FIFO 切换到优先排序,反之亦然。由于我的优先级队列实现有一个IComparer 字段,我认为添加一个Comparer 属性来编辑这个字段就足够了,如下所示:
public IComparer
{
set
{
this._comparer = value;
}
}
与此同时,我想我会采取不同的方法:我可以包装不同的队列(每个队列引用一个给定的优先级),而不是使用二进制堆来管理优先级,如下所示。
public class PriorityQueue<T, int>
{
private Queue<T> _defaultQueue;
private bool _priority;
private SortedList<int, Queue<T>> _priorityQueues;
public PriorityQueue(int capacity)
{
this._defaultQueue = new Queue<T>(capacity);
this._priority = false;
this._priorityQueues = new SortedList<int, Queue<T>>(0);
}
public void PriorityEnable()
{
this._priority = true;
}
public void PriorityDisable()
{
this._priority = false;
}
public void Enqueue(T item)
{
if (this._priority)
{
// enqueue to one of the queues
// with associated priority
// ...
}
else this._defaultQueue.Enqueue(item);
}
public T Dequeue()
{
if (this._priority)
{
// dequeue from one of the queues
// with associated priority and
// return
// ...
}
return this._defaultQueue.Dequeue();
}
}
- 当默认队列中仍有元素时,如何管理从 FIFO 模式 到 优先模式 的转换?我可以根据项目优先级将它们复制到优先级队列中......其他更好的解决方案?
- 如何管理从优先模式到FIFO模式的转换?在这种情况下,我会有几个优先级队列,其中可能包含元素,但不再需要根据优先级管理它们,甚至不知道原始到达顺序...
- 如何管理不同队列的容量?
- 以上两种解决方案的性能如何?哪个会占用更多内存?
【问题讨论】:
-
我的回复对您的问题有帮助吗?
标签: c# .net algorithm data-structures