【发布时间】:2021-10-28 02:30:37
【问题描述】:
我正在尝试 .Net 6 中的 PriorityQueue,但对以下行为感到困惑。我想知道是否有人可以帮助我更好地理解它。
考虑下面的代码。
var priortyQueue = new PriorityQueue<string,int>();
priortyQueue.Enqueue("A",1);
priortyQueue.Enqueue("C-1",3);
priortyQueue.Enqueue("C-2",3);
priortyQueue.Enqueue("D", 4);
while (priortyQueue.TryDequeue(out var str,out var priority))
{
Console.WriteLine($"Element:{str} with Priority {priority}");
}
这将产生如下输出。
Element:A with Priority 1
Element:C-1 with Priority 3
Element:C-2 with Priority 3
Element:D with Priority 4
这看起来不错,但请注意“C-1”和“C-2”出列的位置或顺序。
现在,如果我要更改上述代码并在插入“C1”和“C2”之间添加另一个入队语句,情况会发生轻微变化。
var priortyQueue = new PriorityQueue<string,int>();
priortyQueue.Enqueue("A",1);
priortyQueue.Enqueue("C-1",3);
priortyQueue.Enqueue("B", 2); // change here
priortyQueue.Enqueue("C-2",3);
priortyQueue.Enqueue("D", 4);
上面的输出是
Element:A with Priority 1
Element:B with Priority 2
Element:C-2 with Priority 3 // Order is reversed
Element:C-1 with Priority 3
Element:D with Priority 4
正如您所见,“C2”和“C1”的位置现在发生了变化。我很好奇为什么优先级相同时不遵循FIFO。请注意,此行为仅适用于
- “B”的优先级低于“C1”和“C2”
- “B”排在“C1”之后和“C2”之前。
【问题讨论】: