题目: 有一个源源不断地吐出整数的数据流,假设你有足够的空间来保存吐出的数。请设计一个名叫MedianHolder的结构,MedianHolder可以随时取得之前吐出所有数的中位数。

要求: 如果MedianHolder已经保存了吐出的N个数,那么任意时刻将一个新数加入到MedianHolder的过程,其时间复杂度O(logN)。
取得已经吐出的N个数整体的中位数的过程,时间复杂度O(1)。
基本思路:使用两个堆结构,一个大根堆,一个小根堆。将接收的所有数的较小的一半放入大根堆,将接收的较大的一半放入小根堆。如果接收的个数为奇数,中位数就是小根堆和大根堆中元素数量多的那个堆的堆顶,比如吐出的数是6,1,3,0,9,8,7,小根堆中存放6,7,8,9,大根堆存放0,1,3,小根堆的元素个数多,它的堆顶就是该序列的中位数,即6;如果接收的个数是偶数,中位数就是两个堆顶相加除以2。

  每次接收到一个数,都要正确选择放入哪个堆,小于小根堆堆顶的都放入大根堆,否则放入小根堆。如果出现一个堆的元素个数比另一个堆的元素多两个的情况,将前者的堆顶弹出添加到后者中,并重新调整两个堆。总之要始终保持两个堆元素个数的差值不大于1。

  这样随时都可以知道已经吐出的所有数处于中间位置的两个数是什么,取得中位数的操作时间复杂度为O(1),同时根据堆的性质,向堆中添加一个新数,并且调整堆的代价为O(logN)。然而题目有一个很重要的限制“任意时刻将一个新数加入到MedianHolder的过程,其时间复杂度O(logN)”

"""伪代码如下"""
class MedianHolder:def __init__(self):self.maxHeap = maxHeap()self.minHeap = minHeap()def addNum(self,num):if self.maxHeap.isEmpty() or self.maxHeap.peek() > num:self.maxHeap.add(num)else:self.minHeap.add(num)modifyHeap()def modifyHeap(self):if self.maxHeap.size() == self.minHeap.size() + 2:self.minHeadp.add(self.maxHeap.peek())if self.maxHeap.size() == self.minHeap.size() - 2:self.maxHeadp.add(self.minHeap.peek())def getMedian(self):if self.maxHeap.isEmpty():return Noneif self.maxHeap.size() == self.minHeap.size():return (self.maxHeap.peek() + self.minHeap.peek())/2else:if self.maxHeap.size() > self.minHeap.size():return self.maxHeap.peek()else:return self.minHeap.peek()

随时找到数据流中的中位数相关推荐

  1. 数据流中的中位数,我轻敌了

    前言 大家好,我是bigsai.最近轻敌了一个高频问题,分享给大家. 最近面试时候遇到一个非常有意思的hard题,面试官没让写代码让说思路,但放在正常应届生招聘那可能就要手撕了,在剑指offer的第4 ...

  2. 《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值

    一.序列化二叉树: 1.题目: 请实现两个函数,分别用来序列化和反序列化二叉树. 2.解题思路: (1)根据前序遍历规则完成序列化与反序列化.所谓序列化指的是遍历二叉树为字符串:所谓反序列化指的是依据 ...

  3. [剑指Offer] 数据流中的中位数

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

  4. Python中的堆实现:heapq 模块——利用堆结构实现快速访问数据流中的中位数

    堆结构 堆结构是一种优先队列,可以以任意顺序添加对象,并随时查找或删除最小(大)的元素,或者查找和删除前 K 个最小(大)元素.相比于列表方法min() / max(),这样做的效率要高得多. 堆结构 ...

  5. 【剑指Offer】个人学习笔记_41_数据流中的中位数

    目录 题目: [剑指 Offer 41. 数据流中的中位数](https://leetcode-cn.com/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lc ...

  6. 剑指offer:面试题41. 数据流中的中位数

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

  7. Leetcode295 数据流中的中位数-最小堆和最大堆

    题目 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如,[2,3,4] 的中位数是 3:[2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两 ...

  8. 数据结构与算法之字符凭拼接最低字典序和数据流中取中位数

    数据结构与算法之字符凭拼接最低字典序和数据流中取中位数 目录 字符凭拼接最低字典序 数据流中取中位数 1. 字符凭拼接最低字典序 题目描述 思路: 创建一个比较器,比较的内容是(o1+o2).comp ...

  9. 《剑指offer》数据流中的中位数

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

最新文章

  1. 麦肯锡《2020年人工智能状况》报告:企业收入增长,AI真的出了力
  2. scrapy实现post请求与请求传参
  3. oracle no such file or directory,ORA-09925 Linux-x86_64 Error: 2: No such file or directory
  4. 转载:必须掌握的八个【cmd 命令行】
  5. cisco LAP upgrade to Fat AP
  6. java insert_java获取新insert数据自增id的实现方法
  7. 【遥感数字图像处理】实验:遥感影像增强方法大全处理看过来(Erdas版)
  8. Android软键盘的删除键和activity返回冲突
  9. 应用虚拟化软件-VA虚拟应用管理平台
  10. 关于canvas生成图片的方法
  11. C语言实现动态二维数组及相乘
  12. 软件实现串口程序出售,9600收发毫无压力。 采用io管脚模拟,适合串口资源欠缺的芯片使用。 stm32,tms320f28xx,PIC等
  13. 3.1、立项管理内容
  14. 5G套餐打七折, 购机再现补贴“大战”
  15. Spring context:annotation-config/ 解说
  16. 视频会议哪家强?Zoom在内的三大平台之间的较量
  17. AI服装生成,帮你完成服装设计的最后一步
  18. css-标准盒子与怪异盒子
  19. Redis开发与运维 必备-电子书
  20. 在eclipse中进行Struts2项目的配置 yin

热门文章

  1. 解决 Android ping IPv6 地址显示 network is unreachable 的问题
  2. Linux-shell-完全详解
  3. nodejs+express整合kindEditor实现图片上传
  4. 重构遗留代码(1):金牌大师
  5. 一个好用的ODBC数据库类CMYODBC
  6. 笨办法学Python——学习笔记1
  7. 不想当管理者、甚至连项目经理都也不想当,只想静心写写代码、不做管理
  8. python基础学习[python编程从入门到实践读书笔记(连载二)]:外星人入侵项目
  9. 第一次运行Spring Boot有感
  10. 找不到或无法加载主类