返回
堆结构解密:用它轻松搞定最大值、最小值
前端
2023-09-04 14:32:00
堆结构:数据结构中的高效帮手
在计算机科学中,堆是一种特殊的数据结构,具有以下特点:
- 完全二叉树: 堆结构呈现完全二叉树的形状,其中每个节点都有零个或两个子节点。
- 最大堆: 父节点的值大于或等于其子节点的值,形成一个最大堆。
- 最小堆: 父节点的值小于或等于其子节点的值,形成一个最小堆。
最小堆实现:分步拆解
以下是用 C++ 语言实现最小堆结构的步骤:
创建最小堆
class MinHeap {
public:
vector<int> heap;
MinHeap(vector<int> arr) {
heap = arr;
buildMinHeap();
}
void buildMinHeap() {
for (int i = heap.size() / 2 - 1; i >= 0; i--) {
minHeapify(i);
}
}
void minHeapify(int i) {
int smallest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < heap.size() && heap[left] < heap[smallest]) {
smallest = left;
}
if (right < heap.size() && heap[right] < heap[smallest]) {
smallest = right;
}
if (smallest != i) {
swap(heap[i], heap[smallest]);
minHeapify(smallest);
}
}
};
插入元素
void insert(int key) {
heap.push_back(key);
int i = heap.size() - 1;
while (i > 0 && heap[i] < heap[parent(i)]) {
swap(heap[i], heap[parent(i)]);
i = parent(i);
}
}
删除最小元素
int extractMin() {
if (heap.size() == 1) {
int root = heap[0];
heap.pop_back();
return root;
}
int root = heap[0];
heap[0] = heap[heap.size() - 1];
heap.pop_back();
minHeapify(0);
return root;
}
应用场景:优先级队列
堆结构在计算机科学中广泛应用,其中一个典型应用是实现优先级队列。优先级队列是一种特殊的数据结构,其中元素按优先级排序,优先级高的元素可以优先出队。
最小堆实现的优先级队列:
- 入队操作:将元素插入最小堆,时间复杂度为 O(log n)。
- 出队操作:删除最小元素,时间复杂度为 O(log n)。
结语
堆结构是一种高效的数据结构,在许多计算机科学问题中都有着广泛的应用。通过本文对最小堆结构的实现,希望你能深入理解堆结构的工作原理。通过实践,你将能够灵活运用堆结构解决实际问题,在编程实践中游刃有余。