【问题标题】:Priority Queue behavior when Priority is same优先级相同时的优先级队列行为
【发布时间】: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”之前。

【问题讨论】:

    标签: c# .net-6.0


    【解决方案1】:

    从来没有保证相同优先级的元素将获得什么顺序。

    然而,从源代码来看,列表的机制不仅仅是一个有序数组,它使用最后一个节点的某种链接样式列表,将每个节点向后移动一步,直到它使用您使用的任何比较器找到比较给它(或默认),直到它找到可以去的地方。

    在这种情况下,插入的顺序很重要,并且可以准确地产生您看到的工件。

    为什么您可能会问,可能是因为它更有效,但是您需要跟踪设计记录、讨论和纸质试验,以了解他们为什么特别选择它。

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 2021-11-29
      • 2012-02-24
      • 2023-04-02
      相关资源
      最近更新 更多