TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2267 2.8K
День 1875. #ЗаметкиНаПолях
Структура Данных Куча и Очередь с Приоритетом в .NET. Окончание

Начало

Согласно документации, тип PriorityQueue в .NET использует «четвертичную минимальную кучу на основе массива». Т.е. каждый узел в куче имеет 4 дочерних элемента.

Двоичные и d-арные кучи имеют несколько разные характеристики времени выполнения. Двоичные кучи немного быстрее удаляют корневой узел, а d-арные кучи быстрее выполняют некоторые другие операции. В целом, d-арные кучи, как правило, имеют более высокую производительность во время выполнения, чем двоичные кучи, из-за принципа работы кэширования памяти, поэтому их часто предпочитают.

PriorityQueue в .NET имеет множество методов, типичных для реализации очереди с приоритетом:
// создание с одновременным «упорядочиванием» в кучу
var queue = new PriorityQueue<string, int>([
("A", 15), ("B", 7), ("C", 23), ("D", 2), ("E", 22)
]);

// Поиск минимального элемента без извлечения
string peek = queue.Peek(); // "D"

// Извлечение минимального элемента
// Это приводит к удалению корня, поэтому
// куча должна быть «пересортирована»
string dequeue = queue.Dequeue(); // "D"

// Добавление элемента с приоритетом
// Скорее всего приводит к «пересортировке»
queue.Enqueue(element: "F", priority: 42);

// Добавление нескольких элементов
queue.EnqueueRange([("G", 3), ("H", 13)]);

// Одновременное извлечение и добавление нового элемента
// Т.к. для каждой операции требуется «пересортировка», это более эффективно, чем последовательный вызов Dequeue() и Enqueue()
string deque1 =
queue.DequeueEnqueue("I", 19); // "G"


// И наоборот
string deque2 =
queue.EnqueueDequeue("J", 31); // "H"


PriorityQueue имеет несколько других вспомогательных методов для контроля ее работы:
// Выдаёт элементы, не учитывая приоритет, позволяя их перечислить
var unordered = queue.UnorderedItems;

// Количество элементов
var count = queue.Count;

// Очистка очереди
queue.Clear();

// Позволяет задать компаратор для приоритета. По умолчанию это минимальная куча, следующий код создаёт максимальную кучу
var inverse = Comparer<int>
.Create((a, b) => 0 - a.CompareTo(b));
var maxQueue =
new PriorityQueue<string, int>(inverse);

// Уменьшает ёмкость массива, лежащего в основе кучи,
// если новая ёмкость меньше 90% от текущей
queue.TrimExcess();


Источник: https://andrewlock.net/an-introduction-to-the-heap-data-structure-and-dotnets-priority-queue/
  • 👍 4
More from @netdeveloperdiary
  1. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  2. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  3. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  4. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  5. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  6. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →