zoukankan      html  css  js  c++  java
  • 求中位数总结

        今天在某个群中看到有人问在流式的数据中如何动态的维护中位数的方法,因为之前看到同学的一个问题,当时他没答出来。但是后来了解到类似top(k),last(k)需要用到最大堆,最小堆一样,中位数需要利用双堆维护一下。

        先复习一下,如果是静态的数据求取中位数的方法有哪些呢?

        (1)排序          

        (2)fink-k

        这两种方法不太适合于流式的数据动态变更中位数,所以就引出了双堆求取中位数的策略:

        算法如下:

        1、初始化的时候设置两个变量分别记录两个堆【左堆和右堆】的元素的个数。

        2、取第一个元素【d[0]】作为初始中位数m。

        3、循环后面的每一个元素,如果比m大,则插入到右堆,如果比m小,则插入到左堆。

        4、.如果此时最小堆和最大堆的元素个数的差值>=2 ,则将m加入到元素个数少的堆中,然后从元素个数多的堆将根节点赋值到m,最后重建两个最大堆和最小堆,返回到3。

        此时,如果想要知道当前的中位数,输出m即可。

        简单图解一下:

        

  • 相关阅读:
    判断添加用户名的唯一性
    显示用户登录用户名
    security安全框架,用户登录安全认证与退出
    mybatis分页助手分页
    javaWeb删除一条及多条数据
    javaWeb手动分页步骤
    自定义格式日期
    iOS开发UI篇—懒加载
    IOS-添加分段控件SegmentControl
    iOS设计模式——Category
  • 原文地址:https://www.cnblogs.com/weixliu/p/3946340.html
Copyright © 2011-2022 走看看