Python中的树形数据结构: 二叉堆的应用
树形数据结构在计算机科学中非常常见,它可以用来表示层次结构,并且也被广泛应用于各种算法中。Python中的树形数据结构有很多种实现方式,例如普通的树、二叉树、红黑树等等。其中二叉堆是一种重要的树形数据结构,在大量算法中都得到了应用。
二叉堆是一个特殊的二叉树,它满足以下两个条件:
- 父节点的键值总是大于等于(最大堆)或小于等于(最小堆)它的子节点的键值。
- 二叉堆是一棵完全二叉树,即除了最后一层,其它所有层都是满的,并且最后一层从左到右填满。
在Python中,二叉堆可以用一个数组来表示。数组中的第一个元素通常被认为是根节点,然后按照层次顺序依次存储左子节点和右子节点。这样存储的好处是不需要额外的指针来指向子节点,节省了空间并提高了访问速度。
下面是一个简单的最小堆的实现,用来存储字符串:
class MinHeap: def __init__(self): self.heap = [] def parent(self, i): return (i - 1) // 2 def left(self, i): return 2 * i + 1 def right(self, i): return 2 * i + 2 def insert(self, string): self.heap.append(string) self.heapify_up(len(self.heap) - 1) def heapify_up(self, i): while i > 0 and self.heap[self.parent(i)] > self.heap[i]: self.heap[self.parent(i)], self.heap[i] = self.heap[i], self.heap[self.parent(i)] i = self.parent(i) def heapify_down(self, i): l = self.left(i) r = self.right(i) smallest = i if l < len(self.heap) and self.heap[l] < self.heap[smallest]: smallest = l if r < len(self.heap) and self.heap[r] < self.heap[smallest]: smallest = r if smallest != i: self.heap[i], self.heap[smallest] = self.heap[smallest], self.heap[i] self.heapify_down(smallest) def pop_min(self): if len(self.heap) == 0: return None min_val = self.heap[0] self.heap[0] = self.heap[-1] del self.heap[-1] self.heapify_down(0) return min_val def build_heap(self, arr): self.heap = arr for i in range(len(arr) // 2, -1, -1): self.heapify_down(i)
在上面的代码中,我们实现了插入、删除最小元素、建立堆等基本操作。其中heapify_up和heapify_down两个函数分别用来保持堆的性质。heapify_up函数用于插入操作中,将新插入的元素向上移动直到达到正确的位置;heapify_down函数用于删除操作中,将新的根节点向下移动直到达到正确的位置。
最后,我们可以测试这个实现的代码:
>>> heap = MinHeap() >>> heap.insert("pidancode.com") >>> heap.insert("is") >>> heap.insert("a") >>> heap.insert("great") >>> heap.insert("website") >>> heap.pop_min() 'a' >>> heap.pop_min() 'great' >>> heap.pop_min() 'is' >>> heap.pop_min() 'pidancode.com' >>> heap.pop_min() 'website' >>> heap.pop_min() >>> heap.insert("皮蛋编程") >>> heap.build_heap(["hello", "world", "python"]) >>> heap.pop_min() 'hello'
从输出结果可以看出,二叉堆能够有效地维护一个有序序列,并且在常数时间内找到最小元素。它在排序、优先级队列等算法中都得到了广泛的应用。
相关文章