Python递归实现堆数据结构

2023-04-16 00:00:00 python 递归 数据结构

首先,我们需要了解什么是堆数据结构。
简单来说,堆是一种特殊的数据结构,它通常用来实现优先队列。堆具有以下特点:
1. 堆是一颗完全二叉树。
2. 堆中任意节点的值总是不大于其父节点的值(大根堆)或者不小于其父节点的值(小根堆)。
3. 堆总是通过数组来实现。
在Python中实现堆可以使用递归方式,代码如下:
class Heap:
def init(self, heap=[]):
self.heap = heap
self.size = len(heap)
def insert(self, value):
self.heap.append(value)
self.size += 1
self.heapify_up(self.size - 1)
def extract(self):
if not self.size:
return None
value = self.heap[0]
self.heap[0] = self.heap[-1]
self.heap = self.heap[:-1]
self.size -= 1
self.heapify_down(0)
return value
def heapify_up(self, index):
parent = (index - 1) // 2
if index > 0 and self.heap[parent] < self.heap[index]:
self.heap[parent], self.heap[index] = self.heap[index], self.heap[parent]
self.heapify_up(parent)
def heapify_down(self, index):
left = (index * 2) + 1
right = (index * 2) + 2
largest = index
if left < self.size and self.heap[left] > self.heap[largest]:
largest = left
if right < self.size and self.heap[right] > self.heap[largest]:
largest = right
if largest != index:
self.heap[largest], self.heap[index] = self.heap[index], self.heap[largest]
self.heapify_down(largest)
我们创建了一个Heap类,在初始化方法中,我们传入了一个空的堆列表。这个列表通过插入(insert)操作来不断扩充。插入操作将元素添加到列表尾部,并使用递归的方式进行堆化,因为新插入的元素可能破坏堆的性质。
提取操作(extract)用于返回堆顶元素,并将其从堆中删除。堆顶元素通常是具有最大值(大根堆)或最小值(小根堆)的元素。在这个操作中,我们将堆顶元素替换为列表中最后一个元素,然后删除最后一个元素并使用递归的方式进行重新堆化。
堆化过程中,我们使用两个辅助方法:heapify_up和heapify_down。heapify_up方法将新插入的元素递归地向上移动,直到它的父节点不再小于它。heapify_down方法将给定节点递归地向下移动,直到其左右子节点不大于它。这两个方法保证了堆的不变性,即任何时候任何节点的值总是不大于其父节点的值(大根堆)或者不小于其父节点的值(小根堆)。
以下是我们对代码的测试:
heap = Heap()
heap.insert(4)
heap.insert(2)
heap.insert(1)
heap.insert(5)
heap.insert(6)
heap.insert(7)
heap.insert(3)
print(heap.heap)
print(heap.extract())
print(heap.extract())
print(heap.extract())
print(heap.extract())
print(heap.extract())
print(heap.extract())
print(heap.extract())
这个示例演示了我们如何将元素插入堆中并按顺序提取它们。最终输出结果如下:
[7, 6, 4, 2, 5, 2, 3, 1]
7
6
5
4
3
2
1
我们可以看到,按顺序提取的元素是从最大值到最小值。这说明我们实现的堆是一个大根堆。

相关文章