精华内容
下载资源
问答
  • 从海量数据中中位数

    千次阅读 2020-03-14 18:51:32
    题目:在一个文件中有 10G 个整数,乱序排列,要求中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 关于中位数:...

    题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。

    关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。

    分析:明显是一道工程性很强的题目,和一般的查找中位数的题目有几点不同。

    1. 原数据不能读进内存,不然可以用快速选择,如果数的范围合适的话还可以考虑桶排序或者计数排序,但这里假设是32位整数,仍有4G种取值,需要一个16G大小的数组来计数。
    2. 若看成从N个数中找出第K大的数,如果K个数可以读进内存,可以利用最小或最大堆,但这里K=N/2,有5G个数,仍然不能读进内存。
    3. 接上,对于N个数和K个数都不能一次读进内存的情况,《编程之美》里给出一个方案:设k<K,且k个数可以完全读进内存,那么先构建k个数的堆,先找出第0到k大的数,再扫描一遍数组找出第k+1到2k的数,再扫描直到找出第K个数。虽然每次时间大约是nlog(k),但需要扫描ceil(K/k)次,这里要扫描5次。

    解法:首先假设是32位无符号整数。
    1.读一遍10G个整数,把整数映射到256M个区段中,用一个64位无符号整数给每个相应区段记数。
    说明:整数范围是0 - 2^32 - 1,一共有4G种取值,映射到256M个区段,则每个区段有16(4G/256M = 16)种值,每16个值算一段, 0~15是第1段,16~31是第2段,……2^32-16 ~2^32-1是第256M段。一个64位无符号整数最大值是0~8G-1,这里先不考虑溢出的情况。总共占用内存256M×8B=2GB。
    2.从前到后对每一段的计数累加,当累加的和超过5G时停止,找出这个区段(即累加停止时达到的区段,也是中位数所在的区段)的数值范围,设为[a,a+15],同时记录累加到前一个区段的总数,设为m。然后,释放除这个区段占用的内存。
    3.再读一遍10G个整数,把在[a,a+15]内的每个值计数,即有16个计数。
    4.对新的计数依次累加,每次的和设为n,当m+n的值超过5G时停止,此时的这个计数所对应的数就是中位数。

    总结:
    1.以上方法只要读两遍整数,对每个整数也只是常数时间的操作,总体来说是线性时间。
    2. 考虑其他情况。若是有符号的整数,只需改变映射即可。若是64为整数,则增加每个区段的范围,那么在第二次读数时,要考虑更多的计数。若过某个计数溢出,那么可认定所在的区段或代表整数为所求,这里只需做好相应的处理。噢,忘了还要找第5G+1大的数了,相信有了以上的成果,找到这个数也不难了吧。
    3. 时空权衡。花费256个区段也许只是恰好配合2GB的内存(其实也不是,呵呵)。可以增大区段范围,减少区段数目,节省一些内存,虽然增加第二部分的对单个数值的计数,但第一部分对每个区段的计数加快了(总体改变??待测)。
    4. 映射时尽量用位操作,由于每个区段的起点都是2的整数幂,映射起来也很方便。

    展开全文
  • MySQL查询一数据的众数和中位数

    千次阅读 2019-03-05 14:00:41
    查询一数据的众数: 方法1:仅适用于一数据只有一个众数的情况 1)首先对数据按照值的不同进行分组,并对每组中的数据进行计数,再根据计数的大小进行降序排序;... 2)使用max函数出统计个的...

    查询一组数据的众数:

    方法1:仅适用于一组数据只有一个众数的情况

        1)首先对数据按照值的不同进行分组,并对每组中的数据进行计数,再根据计数的大小进行降序排序;

        2)上述1)中结果集的第一行即要求取的众数所在的行。

    方法2:适用于一组数据有一个或多个众数的情况

        1)首先对数据按照值的不同进行分组,并对每组中的数据进行计数;

        2)使用max函数找出统计个数的最大值及其对应的被统计值,此被统计值就是要求的众数。

    创建测试用表:

    # 创建学生成绩表:
    create table grade(
    id int,
    name varchar(10),
    score int (10)
    )engine myisam charset utf8mb4;
     
    # 向成绩表中插入数据:
    insert into grade values
    (1,'张无忌',85),
    (2,'李隆基',59),
    (3,'王五',60),
    (4,'曹操',79),
    (5,'小明',90),
    (6,'如花',60),
    (7,'尉迟恭',100),
    (8,'欧阳风',90),
    (9,'刘备',90),
    (10,'董永',99),
    (11,'冯钰',83),
    (12,'孙殿英',82);
    

    查询学生成绩表garde中分数的众数及其出现的次数:

    先查看garde表的整体信息:

    select * from garde

    方法1代码及查询结果:

    方法2代码及查询结果:

    为简化SQL语句,将方法2中的第一步处理——对数据按照值的不同进行分组,并对每组中的数据进行计数写成视图:

    create view grouped_grade as
    select score,count(score) as number from grade group by score;

    查看视图grouped_grade中的信息:

    select score,number from grouped_grade;

    使用max函数从视图grouped_grade中找到所有分数的众数及其出现的次数:

    select score,number from grouped_grade where number=(select max(number) from grouped_grade);

    查询结果为:

    查询一组数据的中位数:

    网上看到一个很巧妙的方法:

    SET @rowindex := -1;
     
    SELECT
       AVG(g.score) AS median
    FROM
       (SELECT @rowindex:=@rowindex + 1 AS rowindex,
               score 
        FROM grade
        ORDER BY score) AS g
    WHERE
    g.rowindex IN (FLOOR(@rowindex / 2) , CEIL(@rowindex / 2));

    代码解析:上述查询方法的核心思想是对于一组要求其中位数的数据,无论数据的总行数是奇数还是偶数,都取这组数据排序后最中间的两个数的平均值作为中位数(当数据的总行数是奇数时,数据经排序后最中间的数取两次以计算平均值)。

    上述代码的查询结果为:

    对grade表中的score按照升序进行排序,根据排序结果验证前文查询出的中位数是否正确:

    经比较可知,前文查询出的中位数是正确的。

    参考:

    https://blog.csdn.net/qq_41080850/article/details/86310311

    https://blog.csdn.net/hj7jay/article/details/78130419

    展开全文
  • 中位数

    千次阅读 2013-03-19 10:23:57
    中位数(Medians)统计学名词,是指将统计总体当中的各个变量值按大小顺序排列起来,形成一个数列,处于变量数列中间位置的变量值就称为中位数,用Me表示。当变量值的项数N为奇数时,处于中间位置的变量值即为中位数...

           中位数(Medians)统计学名词,是指将统计总体当中的各个变量值按大小顺序排列起来,形成一个数列,处于变量数列中间位置的变量值就称为中位数,用Me表示。当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个变量值的平均数。

    中位数的作用

           中位数的作用与算术平均数相近,也是作为所研究数据的代表值。在一个等差数列或一个正态分布数列中,中位数就等于算术平均数。 在数列中出现了极端变量值的情况下,用中位数作为代表值要比用算术平均数更好,因为中位数不受极端变量值的影响;如果研究目的就是为了反映中间水平,当然也应该用中位数。在统计数据的处理和分析时,可结合使用中位数。

    中位数的计算

           确定中位数,必须将总体各单位的标志值按大小顺序排列,最好是编制出变量数列。

           这里有两种情况:

           1、观测数据量较小时

                对于未分组的原始资料,首先必须将标志值按大小排序。设排序的结果为:

                                         

               则中位数就可以按下面的方式确定:

                                        

               例:2、3、4、5、6、7 中位数:中间的两个数相加后除2=(4+5)/2=4.5

           2、观测数据量很大时。

                观测数据量很大时,中位数的计算开销很大,可以利用“分组资料”的方法确定中位数的近似值。

               由组距数列确定中位数,应先按的公式求出中位数所在组的位置,然后再按下限公式或上限公式确定中位数。

               下限公式:

               上限公式:

       式中:

    Me——中位数;
    L——中位数所在组下限;
    U——中位数所在组上限;
    fm——为中位数所在组的次数;
    ∑f——总次数;
    d——中位数所在组的组距;
    Sm − 1——中位数所在组以下的累计次数;
    Sm + 1——中位数所在组以上的累计次数。

    例:根据上面例表的数据,计算50名工人日加工零件数的中位数。

    解(某企业50名工人加工零件中位数计算表):


    由上表可知,中位数的位置=50/2=25,即中位数在120~125这一组,L=120,Sm − 1 = 16,U=125,Sm + 1 = 20fm = 14,d=5,根据中位数公式得:



    展开全文
  • 今天有朋友遇到一个笔试题:一个 4096的bit数组,要出前10个二进制的1 所在的位置,麻烦写一个函数来实现 bit数组对我来说是一个新的概念,故整理资料学习bit数组的概念~ 加qq1126137994一起学习更多技术!!...
    • 学习交流加(可免费帮忙下载CSDN资源):
    • 个人微信: liu1126137994
    • 学习交流资源分享qq群1(已满): 962535112
    • 学习交流资源分享qq群2: 780902027

    今天有朋友遇到一个笔试题:一个 4096位的bit数组,要找出前10个二进制的1 所在的位置,麻烦写一个函数来实现

    bit数组对我来说是一个新的概念,故整理资料学习bit数组的概念~

    加qq1126137994一起学习更多技术!!!

    1、位数组的概念

    所谓的位数组,主要是为了有效地利用内存空间而设计的一种存储数据的方式。在这种结构中一个整数在内存中用一位(1 bit)表示。这里所谓的表示就是如果整数存在,相应的二进制位就为1,否则为0。

    主要思想:我们知道一个 char 类型的数据在内存中占用 1Byte(即 8 bit),如果我们用二进制位在内存中的顺序来代表整数则可以存储更多的信息。

    这样的话,一个 char 类型可以存储 8个整数。假设 a是一个 char 数组的话,整数8就可以用 a[1] 的第一个二进制位表示了。那么512字节就是4096位,第一位代表0,第二位代表1,第三位代表2,第4096位代表4095,这样我们就可以用512字节存储4096个数了,大大的节省了内存空间。

    这里的关键就是 一个char型能表示8个整数。

    下面我实现一种利用 char 数组构造一个二进制数组。主要包括以下三个方面::

    将一个整数添加到二进制数组中 :

    void add_to_bitarray(char *bitarr, int num){   /* num代表要插进数组中的数 */
    	bitarr[num >> SHIFT] |= (1 << (num & MASK));  /* MASK 为 0x7 */
    }
    

    该方法的主要作用是将二进制数组中表示该整数的位置为1。首先我们得找到该整数位于 char 数组的第几个元组中,这里利用该整数除以8即可(代码中除以8用右移三位实现),例如整数25位于25/8 = 3 余 1,表明该整数是用char 数组的第四个元素的第二位表示。那么在该元素的第几位可以利用该整数的后三位表示(0~7刚好可以表示8个位置),即 25 & 0x7 = 1,则代表25在该元素的第二位。将相应位置1,可以先将整数1左移相应位数,然后与二进制数组进行或操作即可。

    判断一个整数是否在二进制数组中

    int is_in_bitarray(char *bitarr, int num){
    	return bitarr[num >> SHIFT] & (1 << (num & MASK));
    }
    
    

    先找到该整数在二进制数组中的位置,然后判断该位是否为1,若是则表示该整数位于二进制数组中,反之不在数组中。

    删除二进制数组中的一个整数

    void clear_bitarray(char *bitarr, int num){
    	bitarr[num >> SHIFT] &= ~(1 << (num & MASK));
    }
    

    思路相同,先找到该整数在二进制数组中的位置,然后将该位置为0即可。

    完整代码

    完整的代码如下:

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #define SHIFT 3  
    #define MASK 0x7  
    
    char *init_bitarray(int);
    void add_to_bitarray(char *, int);
    int is_in_bitarray(char *, int);
    void clear_bitarray(char *, int);
    void test(char *);
    
    int main(){
    	char *arr;
    
    	arr = init_bitarray(100);
    	add_to_bitarray(arr, 25);
    	test(arr);
    	clear_bitarray(arr, 25);
    	test(arr);
    	getchar();
    	return 0;
    }
    
    char *init_bitarray(int size){
    	char *tmp;
    
    	tmp = (char*)malloc(size / 8 + 1);
    	memset(tmp, 0, (size / 8 + 1)); //initial to 0  
    
    	return tmp;
    }
    
    void add_to_bitarray(char *bitarr, int num){   /* num代表要插进数组中的数 */
    	bitarr[num >> SHIFT] |= (1 << (num & MASK));
    }
    
    int is_in_bitarray(char *bitarr, int num){
    	return bitarr[num >> SHIFT] & (1 << (num & MASK));
    }
    
    void clear_bitarray(char *bitarr, int num){
    	bitarr[num >> SHIFT] &= ~(1 << (num & MASK));
    }
    
    void test(char *bitarr){
    
    	if (is_in_bitarray(bitarr, 25) != 0)
    		printf("25 in\n");
    	else
    		printf("25 not in\n");
    	if (is_in_bitarray(bitarr, 30) != 0)
    		printf("30 in\n");
    	else
    		printf("30 not in\n");
    }
    

    以上是对位数组概念的理解,以及如何创建位数组!
    在VS中运行结果如下:
    这里写图片描述

    • 下面来解决我们最开始留下的笔试题:

    一个 4096位的bit数组,要找出前10个二进制的1 所在的位置,麻烦写一个函数来实现。

    假设我们这个数组存储的是char类型的512字节,我们利用上面的函数,来构造bit数组,可以往特定的位填1,然后写出函数来查找前10个1所在的位置,并返回位置:

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    
    #define N_bit  4096
    #define SHIFT 3  
    #define MASK 0x7  
    
    char *init_bitarray(int);
    void add_to_bitarray(char *, int);
    
    
    char *init_bitarray(int size){
    	char *tmp;
    
    	tmp = (char*)malloc(size / 8 + 1);
    	memset(tmp, 0, (size / 8 + 1)); //initial to 0  
    
    	return tmp;
    }
    
    void add_to_bitarray(char *bitarr, int num){   /* num代表要插进数组中的数 */
    	bitarr[num >> SHIFT] |= (1 << (8 - (num & MASK)));
    }
    
    void add_1_to_bitarr(char *bit_arr)
    {
    	
    	
    	add_to_bitarray(bit_arr, 25);
    	add_to_bitarray(bit_arr, 28);
    	add_to_bitarray(bit_arr, 23);
    	add_to_bitarray(bit_arr, 67);
    	add_to_bitarray(bit_arr, 35);
    	add_to_bitarray(bit_arr, 36);
    	add_to_bitarray(bit_arr, 55);
    	add_to_bitarray(bit_arr, 69);
    	add_to_bitarray(bit_arr, 44);
    	add_to_bitarray(bit_arr, 97);
    	add_to_bitarray(bit_arr, 421);
    	add_to_bitarray(bit_arr, 564);
    	add_to_bitarray(bit_arr, 987);
    	add_to_bitarray(bit_arr, 684);
    	add_to_bitarray(bit_arr, 986);
    	add_to_bitarray(bit_arr, 658);
    	add_to_bitarray(bit_arr, 354);
    	add_to_bitarray(bit_arr, 764);
    	add_to_bitarray(bit_arr, 691);
    	add_to_bitarray(bit_arr, 36);
    	add_to_bitarray(bit_arr, 345);
    }
    int main()
    {
    	char *bit_arr;
    	bit_arr = init_bitarray(4096);
    	add_1_to_bitarr(bit_arr);
    	int num[10];
    	int k = 1;
    	for (int i = 0; i < N_bit / 8 + 1; i++)
    	{
    		for (int j = 1; j < 8 && k <= 10; j++)
    		{
    			if ((bit_arr[i] & 128) == 128)
    			{
    				num[k] = i * 8 + j + 1;
    				k++;
    			}
    			bit_arr[i] <<= 1;
    		}
    	}
    	for (int n = 1; n <= 10; n++)
    	{
    		printf("第%d个1位置为:%d位\n", n, num[n]);
    	}
    
    	//getchar();
    	return 0;
    }
    

    运行结果为:
    这里写图片描述

    我们看到前10 个1 的位置都比我们填入到数组中的位置大1,是因为我们认为4096位是从第一个1开始,而数组是从第0号开始,所以产生了偏移!!!

    到此我们已经用了一种方法来解决这个笔试题,同时也学会了一个新的概念,位数组!!!

    展开全文
  • 出一个无序数组的中位数

    万次阅读 热门讨论 2017-08-04 14:01:25
    出一个无序数组的中位数
  • bfptr算法(即中位数中位数算法)

    万次阅读 多人点赞 2018-08-25 22:35:16
    BFPRT算法是解决从n个数中选择第k大或第k小的这个经典问题的著名算法,但很多人并不了解其细节。本文将首先介绍求解这个第k小数字问题的几个思路,然后重点介绍在最坏情况下复杂度仍然为O(n)的BFPRT算法。 一 ...
  • 中位数及带权中位数问题

    千次阅读 2016-02-01 16:18:57
    信息学竞赛总是时不时与数学产生微妙的关系,中位数及带权中位数问题有时常常成为解题的关键,今日有时间,所以梳理一下。 先从一到简单的题看起: 士兵站队问题 在一个划分成网格的操场上,n个士兵散乱地站在...
  • 中位数定义:假如一个数组的长度Len为偶数,那么中位数为第 Len/2 个数;如果Len为奇数,那么中位数为第Len/2+1个数。 比如 Arr[ 1, 2, 3, 4, 5]中位数为3;Arr[ 2, 3, 4, 5]中位数为3。 给定两个递增排序数组,请...
  • 无序数组中找到中位数

    千次阅读 2017-09-19 19:37:11
    LeetCode中有对两个有序数组求他们的共同的中位数,就是在两个数组中各取第k/2个数,比较大小,因为是有序的,所以小的那个所在的数组之前的k/2个数都是属于他们中位数之前的,所以去除了k/2个数,在剩下的数组中...
  • 数据挖掘中的中位数

    千次阅读 2013-07-01 17:14:44
    在数据挖掘的学习中,遇到了中位数的概念,一GOOGLe之下,其实发现以前的课本等是没学习到的,但现在的中小学生都有学了,现在复习一下  中位数的含义 中位数是将数据按大小顺序排列起来,形成一个数列,居于数列...
  • 大数据求中位数(插值计算)

    千次阅读 2020-06-15 11:48:24
    在学数学时我们学到过求中位数的方法,在数据个数为偶数时最中间的两个数然后求平均数如果数据个数为奇数时则只需数据个数一半的那位上的数字即可代表中位数(前提是数组是有序的) java代码如下: public ...
  • 中位数 中位数是指将数据按大小顺序排列起来,形成一个数列,居于数列中间位置的那个数据。中位数用Me表示。  从中位数的定义可知,所研究的数据中有一半小于中位数,一半大于中位数中位数的作用与算术平均数...
  • 海量数据求中位数

    千次阅读 2009-11-01 16:34:00
    题目描述:若有很大一数据,数据的个数是N(每个数占4个字节),内存大小为M个字节,其中M转一道网上类似题目的解答: 题目:在一个文件中有 10G 个整数,乱序排列,要求中位数。内存限制为 2G。只写出思路即可...
  • Spark入门--求中位数

    千次阅读 2015-07-29 12:42:23
    中位数,数据是分布式存储的 将整体的数据分为K个桶,统计每个桶内的数据量,然后统计整个数据量 根据桶的数量和总的数据量,可以判断数
  • 经典问题:写一段程序,出数组第k大的数,输出数所在的位置。 【解法一】先排序,然后输出第k个位置上的数 我们先假设元素的数量不大,例如在几千个左右,在这种情况下,那我们就排序一下吧。在这里,快速排序...
  • 两个排序数组的中位数

    千次阅读 2012-09-01 16:08:35
    求两个排序数组中位数,这道题是很有意思的一道题目,算法导论中9.3-8题,这题必须在O(logn)的时间复杂度求解,否则肯定悲剧。。。 这题有个关键的条件,那就是这两个数组长度相等 思路如下: 数组A:1, 3, 5, 7,...
  • 也是看了一篇很好的博客,思路很清晰,只是有些地方感觉博主没有详细解释...请出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。示例 1:nums1[1,3]nums2[2]中位数:2.0示例 2:nums1[1,2]nums2[...
  • 求两个有序序列的中位数。(要求时间复杂度为O(logN)) 2. 问题描述 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0, A1…AN-1的中位数指A(N-1)/2的值,即第[(N+1)/2]个数(A0为...
  • # coding=utf-8 import numpy as np import pandas as pd datas = [98,83,65,72,79,76,75,94,91,77,63,83,89,69,64,78,63,86,91,72,71,72,70,80,65,70,62,74,71,76] #平均数 ...#中位数 mid = np...
  • 即可对数组中的值去重并排序,逆序遍历map的第K个元素,输出其value,即为数组中第K大小的数所在位置了。 是不是这个道理? OK,先洗衣服,回来实现程序。 ============================第二日====...
  • 输入一个整数,再从输入的一组数中找出输入的整数出现的次数和位置。#include &lt;stdio.h&gt; int main(){ int n,t,i=0,j=0,count=0;//count表示出现的次数 int index[100]; //记录出现的下标 char c; ...
  • LeetCode002:两个排序数组的中位数

    千次阅读 2018-09-27 21:32:11
    出这两个有序数组的中位数。 要求算法的时间复杂度为 O(log (m+n)) 。 你可以假设 nums1 和 nums2 不同时为空。 示例: # 示例1 nums1 = [1, 3] nums2 = [2] 中位数是 2.0 # 示例2 nums1 = [1, 2] ...
  • 箱线图&上下四分位数

    千次阅读 2020-09-01 20:20:28
    文章内容输出来源:拉勾数据...很显然,中间的四分位数就是中位数,因此通常所说的四分位数是指处在25%位置上的数值(称为下四分位数)和处在75%位置上的数值(称为上四分位数)。与中位数的计算方法类似,根据未分组数据
  • //采用位图的方法,如果是在一个1000万大的数组,其中只有两个是相同的,可以在O(n)时间复杂度内出相同的 //数组b是一块连续内存区域,用数组的每一bit表示一个是否存在,1表示存在,0不存在,比如,...
  • 方差/标准差/四分位数/z-score公式

    千次阅读 2015-10-28 11:53:24
    其中公式μ为平均,N为这数据的个数,x1、x2、x3……xN为这数据具体数值。 二、标准差公式 其中公式数值X1,X2,X3,......XN(皆为实数),其平均值(算术平均值)为μ,标准差为σ。 三、四分...
  • 如果索引从 1 开始计,元素 a[1] 是第一个元素,它的地址就是 base_address,当我们要获取第 8 个元素 a[8] 的数据时,计算机就要找到元素 a[8] 所在的地址,计算公式就是 base_address + (8-1)* type_size 。...
  • 这个算法比9.2节那个“期望运行时间才是O(n)”的RandomizedPartition算法更加牛逼,它最坏运行时间就是O(n)。之所以这么屌,是因为它每次划分都能保证是最佳划分,即“中分”。要想实现中分,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 200,492
精华内容 80,196
关键字:

中位数所在组如何找