Изучение Python День 14

Куча — это специализированная древовидная структура данных, удовлетворяющая свойству кучи. В минимальной куче для любого заданного узла значение узла меньше или равно значениям его дочерних элементов. В максимальной куче значение любого узла больше или равно значениям его дочерних элементов.

Python предоставляет модуль heapq, который предоставляет функции для создания и управления кучами в своей стандартной библиотеке.

Создание кучи

Чтобы использовать кучи в Python, вам сначала нужно импортировать модуль heapq:

import heapq

Создание минимальной кучи

Чтобы создать мини-кучу, вы можете использовать функцию heapify() из модуля heapq. Эта функция преобразует список в допустимую кучу на месте:

heap = [4, 8, 2, 6, 7, 1]
heapq.heapify(heap)
print(heap)  # Output: [1, 6, 2, 8, 7, 4]

Вставка элементов

Вы можете добавить элементы в кучу, используя функцию heappush():

heap = [1, 4, 2, 7, 9]
heapq.heapify(heap)

heapq.heappush(heap, 5)
print(heap)  # Output: [1, 4, 2, 7, 9, 5]

Получение минимального элемента

Чтобы получить наименьший элемент из кучи (который всегда является корневым элементом), используйте функцию heappop():

min_value = heapq.heappop(heap)
print(min_value)  # Output: 1
print(heap)      # Output: [2, 4, 5, 7, 9]

Получение k самых больших элементов:

Вы можете использовать функцию nlargest(), чтобы получить k самых больших элементов из кучи:

heap = [1, 4, 2, 7, 9]
heapq.heapify(heap)

k_largest = heapq.nlargest(3, heap)
print(k_largest)  # Output: [9, 7, 4]

Получение k наименьших элементов

Точно так же вы можете использовать функцию nsmallest() для получения k наименьших элементов из кучи:

heap = [1, 4, 2, 7, 9]
heapq.heapify(heap)

k_smallest = heapq.nsmallest(3, heap)
print(k_smallest)  # Output: [1, 2, 4]

Сортировка кучей

Вы можете использовать модуль heapq для выполнения сортировки кучи в списке:

arr = [4, 2, 7, 1, 9, 3]
sorted_arr = []
for _ in range(len(arr)):
    sorted_arr.append(heapq.heappop(arr))
print(sorted_arr)  # Output: [1, 2, 3, 4, 7, 9]

Важная заметка

Помните, что heapq обеспечивает реализацию с минимальной кучей. Если вам нужна максимальная куча, вы можете инвертировать знак элементов в куче (например, использовать -value вместо value при добавлении элементов) или реализовать свои собственные функции сравнения.