Я читал исходный код модуля heapq
, потому что я рассмотрел вопрос на CodeReview и не могу что-то понять.
В статье в Википедии о куче говорится:
sift-up: перемещать узел вверх по дереву столько, сколько нужно;используется для восстановления состояния кучи после вставки.Вызывается "просеять", потому что узел перемещается вверх по дереву, пока не достигнет правильного уровня, как в сите.
sift-down: переместить узел вниз по дереву, аналогично sift-up;используется для восстановления состояния кучи после удаления или замены.
Но код heappush
( исходный код ):
def heappush(heap, item):
"""Push item onto heap, maintaining the heap invariant."""
heap.append(item)
_siftdown(heap, 0, len(heap)-1)
Если я прочиталВикипедия справа, при вставке элемента, который я ожидал увидеть siftup
, а не siftdown
.
Аналогично для heappop
( источник здесь ):
def heappop(heap):
"""Pop the smallest item off the heap, maintaining the heap invariant."""
lastelt = heap.pop() # raises appropriate IndexError if heap is empty
if heap:
returnitem = heap[0]
heap[0] = lastelt
_siftup(heap, 0)
return returnitem
return lastelt
Из статьи в Википедии я ожидал вызова siftdown
, но получил siftup
.
Это ошибка в Википедии или в модуле heapq
?Или мое понимание неверно?