Мне нравится использовать OrderedBag
и OrderedSet
классы в PowerCollections как приоритетные очереди.
Используйте Java для переводчика C# на реализации Java (java.util. PriorityQueue) в платформе Наборов Java, или более разумно используют алгоритм и базовый код и включают его в класс C# Вашего собственного создания, которое придерживается API платформы Наборов C# для Очередей, или по крайней мере Наборов.
Я нашел один Julian Bucknall на его блоге здесь - http://www.boyet.com/Articles/PriorityQueueCSharp3.html
, Мы изменили его немного так, чтобы низкоприоритетные объекты на очереди в конечном счете 'пузырились' к вершине со временем, таким образом, они не перенесли бы исчерпания ресурсов.
Вам может понравиться IntervalHeap из библиотеки Generic Collection C5 . Процитируем руководство пользователя
Класс
IntervalHeap
реализует интерфейсIPriorityQueue
, используя интервальную кучу, хранящуюся как массив пар. FindMin и Операции FindMax и get-аксессор индексатора занимают время O (1). DeleteMin, Операции DeleteMax, Add и Update, а также набор средств доступа индексатора требуют времени. O (войти п). В отличие от обычной очереди с приоритетом, интервальная куча предлагает как минимум и максимальное количество операций с той же эффективностью.
API достаточно прост
> var heap = new C5.IntervalHeap<int>();
> heap.Add(10);
> heap.Add(5);
> heap.FindMin();
5
Установить с Nuget https://www.nuget.org/packages/C5 или GitHub https: // github.com/sestoft/C5/