数据流中的中位数【大顶堆与小顶堆】

1.把每次插入的元素放入大顶堆;

min.push(num);

2.把大顶堆的最大值(大顶堆.top())放入小顶堆;

max.push(min.top());
min.pop();

3.比较大顶堆与小顶堆的大小,如果大顶堆.size()<小顶堆.size()的话,把小顶堆的最小值(max.top())放入大顶堆中。

 if (min.size() < max.size()) {
            min.push(max.top());
            max.pop();
  }
#include <functional>
#include <queue>
class Solution {
  public:
    priority_queue<int> min;
    priority_queue<int, vector<int>, greater<int>> max;
    void Insert(int num) {

       //1.把每次插入的元素放入大顶堆;
        min.push(num);
        
       // 2.把大顶堆的最大值(大顶堆.top())放入小顶堆;
        max.push(min.top());
        min.pop();

//3.比较大顶堆与小顶堆的大小,如果大顶堆.size()<小顶堆.size()的话,把小顶堆的最小值(max.top())放入大顶堆中。
        if (min.size() < max.size()) {
            min.push(max.top());
            max.pop();
        }

    }

    double GetMedian() {
        int n = min.size() + max.size();
        if (n%2==0){
           return (min.top()+max.top())/2.00;
        }else{
           return min.top()*1.00;
        }
        
    }
};

堆可以看成近似的完全二叉树。堆排序的时间复杂度是O(nlgn)。—输入的其实还是数组,只是一种结构–思想。

大顶堆每一个根结点都比其子节点大–最上面的根结点最大
小顶堆每一个根节点都比子节点小----最上面的根节点最小

大顶堆(Max Heap):在大顶堆中,每个节点的值都大于或等于其子节点的值。这意味着堆顶元素(根节点)是堆中的最大值。当你插入一个新元素或者从堆中弹出元素时,大顶堆会自动重新调整,将新元素逐步向上移动,以确保堆的性质得以保持。

小顶堆(Min Heap):在小顶堆中,每个节点的值都小于或等于其子节点的值。这意味着堆顶元素(根节点)是堆中的最小值。与大顶堆类似,当插入或弹出元素时,小顶堆会自动进行调整,以保持堆的性质。

这些堆的自动排序功能是由堆的性质决定的。无论你插入新元素还是弹出元素,堆都会根据堆的特性自动重新组织,以确保堆的根节点(堆顶元素)具有所需的特点(最大值或最小值)。

大顶堆和小顶堆常常被用于实现优先队列、寻找中位数、Top K 问题等,利用了它们自动排序的特性来高效地处理数据。在编程中,可以使用标准库中的堆数据结构或者手动实现堆操作来利用这些特性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值