📜  最小堆 stl - C++ (1)

📅  最后修改于: 2023-12-03 14:55:21.804000             🧑  作者: Mango

最小堆 STL - C++

最小堆是一种常见的数据结构,可以用来解决一些有趣的问题,例如找出前K个最大元素。在C++ STL中,我们可以使用priority_queue来实现最小堆,它是一个优先队列,并可以实现快速的插入和删除最小值的操作。在本文中,我们将介绍如何使用STL中的priority_queue来实现最小堆。

基本用法

首先,我们需要引入<queue>库头文件并定义一个priority_queue对象。以下是基本用法的示例代码:

#include <queue>
using namespace std;

priority_queue<int, vector<int>, greater<int>> minHeap;

上面的代码创建了一个以int为元素类型的最小堆,定义了一个名为minHeap的变量。第二个参数是一个向量,它提供了一种构建堆的常见方法。我们使用了std::greater<int>来定义比较函数,根据这个函数,最小的元素将被放置在堆的顶部。

现在,我们可以向最小堆中添加新的元素,并使用top()方法检索位于堆的顶部的元素。

minHeap.push(2);
minHeap.push(1);
minHeap.push(3);
int minValue = minHeap.top(); // 获取最小值
minHeap.pop(); // 删除最小值

push()方法用于将新元素添加到堆中,top()方法返回最小值,而pop()方法则删除堆的顶部元素。

注意,我们可以在堆的定义中使用不同的比较函数来将其转换为最大堆。所以priority_queue<int, vector<int>, greater<int>>是最小堆,而priority_queue<int, vector<int>, less<int>>是最大堆。

实际应用

最小堆可以用于解决各种有用的问题。例如,我们可以使用最小堆来找出未排序数组中的前K个最大元素。

vector<int> topKElements(vector<int>& nums, int k) {
    priority_queue<int, vector<int>, greater<int>> minHeap;
    for(int i = 0; i < nums.size(); i++) {
        minHeap.push(nums[i]);
        if(minHeap.size() > k) {
            minHeap.pop();
        }
    }
    
    vector<int> result;
    while(!minHeap.empty()) {
        result.push_back(minHeap.top());
        minHeap.pop();
    }
    return result;
}

在上述代码中,我们使用最小堆来维护一个大小为K的有序集,并在集中添加新元素时删除最小值。当所有元素都被添加后,我们可以从堆中检索最大的K个元素并将它们返回。

总结

在C++ STL中,priority_queue提供了一种简便的方法来实现最小堆。我们可以使用不同的比较函数轻松地将其转换为最大堆。最小堆可以用于解决许多有用的问题,例如找出前K个最大元素。希望这篇文章对你有所帮助!