当前位置: 首页 > news >正文

多元组优先队列

C++ 多元组优先队列详解

定义与核心价值

多元组优先队列是一种特殊的优先队列,其元素为包含多个字段的复合结构(如二元组、三元组等),通过自定义多维度比较规则实现元素的有序管理。

核心价值:解决需要综合多个条件(维度)决定优先级的场景,例如:

  • 任务调度:(优先级, 截止时间, 任务ID)
  • 路径规划:(总距离, 时间开销, 节点ID)

实现方式对比

实现方式适用场景优点缺点
自定义struct+重载operator<多元组字段多、逻辑复杂可读性强,字段访问直观需额外定义结构体
std::tuple+自定义比较器简单多元组(2-3个字段)无需自定义结构体,简洁字段访问依赖索引,可读性较差

实现方法详解

方法1:自定义struct+重载operator<

步骤思维导图
- 定义结构体
- 声明多元组字段(如a, b, c)
- 实现构造函数
- 重载<运算符
- 按第一关键字比较
- 若相等,按第二关键字比较
- 以此类推
- 使用priority_queue
- 声明队列:priority_queue<结构体名> pq
- 插入元素:pq.emplace(参数)
- 访问队首:pq.top()
- 弹出元素:pq.pop()

思维导图

代码示例(二元组排序)

需求:优先按a降序,a相等则按b升序

#include <queue>
#include <iostream>
using namespace std;struct Tuple {int a;  // 第一关键字int b;  // 第二关键字// 构造函数Tuple(int a_, int b_) : a(a_), b(b_) {}// 重载<运算符bool operator<(const Tuple& other) const {if (a != other.a) {// a越大优先级越高:当前a < other.a时,other优先级更高return a < other.a;  } else {// b越小优先级越高:当前b > other.b时,other优先级更高return b > other.b;  }}
};int main() {priority_queue<Tuple> pq;pq.emplace(3, 2);pq.emplace(5, 1);pq.emplace(5, 0);while (!pq.empty()) {auto top = pq.top();pq.pop();cout << "a=" << top.a << ", b=" << top.b << endl;}return 0;
}

输出结果:

a=5, b=0
a=5, b=1
a=3, b=2

方法2:std::tuple+自定义比较器

步骤思维导图
- 定义比较器结构体
- 重载()运算符
- 实现多元组比较逻辑
- 声明优先队列
- 模板参数:tuple类型、容器类型、比较器
- 操作队列
- 插入:emplace(元素1, 元素2, ...)
- 访问:get<索引>(pq.top())
- 弹出:pq.pop()

思维导图

代码示例(三元组排序)

需求:按x升序→y降序→z升序

#include <queue>
#include <tuple>
#include <iostream>
using namespace std;// 自定义比较器
struct Compare {bool operator()(const tuple<int, int, int>& t1, const tuple<int, int, int>& t2) const {int x1 = get<0>(t1), y1 = get<1>(t1), z1 = get<2>(t1);int x2 = get<0>(t2), y2 = get<1>(t2), z2 = get<2>(t2);if (x1 != x2) return x1 > x2;  // x升序if (y1 != y2) return y1 < y2;  // y降序return z1 > z2;                // z升序}
};int main() {// 声明三元组优先队列priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, Compare> pq;pq.emplace(2, 5, 3);pq.emplace(1, 8, 1);pq.emplace(1, 9, 2);while (!pq.empty()) {auto [x, y, z] = pq.top();  // C++17结构化绑定pq.pop();cout << "x=" << x << ", y=" << y << ", z=" << z << endl;}return 0;
}

输出结果:

x=1, y=9, z=2
x=1, y=8, z=1
x=2, y=5, z=3

优先级比较逻辑解析

优先队列的核心是比较器的逻辑设计,对于两个多元组T1=(f1,f2,...,fn)T1=(f_1, f_2, ..., f_n)T1=(f1,f2,...,fn)T2=(g1,g2,...,gn)T2=(g_1, g_2, ..., g_n)T2=(g1,g2,...,gn)

