堆和优先队列笔记

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) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值