zoukankan      html  css  js  c++  java
  • 大顶堆 小顶堆应用----中位数查找

    左边大顶堆,右边小顶堆。右边数量比左边多一,左边放小的那半数,右边放大的那半

    是偶数个,那就返回两个根堆的头结点的q平均值,如果是奇数,就是小根堆的数量大于大根堆数量1个,返回小根堆的头;

    当左右平等数量的时候,往小根堆了加入,当小根堆大于大根堆时候,往大根堆里加入

     1 priority_queue<int> big;
     2 priority_queue<int,vector<int>,greater<int> > small;
     3 void addNum(int num){//左边大顶堆(根节点最大),右边小顶堆(根节点最小),左边放较小数,右边放较大数,保证右边数量比左边大一,所以最开始应向右边堆放入数据,奇数时返回小顶堆根节点,偶数时返回两堆根节点平均值
     4 //数据放入:当右边堆为空时,首先放入右边;
     5 //当右边不为空左边为空,将较小的放入左边------首先将数据放入右边,再将较小数放入左边
     6 if(small.empty())  small.push(num);
     7 else if(big.empty(){
     8 small.push(num);
     9 big.push(small.top());
    10 small.pop();
    11 }
    12 //当两个堆不为空
    13 else{
    14 if(big.size()==small.size())//当两个堆数量相同,将数据放入大顶堆,将最大的数放入小顶堆
    15 {
    16 big.push(num);
    17 small.push(big.top());
    18 big.pop();
    19 }
    20 else{//将数据放入小顶堆,将其中最小数放入左边堆
    21 small.push(num);
    22 big.push(small.top());
    23 small.pop();
    24 }
    25 }
    26 }
    27 double findMedian) {
    28 if(big.empty()&&small.empty())  return 0;
    29 else if(big.size() == small.size()){
    30 double p1 = big.top();
    31 double p2 = small.top();
    32 return (p1+p2)/2;
    33 }
    34 else return small.top();
    35 }
  • 相关阅读:
    yun2win-iOS端IM SDK使用方法
    题解
    普通乘法,加法等时间复杂度计算
    noip2014 解方程(本博文转载于http://blog.csdn.net/popoqqq/article/details/40984859,略有删减)
    检查
    关于对拍 (来自老胡)
    2014 NOIP 赛前自我整理提醒。
    USACO 2014 JAN 滑雪录像
    Vue 双向绑定原理
    Vue 路由
  • 原文地址:https://www.cnblogs.com/pengtangtang/p/12994945.html
Copyright © 2011-2022 走看看