Python включает модуль heapq для мини-кучи, но мне нужна максимальная куча. Что я должен использовать для реализации max-heap в Python?
python
data-structures
heap
recursive-datastructures
Дуглас Мейл
источник
источник
heapq
, не обеспечивает обратное.heapq
, и что нет хорошей альтернативы.int
/float
, вы можете инвертировать порядок, заключив их в класс с инвертированным__lt__
оператором.Ты можешь использовать
Если вы хотите добавить элементы, используйте:
источник
_heapify_max
,_heappushpop_max
,_siftdown_max
, и_siftup_max
.Решение состоит в том, чтобы отрицать ваши значения, когда вы сохраняете их в куче, или инвертировать сравнение объектов следующим образом:
Пример максимальной кучи:
Но вы должны помнить, чтобы обернуть и развернуть ваши значения, что требует знания, имеете ли вы дело с минимальной или максимальной кучей.
MinHeap, MaxHeap классы
Добавление классов для
MinHeap
иMaxHeap
объектов может упростить ваш код:Пример использования:
источник
list
параметр к __init__, в этом случае я вызываю,heapq.heapify
а также добавилheapreplace
метод.Самое простое и идеальное решение
Вот и ты. Все самые высокие цифры теперь самые низкие и наоборот.
Просто запомните это, когда вы выталкиваете элемент, чтобы умножить его на -1, чтобы снова получить исходное значение.
источник
Я реализовал версию heapq с максимальной кучей и отправил ее в PyPI. (Очень небольшое изменение кода CPython модуля heapq.)
https://pypi.python.org/pypi/heapq_max/
https://github.com/he-zhe/heapq_max
Монтаж
использование
tl; dr: то же самое, что и модуль heapq, за исключением добавления '_max' ко всем функциям.
источник
Если вы вставляете ключи, которые сопоставимы, но не похожи на int, вы можете переопределить операторы сравнения на них (т. Е. <= Становиться> и> становится <=). В противном случае вы можете переопределить heapq._siftup в модуле heapq (в конце концов, это всего лишь код Python).
источник
# If available, use C implementation
), который делает именно то, что описывает комментарий.Позволяет вам выбрать произвольное количество самых больших или самых маленьких предметов
источник
Расширение класса int и переопределение __lt__ - один из способов.
источник
Я создал оболочку кучи, которая инвертирует значения, чтобы создать максимальную кучу, а также класс оболочки для минимальной кучи, чтобы сделать библиотеку более ООП-подобной. Вот суть. Есть три класса; Heap (абстрактный класс), HeapMin и HeapMax.
Методы:
источник
В случае, если вы хотите получить максимальный элемент K, используя max heap, вы можете сделать следующий трюк:
источник
nlargest
здесь -> github.com/python/cpython/blob/…Следуя прекрасному ответу Исаака Тернера , я бы хотел привести пример, основанный на K ближайших точках к источнику, используя максимальную кучу.
источник
Подробно о https://stackoverflow.com/a/59311063/1328979 приведем полностью документированную, аннотированную и протестированную реализацию Python 3 для общего случая.
https://gist.github.com/marccarre/577a55850998da02af3d4b7b98152cf4
источник
Это простая
MaxHeap
реализация, основанная наheapq
. Хотя это работает только с числовыми значениями.Использование:
источник