最小堆代碼
最小堆(Min Heap)是一種二叉堆,其中每一個父節點的值都不會大於其子節點的值。最小堆可以用來實作優先佇列,並且可以透過Heap
類別來實作。以下是一個最小堆的Python實作範例:
class Heap:
def __init__(self):
self.heap = []
def __len__(self):
return len(self.heap)
def is_empty(self):
return len(self.heap) == 0
def build_heap(self, array):
self.heap = array
for i in range(len(self.heap) // 2 - 1, -1, -1):
self.sift_down(i)
def sift_down(self, i):
while i * 2 + 1 < len(self.heap):
j = 2 * i + 1
if j < len(self.heap) - 1 and self.heap[j] > self.heap[j + 1]:
j += 1
if self.heap[i] <= self.heap[j]:
break
self.swap(i, j)
i = j
def sift_up(self, i):
while i // 2 > 0:
if self.heap[i] <= self.heap[i // 2]:
break
self.swap(i, i // 2)
i = i // 2
def swap(self, i, j):
self.heap[i], self.heap[j] = self.heap[j], self.heap[i]
def insert(self, item):
self.heap.append(item)
self.sift_up(len(self.heap) - 1)
def extract_min(self):
if self.is_empty():
return None
min_val = self.heap[0]
self.heap[0] = self.heap[-1]
self.heap.pop()
self.sift_down(0)
return min_val
def decrease_key(self, i, val):
self.heap[i] = val
while i > 0 and self.heap[i // 2] > self.heap[i]:
self.swap(i, i // 2)
i = i // 2
def increase_key(self, i, val):
self.heap[i] = val
while i < len(self.heap) // 2 and self.heap[i] < self.heap[i * 2 + 1]:
self.swap(i, i * 2 + 1)
i = i * 2 + 1
def __str__(self):
return str(self.heap)
heap = Heap()
heap.build_heap([4, 1, 3, 16, 9, 10])
print(heap)
print(heap.extract_min())
print(heap)
heap.insert(7)
print(heap)
heap.decrease_key(2, 2)
print(heap)
這個程式碼實作了一個最小堆,並提供了一些基本操作,如建立最小堆、插入元素、提取最小元素、減少元素值和增加元素值。你可以根據需要修改這些操作。