如今在大量数据(至少以亿计)铺面而来的情况下对于计算的要求也越来越高,因此需要一个较好的算法对数据进行处理。由于本人初入大数据领域写的不好敬请见谅。

常规(数据量不大的情况)求中位数和基于插值计算求中位数的方法

在学数学时我们学到过求中位数的方法,在数据个数为偶数时找最中间的两个数然后求平均数如果数据个数为奇数时则只需找数据个数一半的那位上的数字即可代表中位数(前提是数组是有序的)

java代码如下:

 public static double findMedianVersion1(int[] intArray) {if(intArray == null || intArray.length == 0) {return -1;}//1.从小到大排序Arrays.sort(intArray);//2.获取中间数的位置int medianIndex = 0;medianIndex = intArray.length/2;if(intArray.length%2 == 0) {return (intArray[medianIndex] + intArray[medianIndex-1])/2.0;}else {return intArray[medianIndex];}}

这种计算中位数的方式很简单但是会存在一个问题就是先对数组进行排序在遇到大量数据的情况下会极大地增加算法的时间复杂度。
因此有学者就提出了如下的算法:

其中L1为中位数区间的下界,N/2为中位数在整个数组中的位置,(∑freq)l 表示中位数区间之前的频数(数据值个数)的和,(N/2 - (∑freq)l) 表示中位数在中位数分组中的位置, freq median 表示中位数所在区间的频数,width表示组距。【注:图中的加号应改为减号】
该公式的好处在于可以不经过排序即可确定中位数。代码如下:

 public static double findMedianVersion2(int[] intArray) {if(intArray == null || intArray.length == 0) {return -1;}//1.分组//1.1 获取最大值和最小值便于分组int max = Integer.MIN_VALUE;int min = Integer.MAX_VALUE;int groupWidth = 0;for(int i = 0;i<intArray.length;i++) {if(intArray[i] > max) {max = intArray[i];}if(intArray[i] <min) {min = intArray[i];}}//1.2 获取每组的宽度if(max-min <= groupMaxSize) {groupWidth = 1;}else {groupWidth = (max-min)/groupMaxSize;//对组距进行适当的放大以方便统计if(groupWidth > 100) {groupWidth = 100 + groupWidth - groupWidth%100;}else {groupWidth = 10 + groupWidth - groupWidth%10;}}//1.3 获取真实的组数int groupSize = max%groupWidth != 0 ? (1+max/groupWidth):max/groupWidth;if(groupWidth == 1) {//为了防止下标越界groupSize++;}int[] group = new int[groupSize];//1.4 将数据放入组中for(int i:intArray) {group[i/groupWidth]++;}//2.根据插值计算公式估计中位数//2.1获取低于中位数区间所有区间的频率和i以及中位数区间下界low以及中位数区间的频率i1int medianIndex = 0,i = 0,i1 = 0,j=0,low = 0;medianIndex = intArray.length/2;while(true) {if(i+group[j]>=medianIndex) {low = j*groupWidth;i1 = group[j];break;}i += group[j];j++;}double median = low + (medianIndex-i)/(i1*1.0)*groupWidth;return median;}

实验结果

1.测试大量数据情况下两种算法的性能
实验代码如下

 public static void main(String[] args) {//随机生成1亿个3到100000的整数int i[] = IntegerUtils.createIntArray(100000000, 3, 100000);TimeCounter c1 = new TimeCounter();System.out.println(findMedianVersion2(i));c1.countTime();c1.reset();System.out.println(findMedianVersion1(i));c1.countTime();}

实验结果如下

上面这个是基于插值计算得出的结果而下面这个则是常规的求中位数的方法得出的结果,从该结果我们看出在数据量较大的情况下使用基于插值计算的算法更为高效。

2.测试少量数据情况下两种算法的性能
实验代码如下

 public static void main(String[] args) {int i[] = IntegerUtils.createIntArray(10000, 3, 100000);TimeCounter c1 = new TimeCounter();System.out.println(findMedianVersion2(i));c1.countTime();c1.reset();System.out.println(findMedianVersion1(i));c1.countTime();}

实验结果如下

从该结果我们看出在数据量较少的情况下两者的性能差异不大,但就计算精度来说建议使用常规方法。

————————————分割线——————————————————
欢迎大家留言

大数据求中位数(插值计算)相关推荐

  1. 2022年北京大数据技能大赛“隐私计算”赛道初赛完结!12强出炉

    10月14日,2022年北京大数据技能大赛"隐私计算"赛道初赛顺利结束,阶段性成果初现. 前情提要 | 速来!2022北京大数据技能大赛隐私计算赛道可以提交了! 2022年北京大数 ...

  2. 云原生大数据架构中实时计算维表和结果表的选型实践

    简介: 随着互联网技术的日渐发展.数据规模的扩大与复杂的需求场景的产生,传统的大数据架构无法承载. 作者 | 志羽 来源 | 阿里技术公众号 一 前言 传统的大数据技术起源于 Google 三架马车 ...

  3. 【2016年第4期】大数据时代的简约计算

    张家琳,孙晓明 中国科学院计算技术研究所,北京 100190 摘要:大数据存储和分析的能力是未来创新型国家的核心战略能力.当前关于大数据的理论研究在共性问题提炼.方法论框架和实时数据算法理论上仍存在一 ...

  4. 大数据求签,人工智能算命,技术革新下传统行业还有灵魂吗

    都知道,未来社会是数字化的时代,但最近网上涌现了各类颠覆人们认知的数字化方案. 今天,小编在朋友圈看到一张图.内容如下: 网友评论:IoT不仅接地气,还可以接地府 当然,这样的案例也就图一乐.不过,关 ...

  5. zw·10倍速大数据与全内存计算

    zw·10倍速大数据与全内存计算 zw全内存10倍速计算blog,早就在博客园机器视觉栏目发过,大数据版的一直挂着,今天抽空补上. 在<零起点,python大数据与量化交易>目录中 htt ...

  6. 什么是大数据「实时流计算」?深度解析它的4大应用及4个特点

    导读:火灾已经爆发后才知道救火,交通已经阻塞后才知道疏通,羊毛已经被"羊毛党"薅光后才知道堵上漏洞,股价已经拉升后才知道后悔--为什么我们不能在这些事情发生之前,或者至少是刚刚发生 ...

  7. 大数据中位数怎么运算_大数据查找中位数

    前两天同学面试遇到的一道题,大数据怎么找出中位数.大数据 --> 所有数据不能一下子读入内存 中位数 --> 需要遍历所有数据 1. 题目 在一个大文件中有100亿个32位整数,乱序排列, ...

  8. java中求中位数_java 计算中位数的实现方法

    最近工作需要 要求把python的代码写成java版本,python中有一个np.median()求中位数的方法,java决定手写一个 先说说什么是中位数: 中位数就是中间的那个数, 如果一个集合是奇 ...

  9. 降低 Spark 计算成本 50.18 %,使用 Kyligence 湖仓引擎构建云原生大数据底座,为计算提速 2x

    2023 中国开源未来发展峰会于 5 月 13 日成功举办.在大会开源原生商业分论坛,Kyligence 解决方案架构高级总监张小龙发表<云原生大数据底座演进 >主题演讲,向与会嘉宾介绍了 ...

  10. Python基础与大数据应用实验——个人所得税计算

    一.实验内容 设计个人所得税计算器,要求当劳资人员输入员工姓名和应纳税收入后,能够自动计算出该员工当月应交的个税. 计算公式:应纳个人所得税税额=应纳税所得额*适用税率-速算扣除数 二.实验目的 通过 ...

最新文章

  1. 2020-12-09 深度学习 卷积神经网络结构分析
  2. linux下iptables讲解
  3. 人工智能 信道估计 深度学习_DEMO演示|基于IVP02D 人工智能工作站的深度学习引擎,实现人群热力估计...
  4. 为什么越来越多的开发者选择使用Spring Boot
  5. Oracle 之instant client
  6. 设计一种网络分播软件
  7. 简单的RPC java实现
  8. iOS--开发从入门到精通
  9. Java Bean 与Spring Bean 的区别
  10. 【ZT】可行性研究报告编写规范
  11. 深入理解jQuery插件开发(讲解jQuery开发的好文)
  12. HTML圆角+div立体阴影
  13. SQL分组排序和排序函数(rank、dense_rank、row_number)
  14. CSDN版主考核方案
  15. ubuntu 18.04/16.04/14.04 双硬盘分区方案
  16. 大数据Clouder专项技能认证课程:Quick BI企业报表制作
  17. 危夷晨:来自“AI黄埔军校”的计算机视觉创业者
  18. DC学习(时序分析和命令)
  19. c语言提供了三种预处理命令,9、C语言之预处理命令
  20. 佛山市“可持续城市出行规划(SUMP)”国家层面培训会顺利完成

热门文章

  1. 基于深度学习的帧内预测技术
  2. JavaScript的优势和劣势
  3. 山东省第七届ACM大赛E题题解
  4. Label-Specific Dual Graph Neural Network for Multi-Label Text Classification,ACL2021 finding
  5. 我了解的软件测试基本概念
  6. java 计算器 正负号转换_【计算器正负号】一个小程序,有点问题
  7. DGUS组态软件中图标旋转显示如何使用
  8. 嘉兴学院c语言期末考试题库,液压与气压传动(嘉兴学院)知到APP答案
  9. android构建系统总览
  10. [论文阅读][CVPR2021]EventZoom: Learning to Denoise and Super Resolve Neuromorphic Events