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

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

亿万年的星光3周前 (06-20)C++知识141

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



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

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

分享给朋友:

相关文章

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

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

【高级篇】C++中的sort函数详解

【高级篇】C++中的sort函数详解

0.简介sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要高,sort函数包含在头文件为#...

【数据结构】队列—基本操作

【数据结构】队列—基本操作

一、C++实例分析       C++队列queue模板类的定义在<queue>头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容...

【数论】杨辉三角

【数论】杨辉三角

一、起源 杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角...

【题解】最短路径问题

【题目描述】平面上有n个点(n≤100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现...

【数据结构】并查集1

【数据结构】并查集1

1.引入    对于一个集合S={a1, a2, …, an-1, an},我们还可以对集合S进一步划分: S1,S2,…,Sm-1,Sm,我们希望能够快速确定...