heapq.heappop
- это только для minheaps;вы не можете просто создать maxheap и ожидать, что функции на основе minheap будут работать над ним, потому что он не соблюдает инвариант minheap.
Если цель состоит в том, чтобы сначала получить -9, вам нужнокуча поддерживает правильные инварианты, сначала (по сути, O(n)
), хапифицируя его:
heapq.heapify(neg)
, после чего ваш код выскочит с -9 до -1.
Если вы 'пытаясь получить максимальную выгоду, это не поддерживается Все официально задокументированные функции heapq
работают с minheaps (выделение добавлено):
Приведенный ниже API отличается от алгоритмов кучи учебников в двух аспектах: (a) Мы используем ноль-на основе индексации.Это делает связь между индексом для узла и индексами для его дочерних элементов несколько менее очевидной, но является более подходящей, поскольку Python использует индексацию с нуля.(b) Наш метод pop возвращает наименьший элемент, а не наибольший (в учебниках он называется «min heap»; «max heap» чаще встречается в текстах из-за его пригодности для сортировки на месте).
В модуле есть несколько выбранных (и недокументированных) функций на основе maxheap, которые будут работать, например, heapq._heappop_max
, но они не являются документированной частью API и могут измениться илиисчезнуть в любое время.