堆的入门指南:面向初学者的通俗易懂讲解
发布时间: 2024-08-24 01:25:41 阅读量: 16 订阅数: 18
![堆的入门指南:面向初学者的通俗易懂讲解](https://img-blog.csdnimg.cn/img_convert/3a07945af087339273bfad5b12ded955.png)
# 1. 堆的基本概念和原理
堆是一种特殊的完全二叉树,其中每个节点的值都大于或等于其子节点的值。这种数据结构具有以下特点:
- **根节点:**堆中最大的元素(最小堆中为最小的元素)位于根节点。
- **二叉树:**堆是一种完全二叉树,即每个节点都有两个子节点,除了最底层的节点可能只有一个子节点。
- **堆序性:**堆中每个节点的值都大于或等于其子节点的值。
# 2. 堆的实现与操作
### 2.1 堆的实现方式
#### 2.1.1 二叉堆
二叉堆是一种完全二叉树,其中每个节点的值都大于或等于其子节点的值。二叉堆可以分为两种类型:最大堆和最小堆。
- 最大堆:每个节点的值都大于或等于其子节点的值。
- 最小堆:每个节点的值都小于或等于其子节点的值。
**实现代码:**
```python
class BinaryHeap:
def __init__(self, is_max_heap=True):
self.heap = []
self.is_max_heap = is_max_heap
def insert(self, value):
self.heap.append(value)
self._heapify_up(len(self.heap) - 1)
def delete(self):
if not self.heap:
return None
root = self.heap[0]
self.heap[0] = self.heap[-1]
self.heap.pop()
self._heapify_down(0)
return root
def find_max(self):
if not self.heap:
return None
return self.heap[0]
def find_min(self):
if not self.heap:
return None
return self.heap[0]
def _heapify_up(self, index):
while index > 0:
parent_index = (index - 1) // 2
if self.is_max_heap and self.heap[index] > self.heap[parent_index]:
self.heap[index], self.heap[parent_index] = self.heap[parent_index], self.heap[index]
elif not self.is_max_heap and self.heap[index] < self.heap[parent_index]:
self.heap[index], self.heap[parent_index] = self.heap[parent_index], self.heap[index]
index = parent_index
def _heapify_down(self, index):
while index < len(self.heap):
left_index = 2 * index + 1
right_index = 2 * index + 2
min_index = index
if left_index < len(self.heap) and self.heap[left_index] < self.heap[min_index]:
min_index = left_index
if right_index < len(self.heap) and self.heap[right_index] < self.heap[min_index]:
min_index = right_index
if min_index != index:
self.heap[index], self.heap[min_index] = self.heap[min_index], self.heap[index]
index = min_index
```
**参数说明:**
- `is_max_heap`: 布尔值,指示堆是最大堆还是最小堆。
**代码逻辑分析:**
- `insert` 方法:将元素插入堆中,并通过 `_heapify_up` 方法调整堆以保持堆的性质。
- `delete` 方法:删除堆中的根节点,并通过 `_heapify_down` 方法调整堆以保持堆的性质。
- `find_max` 和 `find_min` 方法:返回堆中的最大值或最小值。
- `_heapify_up` 方法:将堆中新插入的元素向上调整到正确的位置。
- `_heapify_down` 方法:将堆中删除根节点后的堆向下调整到正确的位置。
#### 2.1.2 斐波那契堆
斐波那契堆是一种松散的堆结构,它由一组有序的树组成。斐波那契堆的每个节点都有一个键值、一个度(子节点的数量)和一个标记(表示该节点是否已删除)。
**实现代码:**
```python
class FibonacciHeap:
def __init__(self):
self.min_node = None
self.num_nodes = 0
def insert(self, value):
new_node = FibonacciHeapNode(value)
self._insert_node(new_node)
self.num_nodes += 1
def delete(self, node):
if node == self.min_node:
self._remove_min_node()
else:
self._remove_node(node)
self.num_nodes -= 1
def find_min(self):
return self.min_node
def _insert_node(self, node):
node.left = node
node.right = node
if self.min_node is None:
self.min_node = node
else:
self._insert_after(node, self.min_node)
if node.value < self.min_node.value:
self.min_node = node
def _remove_min_node(self):
if self.min_node is not None:
self._remove_node(self.min_node)
if self.min_node.right == self.min_node:
self.min_node = None
else:
self.min_node = self.min_node.right
self._consolidate()
def _remove_node(self, node):
if node.left == node:
node.left = None
node.right = None
else:
node.left.right = node.right
node.right.left = node.left
if node == self.min_node:
self.m
```
0
0