📅  最后修改于: 2023-12-03 14:55:21.852000             🧑  作者: Mango
最小堆是一种基于树结构的数据结构,具有以下特点:
最小堆在计算机领域中有广泛的应用,例如优先队列、Dijkstra算法等。
最小堆可以用数组或链表等数据结构来实现。以下代码片段是一个基于数组的最小堆的实现:
#include <iostream>
#include <vector>
using namespace std;
class MinHeap {
vector<int> heap;
public:
MinHeap() {}
void push(int val) {
heap.push_back(val);
int index = heap.size() - 1;
while (index != 0 && heap[index] < heap[(index - 1) / 2]) {
swap(heap[index], heap[(index - 1) / 2]);
index = (index - 1) / 2;
}
}
void pop() {
if (heap.empty()) return;
heap[0] = heap.back();
heap.pop_back();
if (heap.empty()) return;
int index = 0;
while (index * 2 + 1 < heap.size()) {
int child = index * 2 + 1;
if (child + 1 < heap.size() && heap[child + 1] < heap[child]) {
child++;
}
if (heap[index] > heap[child]) {
swap(heap[index], heap[child]);
index = child;
} else {
break;
}
}
}
int top() {
return heap.empty() ? -1 : heap[0];
}
bool empty() {
return heap.empty();
}
int size() {
return heap.size();
}
void print() {
for (int i = 0; i < heap.size(); i++) {
cout << heap[i] << " ";
}
cout << endl;
}
};
int main() {
MinHeap min_heap;
min_heap.push(5);
min_heap.push(1);
min_heap.push(3);
min_heap.push(2);
min_heap.push(4);
min_heap.print(); // 1 2 3 5 4
min_heap.pop();
min_heap.print(); // 2 4 3 5
cout << min_heap.top() << endl; // 2
return 0;
}
最小堆竞争编程是一种比赛方式,旨在提高竞赛者对最小堆的理解和掌握。在比赛中,参赛者需要在很短的时间内解决一系列与最小堆相关的问题,例如插入、删除最小元素、找到第k小的元素等。
以下是一个示例问题:
给定一个长度为n的数组,找到其中前k小的元素。
解决这个问题,可以使用最小堆来维护前k小的元素。具体操作如下:
时间复杂度为O(nlogk),空间复杂度为O(k)。
最小堆是一个非常有用的数据结构,在算法竞赛中也有广泛的应用。掌握最小堆的实现和应用,有助于提高编程能力和竞赛成绩。