📜  最小堆竞争编程的模板 (1)

📅  最后修改于: 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小的元素。具体操作如下:

  1. 构建一个大小为k的最小堆
  2. 将数组中前k个元素插入到最小堆中
  3. 遍历数组中剩余的元素,对于每个元素:
    1. 如果该元素大于等于最小堆中的最大元素,则跳过
    2. 否则,将该元素插入到最小堆中,并删除最小堆中的最大元素
  4. 返回最小堆中的所有元素即可

时间复杂度为O(nlogk),空间复杂度为O(k)。

总结

最小堆是一个非常有用的数据结构,在算法竞赛中也有广泛的应用。掌握最小堆的实现和应用,有助于提高编程能力和竞赛成绩。