// 面试题41:数据流中的中位数
// 题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么
// 中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,
// 那么中位数就是所有数值排序之后中间两个数的平均值。 #include <iostream>
#include <algorithm>
#include <vector> using namespace std; template<typename T> class DynamicArray
{
public:
void Insert(T num)
{
if (((min.size() + max.size()) & ) == )//没插入前判断当前总个数是奇还是偶,偶时插入最小堆
{
if (max.size() > && num < max[])//若该值属于最大堆
{
max.push_back(num);//则先插入最大堆
push_heap(max.begin(), max.end(), less<T>());//使最后一个元素插到合适位置,符合最大堆规则 num = max[];//令num等于最大堆里的最大值 pop_heap(max.begin(), max.end(), less<T>());//交换最大堆的最大值和最后一个值,弹出最大值,符合最大堆规则
max.pop_back();//删除最后一个元素,即刚才所述的最大值
} min.push_back(num);//将num插入最小堆
push_heap(min.begin(), min.end(), greater<T>());//使最后一个元素插到合适位置,符合最小堆规则
}
else//奇数插入最大堆,使大小堆保持平衡,下面代码同上
{
if (min.size() > && min[] < num)
{
min.push_back(num);
push_heap(min.begin(), min.end(), greater<T>()); num = min[]; pop_heap(min.begin(), min.end(), greater<T>());
min.pop_back();
} max.push_back(num);
push_heap(max.begin(), max.end(), less<T>());
}
} T GetMedian()
{
int size = min.size() + max.size();
if (size == )
throw exception("No numbers are available"); T median = ;
if ((size & ) == )
median = min[];//若总个数是奇数,则中值是最小堆的顶点
else
median = (min[] + max[]) / ;//否则是最大堆和最小堆的顶点平均值 return median;
} private:
vector<T> min;
vector<T> max;
}; // ====================测试代码====================
void Test(const char* testName, DynamicArray<double>& numbers, double expected)
{
if (testName != nullptr)
printf("%s begins: ", testName); if (abs(numbers.GetMedian() - expected) < 0.0000001)
printf("Passed.\n");
else
printf("FAILED.\n");
} int main()
{
DynamicArray<double> numbers; printf("Test1 begins: ");
try
{
numbers.GetMedian();
printf("FAILED.\n");
}
catch (const exception&)
{
printf("Passed.\n");
} numbers.Insert();
Test("Test2", numbers, ); numbers.Insert();
Test("Test3", numbers, 3.5); numbers.Insert();
Test("Test4", numbers, ); numbers.Insert();
Test("Test6", numbers, 3.5); numbers.Insert();
Test("Test5", numbers, ); numbers.Insert();
Test("Test7", numbers, 3.5); numbers.Insert();
Test("Test8", numbers, ); numbers.Insert();
Test("Test9", numbers, 3.5); numbers.Insert();
Test("Test10", numbers, );
system("pause");
return ;
}

《剑指offer》第四十一题(数据流中的中位数)的更多相关文章

  1. 剑指offer 面试题. 数据流中的中位数

    题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们 ...

  2. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  3. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  4. 剑指offer刷题

    1.面试题43. 1-n整数中1出现的次数 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次 ...

  5. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  6. 剑指Offer——算法复杂度中的O(logN)底数是多少

    剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...

  7. 《剑指offer》旋转数组中的最小数字

    本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...

  8. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  9. 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或

    剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...

  10. 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位

    剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...

随机推荐

  1. AJAX(表单验证)/JSON之一

    ## 什么是Ajax AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). 1. 异步通信:浏览器利用独立的线程与服务器进行通信, ...

  2. 状态管理之cookie使用及其限制、session会话

    # 1.什么是状态管理? 将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来.(cookie浏览器所涉及到的访问数据保存下来)# 2.如何进行状态管理? ...

  3. oracle 11g enq: JI – contention等待事件

    最近使用物化视图同步的环境在大量刷新的时候频繁出现enq: JI – contention等待事件,经查: JI enqueue is acquired in exclusive mode on th ...

  4. nlp homework 03

    NLP Homework 03 --冯煜博 题目描述 (盒子和球模型)假设有3个盒子,每个盒子里装有红白两种颜色的球,盒子里的红白球有下表列出,初始状态分布. 解答 1. 给出HMM模型 \(\mu= ...

  5. Html5之Web存储

    localStorage 方法存储的数据没有时间限制.第二天.第二周或下一年之后,数据依然可用. sessionStorage 方法针对一个session 进行数据存储.当用户关闭浏览器窗口后,数据会 ...

  6. python --- 04 列表 元组

    一 .列表 在python中使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求 1.列表存在索引和切片. 和字符串是一样的. 2.增删改查操作 1).增加 1. .append(" ...

  7. 强大的Django后台管理

    Django 后台 django的后台我们只要加少些代码,就可以实现强大的功能.与后台相关文件:每个app中的 admin.py 文件与后台相关 下面示例是做一个后台添加博客文章的例子: 新建一个 名 ...

  8. Vue学习【第一篇】:Vue初识与指令

    什么是Vue 什么是Vue Vue.js是一个渐进式JavaScript框架它是构建用户界面的JavaScript框架(让它自动生成js,css,html等) 渐进式:vue从小到控制页面中的一个变量 ...

  9. 2.Android硬件访问服务编写系统代码【转】

    本文转载自:https://blog.csdn.net/qq_33443989/article/details/76696772 版权声明:本文为博主(Tower)自学笔记,欢迎转载! :-)     ...

  10. C语言 字符串大小写转换 自定义函数

    #include <stdio.h>#include <stdlib.h>#include <string.h> char * strtolower(char * ...