数据结构与算法——优先队列

了解优先队列前,先了解堆的数据结构
堆:必须是一个完全二叉树
完全二叉树有以下性质:
(1)完全二叉树只允许最后一行不为满
(2)且最后一行必须从左往右排序
(3)最后一行元素之间不可以有间隔

堆的第二性质:堆序性
大根堆:根节点大于子节点
小根堆:根节点小于子节点

以大根堆来说明上滤和下滤操作:
下滤:树的根节点破坏了堆序性,根节点向下调整的操作称为下滤(复杂度是O(logN))
上滤:树的最后一个元素破坏了堆序性,那和父节点进行比较,若大于父节点,则交换,直到无法上移为止。这个操作主要用在新元素插入到堆中。(复杂度是O(logN))

建堆的方法:
自顶而下:插入堆,上滤(复杂度是O(NlogN))
自下而上:对每个父节点进行下滤(复杂度是O(logN))

优先队列:队尾插入,队头弹出最小元素。(小根堆)

priority_queue q; //默认是大顶堆
等价于priority_queue<int,vector, less> q;

小顶堆的构造
priority_queue<int,vector, greater> q2;

priority_queue<pair<int,int>> q3
排序规则默认先比较第一个值,后比较第二个值

posted @ 2023-06-09 22:31  水水滴答  阅读(19)  评论(0编辑  收藏  举报