Поведение очереди приоритетов, когда приоритет одинаковыйC#

Место общения программистов C#
Ответить
Anonymous
 Поведение очереди приоритетов, когда приоритет одинаковый

Сообщение Anonymous »

Я пробовал PriorityQueue в .Net 6 и был озадачен следующим поведением. Мне было интересно, может ли кто-нибудь помочь мне лучше понять это.
Рассмотрим следующий код.

Код: Выделить всё

var priortyQueue = new PriorityQueue();
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();
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".


Подробнее здесь: https://stackoverflow.com/questions/697 ... ty-is-same
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»