c/c++ | 优先队列 | 大根堆、小根堆

什么是大根堆、小根堆呢?
大根堆,就是一个节点个数为k的二叉树结构,节点元素的val 按照根左右的顺序,所以根节点上的val是最大的值,而 最后的孩子节点中最右边的节点的val 是最小的值。
小根堆,就是元素的值排列相反,根节点上的val 是最小的值,最后孩子节点中的最右边的节点的val 是最大的值
有什么应用吗?常常在找前 k 个最大值/最小值 数据存储等场景
注意遍历 大根堆/小根堆 的元素 需要 top、pop两个函数结合使用

/*
大根堆 参考
*/
#include <iostream>
#include <vector>
#include <algorithm>  // 包含 std::make_heap, std::push_heap, std::pop_heap 等函数

template <typename T, typename Container = std::vector<T>, typename Compare = std::less<typename Container::value_type>>
class priority_queue {
public:
    // 构造函数
    priority_queue(const Compare& comp = Compare(), const Container& ctnr = Container())
        : c(ctnr), comp(comp) {
        std::make_heap(c.begin(), c.end(), comp);
    }

    // 插入元素
    void push(const T& value) {
        c.push_back(value);
        std::push_heap(c.begin(), c.end(), comp);
    }

    // 移除堆顶元素
    void pop() {
        std::pop_heap(c.begin(), c.end(), comp);
        c.pop_back();
    }

    // 访问堆顶元素
    const T& top() const {
        return c.front();
    }

    // 判断堆是否为空
    bool empty() const {
        return c.empty();
    }

    // 获取堆中元素个数
    std::size_t size() const {
        return c.size();
    }

private:
    Container c;       // 存储元素的容器
    Compare comp;      // 比较函数对象
};

int main() {
    priority_queue<int> maxHeap;  // 默认是大根堆

    maxHeap.push(3);
    maxHeap.push(1);
    maxHeap.push(4);
    maxHeap.push(1);
    maxHeap.push(5);

    std::cout << "Max Heap elements: ";
    while (!maxHeap.empty()) {
        std::cout << maxHeap.top() << " ";
        maxHeap.pop();
    }
    std::cout << std::endl;

    return 0;
}

/*
小根堆  参考
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>  // std::greater

template <typename T, typename Container = std::vector<T>, typename Compare = std::less<typename Container::value_type>>
class priority_queue {
public:
    // 构造函数
    priority_queue(const Compare& comp = Compare(), const Container& ctnr = Container())
        : c(ctnr), comp(comp) {
        std::make_heap(c.begin(), c.end(), comp);
    }

    // 插入元素
    void push(const T& value) {
        c.push_back(value);
        std::push_heap(c.begin(), c.end(), comp);
    }

    // 移除堆顶元素
    void pop() {
        std::pop_heap(c.begin(), c.end(), comp);
        c.pop_back();
    }

    // 访问堆顶元素
    const T& top() const {
        return c.front();
    }

    // 判断堆是否为空
    bool empty() const {
        return c.empty();
    }

    // 获取堆中元素个数
    std::size_t size() const {
        return c.size();
    }

private:
    Container c;       // 存储元素的容器
    Compare comp;      // 比较函数对象
};

int main() {
    // 使用 std::greater 作为比较函数,构造小根堆
    priority_queue<int, std::vector<int>, std::greater<int>> minHeap;

    minHeap.push(3);
    minHeap.push(1);
    minHeap.push(4);
    minHeap.push(1);
    minHeap.push(5);

    std::cout << "Min Heap elements: ";
    while (!minHeap.empty()) {
        std::cout << minHeap.top() << " ";
        minHeap.pop();
    }
    std::cout << std::endl;

    return 0;
}

#include <iostream>
#include <queue>
using namespace std;
int my_array[10] = {3,5,6,2,1,-8,10,4,-7,-6};
int main()
{
    //priority_queue<int, vector<int>, greater<int>> q;     //小根堆  3 2 1
    priority_queue<int> q;          //  大根堆  1 2 3
 
    for (int i=0;i<10;i++)
    {
        q.push(my_array[i]);
    }
 
    for (int i = 0; i < 10; i++)
    {
        cout << "order: " << q.top() << endl;
        q.pop();
    }
    
    return 0;
}

相关推荐

  1. c/c++ | 优先队列 |

    2024-02-02 11:06:03       56 阅读
  2. 2024-02-02 11:06:03       53 阅读
  3. 【数据结构】的应用(

    2024-02-02 11:06:03       52 阅读
  4. 的实现和排序

    2024-02-02 11:06:03       25 阅读
  5. leetcode 2386. 找出数组的第 K 和【

    2024-02-02 11:06:03       44 阅读
  6. 存放自定义数据类型的/定义

    2024-02-02 11:06:03       44 阅读
  7. 算法:优先队列

    2024-02-02 11:06:03       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-02 11:06:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-02 11:06:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-02 11:06:03       82 阅读
  4. Python语言-面向对象

    2024-02-02 11:06:03       91 阅读

热门阅读

  1. 【Cocos入门】AudioEngine函数的使用

    2024-02-02 11:06:03       55 阅读
  2. 免交互 、 字符处理与高级变量

    2024-02-02 11:06:03       38 阅读
  3. Django_项目基本配置

    2024-02-02 11:06:03       53 阅读
  4. LVS负载均衡对udp流量进行参数调整一例

    2024-02-02 11:06:03       48 阅读
  5. 使用Vue-Grid-Layout实现自定义工作台

    2024-02-02 11:06:03       51 阅读