Я ищу .NET реализацию приоритетной очереди или структуры данных кучи
Приоритетные очереди - это структуры данных, которые обеспечивают большую гибкость, чем простая сортировка, поскольку они позволяют новым элементам входить в систему через произвольные интервалы. Гораздо более выгодно вставить новое задание в приоритетную очередь, чем пересортировать все при каждом поступлении.
Очередь с основным приоритетом поддерживает три основные операции:
- Вставка (Q, X). Получив элемент x с ключом k, вставьте его в очередь приоритетов Q.
- Найти-Minimum (Q). Вернуть указатель на элемент, значение ключа которого меньше, чем любой другой ключ в очереди приоритетов Q.
- Удаление-Минимум (Q). Удалить элемент из очереди приоритетов Q, ключ которого минимален
Если я не смотрю в неправильном месте, там нет ни одного в структуре. Кто-нибудь знает о хорошем, или я должен свернуть свой собственный?
c#
.net
data-structures
heap
priority-queue
Даг МакКлин
источник
источник
Ответы:
Мне нравится , используя
OrderedBag
иOrderedSet
классы в PowerCollections в качестве приоритетных очередей.источник
Вам может понравиться IntervalHeap из библиотеки C5 Generic Collection . Цитировать руководство пользователя
API достаточно прост
Установите из Nuget https://www.nuget.org/packages/C5 или GitHub https://github.com/sestoft/C5/
источник
Вот моя попытка .NET кучи
Некоторые тесты:
источник
IEqualityComparer<T>
будет недостаточно, поскольку это скажет вам только, равны ли два элемента, в то время как вам нужно знать отношение между ними (кто меньше / больше). Это правда, что я мог бы использовать,IComparer<T>
хотя ...вот тот, который я только что написал, возможно, он не так оптимизирован (просто использует отсортированный словарь), но прост для понимания. Вы можете вставлять объекты разных видов, поэтому нет общих очередей.
источник
Я нашел его Джулиана Бакнолла в его блоге здесь - http://www.boyet.com/Articles/PriorityQueueCSharp3.html
Мы немного изменили его, чтобы элементы с низким приоритетом в очереди со временем «всплыли», чтобы они не страдали от голода.
источник
Как упоминалось в Microsoft Collections for .NET , Microsoft написала (и поделилась в сети) 2 внутренних класса PriorityQueue в .NET Framework. Их код доступен для тестирования.
РЕДАКТИРОВАТЬ: Как заметил @ mathusum-mut, есть ошибка в одном из внутренних классов Microsoft PriorityQueue (сообщество SO, конечно, предоставило исправления для него): Ошибка во внутреннем PriorityQueue <T> от Microsoft?
источник
PriorityQueue<T>
в общем источнике Microsoft помеченыinternal
спецификатором доступа. Поэтому они используются только внутренними функциональными возможностями фреймворка. Они не доступны для общего потребления, просто ссылаясьwindowsbase.dll
на проект C #. Единственный способ - скопировать общий источник в сам проект внутри файла класса.Эта реализация может оказаться полезной: http://www.codeproject.com/Articles/126751/Priority-queue-in-Csharp-with-help-of-heap-data-st.aspx
он является общим и основан на структуре данных кучи
источник
легко.
источник
for (var n2 = n / 2; n > 0 && comparer.Compare(v, heap[n2]) > 0; n = n2, n2 /= 2) heap[n] = heap[n2];
и задаюсь вопросом, стоило ли это одной подкладкиИспользуйте транслятор с Java на C # в реализации Java (java.util.PriorityQueue) в платформе Java Collections или более разумно используйте алгоритм и основной код и вставьте его в собственный класс C #, который соответствует структуре C # Collections API для очередей или хотя бы коллекций.
источник
AlgoKit
Я написал библиотеку с открытым исходным кодом под названием AlgoKit , доступную через NuGet . Это содержит:
Код был тщательно протестирован. Я определенно рекомендую вам попробовать.
пример
Почему эти три кучи?
Оптимальный выбор реализации сильно зависит от ввода - как Ларкин, Сен и Тарьян показывают в эмпирическом исследовании приоритетных очередей , arXiv: 1403.0252v1 [cs.DS] . Они проверили неявные кучи d-ary, кучи спаривания, кучи Фибоначчи, кучи биномиального типа, кучи d-ary, кучи спаривания рангов, кучи землетрясений, кучи нарушений, слабые кучи с ослабленным рангом и строгие кучи Фибоначчи.
AlgoKit имеет три типа кучи, которые оказались наиболее эффективными среди протестированных.
Подсказка на выбор
Для относительно небольшого числа элементов вам, вероятно, будет интересно использовать неявные кучи, особенно четвертичные кучи (неявные 4-х разрядные). В случае работы с кучами больших размеров амортизированные структуры, такие как биномиальные кучи и пары кучи, должны работать лучше.
источник
Вот еще одна реализация от команды NGenerics:
NGenerics PriorityQueue
источник
Недавно у меня возникла та же проблема, и в итоге я создал пакет NuGet для этого.
Это реализует стандартную очередь приоритетов на основе кучи. Он также имеет все обычные тонкости коллекций BCL:
ICollection<T>
иIReadOnlyCollection<T>
реализацию, пользовательскуюIComparer<T>
поддержку, возможность указать начальную емкость, аDebuggerTypeProxy
сделать коллекцию легче работать с в отладчике.Также есть Inline версия пакета, которая просто устанавливает один файл .cs в ваш проект (полезно, если вы хотите избежать использования внешне видимых зависимостей).
Более подробная информация доступна на странице GitHub .
источник
Простая реализация Max Max Heap.
https://github.com/bharathkumarms/AlgorithmsMadeEasy/blob/master/AlgorithmsMadeEasy/MaxHeap.cs
источник
Следующая реализация
PriorityQueue
используетSortedSet
из системной библиотеки.источник
T x
иK key
? Я предполагаю, что это хитрость для разрешения дублированияT x
, и мне нужно сгенерировать уникальный ключ (например, UUID)?