  1. 从第一个字段开始比较:若f1f_1f1g1g_1g1的优先级可区分,则直接返回结果
  2. f1=g1f_1 = g_1f1=g1,则比较第二个字段f2f_2f2g2g_2g2
  3. 以此类推,直到找到可区分优先级的字段

数学描述:
T1 优先级高于 T2  ⟺  ∃k,∀i<k:fi=gi 且 fk 优先级高于 gk T1 \text{ 优先级高于 } T2 \iff \exists k, \forall i < k: f_i = g_i \text{ 且 } f_k \text{ 优先级高于 } g_k T1 优先级高于 T2k,i<k:fi=gi  fk 优先级高于 gk

复杂度分析

操作时间复杂度说明
插入元素O(log⁡n)O(\log n)O(logn)n为队列元素数,比较操作增加常数项
弹出元素O(log⁡n)O(\log n)O(logn)同上
访问队首O(1)O(1)O(1)直接返回堆顶元素

空间复杂度O(n)O(n)O(n),需存储所有元素

典型应用场景

场景多元组设计比较规则
任务调度(优先级, 截止时间, 任务ID)优先级降序→截止时间升序
切割木棍问题(长度, 数量)长度降序(优先切割最长木棍)
Dijkstra算法扩展(总距离, 时间, 节点)总距离升序→时间升序
数据流Top-K(指标1, 指标2, 数据)指标1降序→指标2降序

注意事项

  1. 比较器逻辑priority_queue默认是大根堆,比较器返回true表示左侧元素优先级低于右侧
  2. 字段访问
  • 自定义struct:直接通过成员变量访问(如top.a
  • std::tuple:通过get<索引>(tuple)访问(索引从0开始)
  1. C++版本兼容
  • 结构化绑定(auto [x,y,z])需C++17及以上
  • 自定义比较器在C++11及以上支持

通过合理设计多元组结构和比较规则,可高效解决各类多维度优先级问题,是C++中处理复杂排序场景的重要工具。

http://www.dtcms.com/a/414898.html

相关文章:

  • 同一个域名两个网站wordpress内页锚文本
  • 建设银行官方网站首页企业淘宝客网站免费模板下载
  • 《告别 “会用不会讲”:C++ string 底层原理拆解 + 手撕实现,面试 / 开发都适用》
  • 手机怎样设计网站建设无锡连夜发布最新通告
  • 18互联网站做网站程序黑马大数据培训
  • Redis面试问题集
  • Qt常用控件之QLineEdit
  • 在docker里面安装nextcloud
  • 3.6、操作系统
  • 2025最新centos7安装mysql8 相关 服务器配置 纯命令行操作 保姆级教程
  • Hadess入门到实战(4) - 如何管理Docker制品
  • Python 数学公式构建海洋不明生物(好像是水母)动画 - 傅里叶合成模拟复杂波形
  • 泰州建设企业网站福州企业免费建站
  • 美妆网站模板html5网站开发语言
  • 深度剖析OpenHarmony AI Engine:开发板端侧大模型推理插件机制全链路拆解
  • 链表的核心思想
  • Matlab通过GUI实现点云的坡度滤波(附最简版)
  • GESP8级——AT_icpc2013spring_e 最小生成树题解
  • Qt窗口与对话框开发指南
  • 湖北平台网站建设哪家好有经验的邵阳网站建设
  • 33.Linux iCSCI 服务
  • 国内优秀网页设计网站网站建设流程共有几个阶段
  • 基于物联网的个人健康管理系统(论文+源码)
  • 一个网站可以做几个关键词网站建设济南
  • Linux日志分析入门:使用grep和awk发现服务器异常访问
  • 435. 无重叠区间
  • 2025制造业研发流程提效指南:从审批卡顿到协同闭环,3类系统选型全解析
  • 文件夹随机分配 把文件夹随机分配到指定的文件夹中
  • 104.二叉树的最大深度(二叉树算法题)
  • 宿迁做网站的怎样制作h5