c++优先队列用法知识点总结

yizhihongxing

C++优先队列用法知识点总结

优先队列简介

优先队列是一个具有优先级的队列,可以确保元素按照一定的优先级顺序出队。C++中的优先队列底层使用堆实现,因此其时间复杂度为O(logn)。

优先队列的基本操作

插入一个元素

C++中,插入一个元素可以使用push()函数。

#include <queue>

priority_queue<int> my_pq; // 定义一个默认降序排列的优先队列
my_pq.push(10); // 向优先队列插入元素10

弹出队首元素

优先队列弹出队首元素可以使用pop()函数。

#include <queue>

priority_queue<int> my_pq;
my_pq.push(10);
my_pq.push(20);
my_pq.pop(); // 弹出队首元素10

获取队首元素

优先队列获取队首元素可以使用top()函数。

#include <queue>

priority_queue<int> my_pq;
my_pq.push(10);
my_pq.push(20);
int front_elem = my_pq.top(); // 获取队首元素20

优先队列的排序方式

默认降序

默认情况下,C++中的优先队列是按照元素的大小进行降序排列的。

#include <queue>

priority_queue<int> my_pq;
my_pq.push(10);
my_pq.push(20);
my_pq.push(5);
// 输出20 10 5
while (!my_pq.empty()) {
    cout << my_pq.top() << " ";
    my_pq.pop();
}

升序排列

我们可以通过定义自定义结构体或使用函数对象改变默认的降序排列,从而实现升序排列。

#include <queue>

struct cmp {
    bool operator() (int a, int b) {
        return a > b;
    }
};

priority_queue<int, vector<int>, cmp> my_pq;
my_pq.push(10);
my_pq.push(20);
my_pq.push(5);
// 输出5 10 20
while (!my_pq.empty()) {
    cout << my_pq.top() << " ";
    my_pq.pop();
}

复杂对象的排序

对于复杂对象,我们需要定义一个比较函数来完成排序。

#include <queue>
#include <string>

struct person {
    string name;
    int age;
};

struct cmp {
    bool operator() (const person& a, const person& b) {
        return a.age > b.age; // 按照年龄从小到大排列
    }
};

priority_queue<person, vector<person>, cmp> my_pq;
my_pq.push({"Mike", 25});
my_pq.push({"Tom", 18});
my_pq.push({"Jerry", 29});
// 按照年龄顺序输出Tom, Mike, Jerry
while (!my_pq.empty()) {
    cout << my_pq.top().name << " ";
    my_pq.pop();
}

示例说明

示例1

题目描述:从一个大小为n的整数数组中选择k个数,使它们的和最大。

首先,我们可以把这个数组放入一个降序排序的优先队列中。按照优先队列的定义,队首元素是最大的,这样我们可以从队列中弹出前k个元素,它们的和就是我们要的最大和。

#include <queue>
#include <vector>

using namespace std;

int find_max_sum(vector<int>& nums, int k) {
    priority_queue<int> my_pq(nums.begin(), nums.end());

    int sum = 0;
    for (int i = 0; i < k; i++) {
        sum += my_pq.top();
        my_pq.pop();
    }

    return sum;
}

int main() {
    vector<int> nums = {1, 4, 2, 3, 5, 7, 6};
    int k = 3;
    int max_sum = find_max_sum(nums, k); // 返回18
    return 0;
}

示例2

题目描述:在一个无序的序列中,找到第k大的数。

这个问题可以使用降序排列的小根堆来解决。首先,将数组中的前k个数放入小根堆中;然后遍历剩余的数,如果遇到比堆顶元素大的数,就将其弹出,将该数插入堆中。最后,堆顶元素就是第k大的数。

#include <queue>
#include <vector>

using namespace std;

int find_kth_largest(vector<int>& nums, int k) {
    priority_queue<int, vector<int>, greater<int>> my_pq(nums.begin(), nums.begin() + k);

    for (int i = k; i < nums.size(); i++) {
        if (nums[i] > my_pq.top()) {
            my_pq.pop();
            my_pq.push(nums[i]);
        }
    }

    return my_pq.top();
}

