首页 > 其他分享 >大顶堆,小顶堆--优先队列,示例

大顶堆,小顶堆--优先队列,示例

时间:2024-03-03 16:45:44浏览次数:22  
标签:std 大顶 nums -- 示例 heap 小顶 节点

有一个数组,要求找出最大的3个数,最小的4个数。

 

小顶堆,从大到小排序,筛选最小的N个数。

    // 创建一个小顶堆
    std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap;

 

 

大顶堆,从小到大排序,筛选最大的N个数。

 // 创建一个大顶堆
    std::priority_queue<int, std::vector<int>, std::less<int>> max_heap;
    小顶堆:
         1
       /   \
      3     2
     / \   / \
    7   8 5   4

    大顶堆:
         8
       /   \
      7     5
     / \   / \
    3   1 2   4

 

小顶堆和大顶堆都是二叉堆的一种形式,是一种用于实现优先队列的数据结构。它们的区别在于元素的排列方式和根节点的值。

  1. 小顶堆(Min Heap):在小顶堆中,每个节点的值都小于或等于其子节点的值。换句话说,堆顶元素是最小值,根节点的值小于其左右子节点的值。小顶堆的性质使得堆顶元素是优先级最低的。

  2. 大顶堆(Max Heap):在大顶堆中,每个节点的值都大于或等于其子节点的值。换句话说,堆顶元素是最大值,根节点的值大于其左右子节点的值。大顶堆的性质使得堆顶元素是优先级最高的。

在小顶堆中,根节点的值最小,且每个节点的值都小于或等于其子节点的值。而在大顶堆中,根节点的值最大,且每个节点的值都大于或等于其子节点的值

 

#include <iostream>
#include <vector>
#include <queue>

// 定义一个函数来创建小顶堆并筛选出最小的 4 个数
std::vector<int> findFourSmallestNumbers(const std::vector<int>& nums) {
    // 创建一个小顶堆
    std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap;

    // 将数组中的元素插入到小顶堆中
    for (int i = 0; i< nums.size(); ++i) {
        min_heap.push(nums[i]);
    }

    // 从堆中依次取出最小的 4 个数
    std::vector<int> result;
    for (int i = 0; i < 4; ++i) {
        result.push_back(min_heap.top());
        min_heap.pop();
    }

    return result;
}

// 定义一个函数来创建大顶堆并筛选出最大的 3 个数
std::vector<int> findThreeLargestNumbers(const std::vector<int>& nums) {
    // 创建一个大顶堆
    std::priority_queue<int, std::vector<int>, std::less<int>> max_heap;

    // 将数组中的元素插入到大顶堆中
    for (int i = 0; i < nums.size(); ++i) {
        max_heap.push(nums[i]);
    }

    // 从堆中依次取出最大的 3 个数
    std::vector<int> result;
    for (int i = 0; i < 3; ++i) {
        result.push_back(max_heap.top());
        max_heap.pop();
    }

    return result;
}

