1.堆(特殊的树)
(1)大顶堆:根结点最大,每个节点的值大于等于其孩子节点,用于升序(小->大)排列
(2)小顶堆:根结点最小,每个节点的值小于等于其孩子节点,用于降序(大->小)排列
(3) 相关操作
1)入队(堆):在最下面的叶子结点右边进行插入
(如果最下一层已满,就新增一层),
插入后若不再满足堆的特点,则需向上进行动态调整,直到满足
2)出队(堆):将根结点出队,再将最后1个结点放到根结点位置,
然后将新的根结点向下进行动态调整,直到满足堆特点
3)出队入队时间复杂度O(logn)2.优先队列:不再遵循先进先出的原则,但必须有序
(1) 无论入堆顺序,每次都是当前最大/小的元素(即堆顶元素)出队
(2) 最大优先队列->最大堆;最小优先队列->最小堆
(3) 出队和入队时间复杂度O(logn)
原因:不管出队或入队,都有可能出现需要调整的情况,
而每次调整要做的比较都是在进行二分,即小于和大于情况
(4) 操作:
使用库函数实现,头文件<queue>
1)大顶堆(默认):priority_queue <队列中元素类型> 队列名;
小顶堆:(实现可将元素取负再入最大优先队列)
priority_queue <队列元素类型,vector<类型>,greater<类型>空格> 队列名;
如: priority_queue <int,vector<int>,greater<int> > q;
2)常用操作
q.push(x); 将x入堆 O(logn)
q.pop(); 将堆顶出队 O(logn)
q.top(); 获取堆顶元素(取而不删)O(1)
q.size(); 队列内元素个数 O(1)
q.empty()==1 队列为空(!q.empty()即不空)O(1)
堆和优先队列笔记
于 2024-10-27 14:30:29 首次发布