本文档涵盖了 TheAlgorithms/Python 仓库中堆数据结构和优先队列的实现。堆是满足堆属性的特化树状数据结构,而优先队列是可以使用堆高效实现的抽象数据类型。
堆是完全二叉树,其中每个节点与其子节点之间满足特定的排序属性。优先队列是抽象数据类型,它维护一个元素集合,每个元素都有一个关联的优先级,允许高效地访问最高优先级的元素。
仓库中的最大堆示例
来源:data_structures/heap/heap.py25-46 graphs/dijkstra_algorithm.py11-29
该仓库提供了两种不同的堆实现,服务于不同的目的
data_structures.heap.heap.Heap)一个通用的最大堆实现,用于通用的堆操作和堆排序。
graphs.dijkstra_algorithm.PriorityQueue)一个最小堆实现,专门为需要优先队列操作的图算法设计。
两个实现都使用了
来源:data_structures/heap/heap.py1-24 data_structures/heap/heap.py25-50 graphs/dijkstra_algorithm.py11-29
堆实现包含以下关键操作
这些方法计算导航堆数组的索引
parent_index:查找给定节点的父节点left_child_idx:查找给定节点的左子节点right_child_idx:查找给定节点的右子节点来源:data_structures/heap/heap.py55-109
build_max_heap 方法通过从数组中间到根应用 max_heapify 操作,将未排序的数组转换为最大堆。
来源:data_structures/heap/heap.py134-163
max_heapify 方法通过递归交换值来恢复最大堆属性,从而纠正子树根节点中堆属性的单一违反。
来源:data_structures/heap/heap.py111-132
extract_max:从堆中移除并返回最大元素(根)insert:将新值添加到堆中并维护堆属性来源:data_structures/heap/heap.py165-194 data_structures/heap/heap.py196-230
heap_sort 方法通过重复从堆中提取最大元素来以降序对数组进行排序。
来源:data_structures/heap/heap.py232-238
优先队列是支持以下关键操作的抽象数据类型
| 操作 | 描述 | 时间复杂度 |
|---|---|---|
insert(item, priority) | 添加具有给定优先级的项 | O(log n) |
extract_min() / extract_max() | 移除并返回最高优先级的项 | O(log n) |
decrease_key(item, new_priority) | 更新项的优先级 | O(log n) |
is_empty() | 检查队列是否为空 | O(1) |
Dijkstra 算法中的 PriorityQueue 类实现了最小堆,用于计算最短路径
优先队列数据结构映射
来源:graphs/dijkstra_algorithm.py11-29 graphs/dijkstra_algorithm.py44-97 graphs/dijkstra_algorithm.py99-141
Dijkstra 最短路径算法
Top K Frequent Words 实现
WordCount 类演示了如何使自定义对象与堆一起工作
来源:strings/top_k_frequent_words.py22-65 strings/top_k_frequent_words.py67-94 graphs/dijkstra_algorithm.py289-387
| 操作 | 时间复杂度 | 空间复杂度 |
|---|---|---|
build_max_heap() | O(n) | O(1) 辅助空间 |
extract_max() | O(log n) | O(1) 辅助空间 |
insert() | O(log n) | O(1) 辅助空间 |
max_heapify() | O(log n) | O(log n) 递归 |
heap_sort() | O(n log n) | O(1) 辅助空间 |
| 操作 | PriorityQueue 实现 | 时间复杂度 |
|---|---|---|
insert() | 添加元素并上浮 | O(log n) |
extract_min() | 移除根并堆化 | O(log n) |
decrease_key() | 更新优先级并上浮 | O(log n) |
is_empty() | 检查大小 | O(1) |
min_heapify() | 恢复堆属性 | O(log n) |
空间复杂度:O(n),其中 n 是堆/优先队列中存储的元素数量。
优化说明:
PriorityQueue 中的 pos 字典支持 decrease_key() 操作的 O(1) 元素查找来源:data_structures/heap/heap.py134-163 data_structures/heap/heap.py165-194 graphs/dijkstra_algorithm.py44-97
两个堆实现都使用基于数组的二叉树表示,具有标准的索引计算
| 功能 | Heap(最大堆) | PriorityQueue(最小堆) |
|---|---|---|
| 主要用途 | 通用堆操作、堆排序 | 图算法(Dijkstra) |
| 堆类型 | 最大堆 | 最小堆 |
| 元素类型 | 通用 T,具有 Comparable | 元组 (distance, node) |
| 主要功能 | heap_sort() 方法 | decrease_key() 操作 |
| 位置跟踪 | 无 | 用于 O(1) 查找的 pos 字典 |
最大堆泛型实现
优先队列专用实现
来源: data_structures/heap/heap.py48-50 data_structures/heap/heap.py55-109 graphs/dijkstra_algorithm.py26-28 graphs/dijkstra_algorithm.py183-223
堆是一种多功能的数据结构,可有效支持查找最大/最小元素、插入和删除等操作。此存储库中的实现为需要这些操作的各种算法提供了坚实的基础。
堆数据结构在整个代码库中用于优先队列、图算法和排序等应用程序。理解堆的实现对于高效地使用这些算法至关重要。