int main() {
    std::vector<int> nums = {3, 1, 4, 10, 5, 19, 22, 60, 5, 38, 5, 8, 999, 7, 9, 31, 2};

    // 找到最小的 4 个数
    std::vector<int> fourSmallestNumbers = findFourSmallestNumbers(nums);
    std::cout << "最小的 4 个数: ";
    for (int num : fourSmallestNumbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 找到最大的 3 个数
    std::vector<int> threeLargestNumbers = findThreeLargestNumbers(nums);
    std::cout << "最大的 3 个数: ";
    for (int num : threeLargestNumbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

 

 

from chat-gpt:

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

void findLargestAndSmallest(vector<int> &nums) {
    // Min heap
    priority_queue<int, vector<int>, greater<int>> minHeap;
    // Max heap
    priority_queue<int> maxHeap;

    // Push all elements to both heaps
    for (int num : nums) {
        minHeap.push(num);
        maxHeap.push(num);
    }

    // Find the largest 3 numbers
    cout << "Largest 3 numbers: ";
    for (int i = 0; i < 3; ++i) {
        cout << maxHeap.top() << " ";
        maxHeap.pop();
    }
    cout << endl;

    // Find the smallest 4 numbers
    cout << "Smallest 4 numbers: ";
    for (int i = 0; i < 4; ++i) {
        cout << minHeap.top() << " ";
        minHeap.pop();
    }
    cout << endl;
}

int main() {
    // Example array of 20 integers (random)
    vector<int> nums = {12, 34, 56, 78, 90, 23, 45, 67, 89, 10, 32, 54, 76, 98, 21, 43, 65, 87, 9, 87};

    findLargestAndSmallest(nums);

    return 0;
}

 

标签:std,大顶,nums,--,示例,heap,小顶,节点
From: https://www.cnblogs.com/music-liang/p/18050238

相关文章

  • C++ 函数调用运算符 () 重载
    函数调用运算符()可以被重载用于类的对象。当重载()时,您不是创造了一种新的调用函数的方式,相反地,这是创建一个可以传递任意数目参数的运算符函数。1#include<iostream>2usingnamespacestd;3classDistance4{5private:6intfeet;/......
  • 断电引起文件scn异常数据库恢复---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:断电引起文件scn异常数据库恢复作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]由于异常断电,数据库最初启动报错FriMar0108:41:172024ALTERDATABASE  MOUNTSucces......
  • 助教总结报告
    一、助教工作的具体职责和任务1.了解进度与知识点每周我都会与老师进行交流,以了解教学的进度和相关知识点。这样我可以为接下来的课程做好充分的准备。2.课前准备在课前,我会根据学生提交的作业情况,向老师反馈作业的批改结果,并提供个人的建议。我会确保自己熟练掌握了相关的知识......
  • Paper Reading: Density‑based weighting for imbalanced regression
    目录研究动机文章贡献本文方法DenseWeight稀有度度量权重函数DenseLoss实验结果实验整体的设置合成数据集实验实验设置实验结果对比实验实验设置降水量预测任务优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不到位的地方。......
  • 根据建表sql语句生成go的struct代码工具
    sql2struct一个根据"CREATETABLE"建表语句生成对应的Go语言结构体的工具,暂只支持MySQL表。开发目的在github中找到一些sql2struct,但要么是chrome插件,要么是在线工具,要么是需要连接MySQL,不是很方便。本sql2struct根据SQL文件中的建表语句来生成Go的struct,可集成......
  • C++ 赋值运算符'='重载
    C++拷贝构造函数(初学有点难理解)就像其他运算符一样,可以重载赋值运算符(=),用于创建一个对象,比如拷贝构造函数。1#include<iostream>2usingnamespacestd;3classDistance4{5private:6intfeet;//0到无穷7intinches;......
  • linux基于STM32CUBE IDE搭建stm32开发环境
    1.安装STM32CUBEMX安装地址https://www.st.com/zh/development-tools/stm32cubemx.html2.安装STM32CUBEIDE安装地址https://www.st.com/zh/development-tools/stm32cubeide.html3.安装烧写相关软件3.1安装openocd方法1:命令安装(不推荐,因为默认安装的是0.10.0,不支持......
  • 多线程限流工具类-Semaphore
    Semaphore介绍Semaphore(信号量)是JAVA多线程中的一个工具类,它可以通过指定参数来控制执行线程数量,一般用于限流访问某个资源时使用。Semaphore使用示例需求场景:用一个核心线程数为6,最大线程数为20的线程池执行任务,但是要求最多只能同时运行3个线程代码:publicclassdemo{......
  • 最大字段和,区间矩阵
    最大字段和原题链接:P1115最大子段和-洛谷|计算机科学教育新生态(luogu.com.cn)解析:经典动态规划:最大子数组问题-知乎(zhihu.com)我写的代码:#include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;constintN=2e5+10;inta[N],dp[N]......
  • PDF标准详解(二)——PDF 对象
    上一篇文章我们介绍了一个PDF文档应该包含的最基本的结构,并且手写了一个最简单的“HelloWorld”的PDF文档。后面我们介绍新的PDF标准给出示例时将以这个文档为基础,而不再给出完整的文档示例,小伙伴想自己测试可以根据上一节的文档来进行配置。对象上一节我们看到一个个奇奇怪......