当前位置: 首页 > news >正文

元氏网站建设360搜索引擎

元氏网站建设,360搜索引擎,做电影网站解析,政府网站整改 对做网站关键字题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 例如,[2,3,4] 的中位数是…

题目

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

例如,[2,3,4] 的中位数是 3, [2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() -返回目前所有元素的中位数。

在这里插入图片描述

思路

优先队列 / 堆

给定一长度为 N 的无序数组,其中位数的计算方法:首先对数组执行排序(使用 O(Nlog⁡N)时间),然后返回中间元素即可(使用 O(1) 时间)

本题可以根据上述思想,将数据流保存在一个列表中,并在添加元素时保持数组有序,给定一长度为 N 的无序数组,其中位数的计算方法:首先对数组执行排序(使用 O(Nlog⁡N) 时间),然后返回中间元素即可(使用 O(1)时间)

借助 进行优化时间复杂度

建立两个堆,一个小顶堆A,一个大顶堆B,各自保存列表的一半元素 ,其中:

  • A保存较大的一半,长度为N/2或者(N+1)/2
  • B保存较小的一半,长度为N/2或者(N+1)/2

最后,中位数可以仅根据A,B的堆顶元素计算得到:
在这里插入图片描述
举个例子:数据流 [1,2,3,4,5,6,7,8]

如图所示,则[1,2,3,4]保存在大顶堆B,且堆顶元素为4(因为大顶堆堆顶元素最大),然后[5,6,7,8]保存在小顶堆A,且堆顶元素为5(因为小顶堆堆顶元素最小),这也是为什么大顶堆保存较小的一半,小顶堆保存较大的一半,为了就是可以通过A,B的堆顶元素求中位数

算法流程:

设元素总数为 N = m + n ,其中 mn 分别为 AB 中的元素个数

  • addNum(num) 函数:添加元素,
    (1)当 m=n(即 N 为 偶数):需向 A 添加一个元素,即AB中元素个数相等时,优先往A中先加元素。实现方法:将新元素 num插入至 B ,再将 B 堆顶元素插入至 A这是为了始终保证A中存较大的一半,B中存较小的一半,因为num可能属于较小的一半,即B中的元素,所以要先加入B,再将B堆顶元素插入A);

举个例子,A中加入1需要先加入B中,然后将B的堆顶元素3加入A
在这里插入图片描述
在这里插入图片描述

(2)当 m≠n(即 N 为 奇数):需向 B 添加一个元素,此时情况即为AB多一个元素。实现方法:将新元素 num 插入至 A ,再将A 堆顶元素插入至 B (同理,为了始终保证A中存较大的一半,B中存较小的一半,要先加入A,再将A的堆顶元素插入B,因为num可能属于较大的一般分,即属于A的元素);

举个例子,B中加入6需要先加入A中,然后将A的堆顶元素3加入B
在这里插入图片描述
在这里插入图片描述

  • findMedian() 函数:找中位数
    (1)当 m=nN 为 偶数):则中位数为 ( A 的堆顶元素 + B 的堆顶元素 ) / 2
    (2)当 m≠nN 为 奇数):则中位数为 A 的堆顶元素。

复杂度分析:

  • 时间复杂度:
    (1)查找中位数 O(1) : 获取堆顶元素使用 O(1) 时间;
    (2)添加数字 O(log⁡N) : 堆的插入和弹出操作使用 O(log⁡N)时间
  • 空间复杂度O(N):其中 N 为数据流中的元素数量,小顶堆 A 和大顶堆 B 最多同时保存 N个元素。

java代码如下:

class MedianFinder{Queue<Integer> A,B;public MedianFinder() {A = new PriorityQueue<>();//java默认小顶堆,保存较大的一半B = new PriorityQueue<>((x,y) -> (y - x));//使用降序定义大顶堆(因为大顶堆堆顶元素最大,所以是降序,但是用于升序排序,因为每次出堆顶元素是最大的),保存较小的一半}public void addNum(int num){if(A.size() != B.size()){//如果A,B元素个数不相等,则往B中添加元素//但是为了始终保证A中存较大的一半,B中存较小的一半A.add(num);//要先往A中加B.add(A.poll());//然后再将A的堆顶元素加入B} else {//如果A,B元素个数相等,则往A中添加元素//同理为了始终保证A中存较大的一半,B中存较小的一半B.add(num);A.add(B.poll());//要先往B中加//然后再将B的堆顶元素加入A}}public double findMedian(){return A.size() != B.size() ? A.peek() : (A.peek() + B.peek()) / 2.0;}
}
http://www.wooajung.com/news/23085.html

相关文章:

  • 手机网站淘宝客怎么做查域名的网址
  • java就是做网站的吗免费拓客软件哪个好用
  • wordpress仿站pdf中国网络优化公司排名
  • 怎么做视频在线播放网站百度快照有什么用
  • 公众号平台搭建seo是搜索引擎营销
  • 工程建设招标网都有哪些网站线下推广
  • 高端定制网站开发设计建站流程网络销售公司怎么运作
  • 外包做网站不付尾款什么样的人适合做策划
  • 如何配置web站点网站身份验证百度账号客服人工电话
  • 泰国购物网站大全优化网站推广网站
  • 狮山网站设计全网营销推广平台
  • 电子商务网站建设核心是公司网站设计与制作
  • 赣州企业网站在那做搜索引擎优化的七个步骤
  • 工业设计的网站企业建站平台
  • 室内设计效果图手绘线稿麒麟seo外推软件
  • 郑州哪里做网站最好电脑培训班零基础
  • wordpress问答中心沧州网站seo
  • 网站建设价格需要多少钱seo点击排名工具
  • 搭建网站的必须条件统计网站访问量
  • 建设的网站中国搜索引擎大全
  • 家政网站建设方案长安seo排名优化培训
  • 智慧房产信息管理平台长沙网站se0推广优化公司
  • 建设一个网站需要做哪些工作内容seo站长平台
  • 做电商网站前端用什么框架自助建站网站哪个好
  • 能够做代理的网站有哪些网络销售是干嘛的
  • 铜陵做网站的google seo是什么啊
  • 新上线网站如何做搜索引擎百度店铺注册
  • 上海公司企业网站怎么做长沙网站优化培训
  • 佛山新网站建设服务百度关键词数据
  • 有没有专做烘焙的网站网站流量查询工具