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

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

优先队列(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 小元素



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

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

分享给朋友:
返回列表

上一篇:【题解】玩具

没有最新的文章了...

相关文章

信息学奥赛中文件流的写法

信息学奥赛中文件流的写法

头文件#include<cstdio>也可以用万能头格式如下:int main(){ freopen("xxxx.in","r",st...

质数(素数)的判断

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

【数据结构】栈(Stack)的介绍

栈是只能在某一端插入和删除的特殊线性表。栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一端称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表(LIF...

C++中的位宽与保留小数

C++中的位宽与保留小数

一、setw函数C++ setw() 函数用于设置字段的宽度,语法格式如下setw(n)比如:#include <bits/stdc++.h> using names...

【算法】分治算法

前言所谓分治算法就是指分而治之,即将较大规模的问题分解成几个较小规模的问题,通过对较小问题的求解达到对整个问题的求解。当我们将问题分解成两个较小问题求解时的分治方法称为二分法。比如,我们玩过最简单的猜...

【C++图形化编程】鼠标函数及鼠标画板

【C++图形化编程】鼠标函数及鼠标画板

0.前言这篇文章简单介绍一下利用鼠标画图的程序#include<graphics.h> #include<conio.h> int main(){ initg...