当前位置:首页 > C++知识 > 正文内容

【数据结构】优先队列(1)

亿万年的星光4个月前 (06-20)C++知识408

优先队列(Priority Queue)是一种特殊的队列,它 不遵循“先进先出”(FIFO) 的原则,而是 按照优先级(Priority) 来出队。优先级高的元素 先出队,优先级低的元素 后出队


1. 优先队列的特点

特性说明
按优先级出队不是“先进先出”,而是“优先级高先出”
动态调整顺序插入新元素时,队列会自动调整顺序
常用于高效获取最值适合快速获取 最大值最小值


2. 优先队列的实现方式

优先队列通常可以用 堆(Heap) 来实现,因为堆能高效地维护元素的优先级顺序。

实现方式时间复杂度(插入)时间复杂度(删除)适用场景
数组(无序)O(1)O(n)(遍历找最值)简单但低效
有序数组O(n)(插入排序)O(1)适用于静态数据
二叉堆(Binary Heap)O(log n)O(log n)最常用
斐波那契堆(Fibonacci Heap)O(1)(摊还)O(log n)高级优化

最常用的是二叉堆(Binary Heap),因为它实现简单且效率较高。


3. 优先队列的操作

操作描述时间复杂度(二叉堆)
insert(e) / push(e)插入元素O(log n)
deleteMax() / deleteMin()删除最高/最低优先级元素O(log n)
peek() / top()查看最高/最低优先级元素O(1)
size()返回队列大小O(1)
isEmpty()判断是否为空O(1)


4. 优先队列的应用

优先队列在算法和实际开发中有广泛的应用,例如:

  1. 任务调度

    • 操作系统按优先级执行任务(如高优先级进程先执行)。

  2. Dijkstra 最短路径算法

    • 用优先队列高效获取当前最短路径节点。

  3. Huffman 编码(数据压缩)

    • 优先合并频率最小的字符。

  4. 合并 K 个有序链表

    • 用优先队列快速获取最小节点。

  5. 游戏 AI(如 A 寻路)*

    • 优先探索最有希望的路径。


5. 代码示例



#include <queue>
#include <iostream>

int main() {
    // 默认是大顶堆(降序)
    std::priority_queue<int> pq;

    pq.push(3);  // 插入元素
    pq.push(1);
    pq.push(4);
    pq.push(2);

    while (!pq.empty()) {
        std::cout << pq.top() << " ";  // 输出:4 3 2 1
        pq.pop();  // 删除堆顶元素
    }
    return 0;
}


6. 大顶堆 vs 小顶堆

类型特点适用场景
大顶堆(Max Heap)堆顶是最大值获取前 K 大元素
小顶堆(Min Heap)堆顶是最小值获取前 K 小元素



扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【数论】均值不等式

【数论】均值不等式

均值不等式是高中常见的一个知识点,下面这篇文章做一下简单总结。1、其中a,b属于实数R,当且仅当a=b时,等号成立。这个也叫基本不等式2、其中a,b属于正实数,当且仅当a=b时,等号成立。3、其中a,...

进制转换类问题汇总

二进制转十进制十进制转二进制十进制转M进制(M一般小于16)M进制转十进制M进制和N进制互转...

质数(素数)的判断

一、定义法// 1 定义法(除了1和他本身之外,没有任何一个数能被整除)(试除法) bool is_prime3(unsigned long lon...

C++中的宏

一、预处理和编译器    首先,预编译器就是在编译器之前运行,换句话说,预编译器根据程序员的指示,决定实际要编译的内容。预编译器编译指令都以 # 开头。例如:1...

C++将数据写入磁盘文件

0.前言要求:在任意路径下新建一个文本文档,向该文档中写入数据。以'#'结束字符串的输入。关键技术:ch=fputc(ch,fp);该函数的作用是把一个字符写到磁盘文件(fp所指的磁盘...

C++小项目——实时钟表

C++小项目——实时钟表

0.前言在很多游戏中,我们要使用时间,这个时间一个是系统当前的时间,一个是服务器给你的时间。这篇文章我们尝试做一个模拟时钟。效果图如下1.任务分解1.首先我们尝试使用easyx来画一个。基本框架如下:...