int main() {
    vector<int> nums = {1, 4, 2, 3, 5, 7, 6};
    int k = 3;
    int kth_largest = find_kth_largest(nums, k); // 返回5
    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++优先队列用法知识点总结 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • vmware虚拟机占用电脑内存资源怎么办 vmware虚拟机严重占用空间解决方法

    解决VMware虚拟机占用电脑内存资源的方法 1. 调整虚拟机内存分配 打开VMware虚拟机,选择要调整内存的虚拟机。 在虚拟机菜单栏中选择“虚拟机(V)”,然后选择“虚拟机设置(S)”。 在“硬件”选项卡下,选择“内存”。 在“内存”设置中,可以通过拖动滑块或手动输入数值来调整虚拟机的内存分配。 点击“确定”保存设置并关闭设置窗口。 示例说明1:如果你的…

    other 2023年8月1日
    00
  • osg + cuda

    以下是osg+cuda的完整攻略,包含osg和cuda的基本介绍、osg中使用cuda的方法、以及两个示例说明。 OSG+cuda的介绍 OpenSceneGraph(OSG)是开源的3D图形引擎,支持多种平台和多种编程语言。CUDA是NVIDIA开发的一种并行计算平台和编程模型,用于GPU加速计算。OSG+cuda的组合可以实现高效的3D图形渲染和GPU加…

    other 2023年5月7日
    00
  • Python递归函数特点及原理解析

    Python递归函数可以理解为在函数内部调用函数本身的过程。递归函数常常用于解决具有递归结构的问题,如数学中的阶乘、斐波那契数列等。Python递归函数的特点及原理见下: 特点: 调用本身:递归函数必须调用函数本身,否则就无法完成递归。 有限制条件:递归函数必须有限制条件,否则会一直调用自身,陷入死循环导致程序崩溃或栈溢出。 原理: 最终情况:递归算法必须包…

    other 2023年6月27日
    00
  • iOS11描述文件下载地址在哪 iOS11描述文件安装教程和下载地址介绍

    iOS 11描述文件下载地址和安装教程 如果你想在iOS设备上安装iOS 11描述文件,下面是一个完整的攻略,包括描述文件的下载地址和安装教程。 下载地址 你可以从以下两个来源之一下载iOS 11描述文件: 苹果开发者网站:你可以在苹果开发者网站上找到iOS 11描述文件的下载链接。首先,你需要注册一个苹果开发者账号。一旦你有了账号,你可以登录并导航到\”D…

    other 2023年8月4日
    00
  • 方正字库中英文、文件名对照表

    方正字库是一种广泛使用的字体,可以用于中英文排版。有时候我们需要查找一种特定的字体文件,但是文件命名并不直观,这时候方正字库中英文、文件名对照表就派上用场了。下面是详细的攻略。 什么是方正字库中英文、文件名对照表 方正字库中英文、文件名对照表是方正公司编制的一份表格,其中列出了方正字库中每种字体的中英文名称,以及其对应的文件名。该表格可以帮助用户快速查找需要…

    other 2023年6月26日
    00
  • Java由浅入深讲解继承上

    Java继承是面向对象编程的核心概念之一,它允许类继承特定行为和属性,这样子类可以从超类继承这些行为和属性,而无需重新实现或定义一遍。接下来,我们将为你提供“Java由浅入深讲解继承上”的完整攻略,包括以下几个方面: 什么是继承? 继承在Java中是指派生类继承其基类的特定属性和方法。派生类继承基类的构造函数、字段和方法,包括公共、受保护和包级私有成员。 J…

    other 2023年6月26日
    00
  • 使用汇编实现字符串的大小写转换

    使用汇编实现字符串的大小写转换攻略 本攻略将详细介绍如何使用汇编语言来实现字符串的大小写转换。下面是完整的攻略过程,包括两个示例说明。 步骤1:准备工作 在开始之前,确保你已经安装了适当的汇编工具,例如NASM(Netwide Assembler)。你还需要一个文本编辑器来编写汇编代码。 步骤2:编写汇编代码 首先,创建一个新的汇编文件,例如convert_…

    other 2023年8月16日
    00
  • 微软拼音输入法无法记忆自定义输入词语原因及解决方法介绍

    微软拼音输入法无法记忆自定义输入词语原因及解决方法介绍 原因分析 微软拼音输入法无法记忆自定义输入词语的原因是它的本地词库文件出现了错误,导致无法正常工作。这种错误可能是由于输入法版本升级或者文件损坏导致的。 除此之外,有些杀毒软件和安全防护软件也可能会误将微软拼音输入法的本地词库文件当成病毒或木马进行删除或者隔离,也会导致输入法无法正常工作。 解决方法介绍…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部