精华内容
下载资源
问答
  • 算法 - n个数的中位数(C++)

    万次阅读 多人点赞 2019-02-28 10:19:02
    * n个数的中位数 - C++ - by Chimomo * * 对于一组有有限个数的数据来说,它们的中位数是这样的一种数:这群数据里的一半的数据比它大,而另外一半数据比它小。 * 计算有限个数的数据的中位数的方法是:把所有...

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 

    /*
     * 求n个数的中位数 - C++ - by Chimomo
     *
     * 对于一组有有限个数的数据来说,它们的中位数是这样的一种数:这群数据里的一半的数据比它大,而另外一半数据比它小。
     * 计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序排列。
     * 如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;
     * 如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。
     */
    
    #include <iostream>
    #include <cassert>
    #include <stack>
    #include <math.h>
    
    using namespace std;
    
    int QuickSortOnce(int a[], int low, int high) {
        // 将首元素作为枢轴。
        int pivot = a[low];
        int i = low, j = high;
    
        while (i < j) {
            // 从右到左,寻找首个小于pivot的元素。
            while (a[j] >= pivot && i < j) {
                j--;
            }
    
            // 执行到此,j已指向从右端起首个小于或等于pivot的元素。
            // 执行替换。
            a[i] = a[j];
    
            // 从左到右,寻找首个大于pivot的元素。
            while (a[i] <= pivot && i < j) {
                i++;
            }
    
            // 执行到此,i已指向从左端起首个大于或等于pivot的元素。
            // 执行替换。
            a[j] = a[i];
        }
    
        // 退出while循环,执行至此,必定是i=j的情况。
        // i(或j)指向的即是枢轴的位置,定位该趟排序的枢轴并将该位置返回。
        a[i] = pivot;
    
        return i;
    }
    
    void QuickSort(int a[], int low, int high) {
        if (low >= high) {
            return;
        }
    
        int pivot = QuickSortOnce(a, low, high);
    
        // 对枢轴的左端进行排序。
        QuickSort(a, low, pivot - 1);
    
        // 对枢轴的右端进行排序。
        QuickSort(a, pivot + 1, high);
    }
    
    int EvaluateMedian(int a[], int n) {
        QuickSort(a, 0, n - 1);
    
        if (n % 2 != 0) {
            return a[n / 2];
        } else {
            return (a[n / 2] + a[n / 2 - 1]) / 2;
        }
    }
    
    int main() {
        int a[9] = {-5, 345, 88, 203, 554, 1, 89, 909, 1001};
        cout << EvaluateMedian(a, 9) << endl;
        return 0;
    }
    
    // Output:
    /*
    203
    
    */
    

     

    展开全文
  • 注意EXCEL中位数问题 中位数,奇数个还是偶数个 不能用and的原因 两种方法

    1 如果要 取得C列c4:c18 符合初级,且去掉空值的 中位数

    • median
    • 如果只需要取,符合 初级 这种单条件的中位数
    • =MEDIAN(IF(B:B=E4,C:C))

     

    • 如果需要多条件,符合条件1:初级,且符合条件2:去掉空值
    • 可以用下面两种方法实现
    • =MEDIAN(IF(($B$4:$B$18=E4)*($C$4:$C$18>0),$C$4:$C$18))
    • 条件 true*true 表示and  (true在数值运算里作为1,false作为0)
    • 如果 true+true 表示 or 
    • =MEDIAN(IF($C$4:$C$18*($B$4:$B$18=E4),$C$4:$C$18))
    • 在数值运算里
    • $C$4:$C$18 空值会当false处理,也是一样效果

     

     

    2 注意点,多条件不能用 if(and()) 而是用 条件*条件 或 条件+条件

    • IF($A:$A=G$3) 或 IF ($B:$B=$F4) 都将返回一个由TRUE或FALSE组成的数组。
    • 用*或其它四则运算符号运算时,TRUE被当作1参与,FALSE被当作0参与。
    • 只有两个都是1时,才会得到1。
    • 所以这里乘的意思是与AND一样的,但它可以保留数组,不象AND只能返回单值。
    • 如果不用乘,而用加,那么意思就是两个条件中只要任一符合,就符合。相当于“或”。
    • SUM(IF(($A:$A=G$3)+($B:$B=$F4),$C:$C))

     

    3 不能用and的原因:因为and只能返回1个值,不能返回一个内存数组

    而数组公式不能用一个值作数组的中间步骤

    • and返回的是一个值,而不是一个内存数组
    • 数组公式,输入的内容是数组,中间结果也是数组,输出可以被普通函数转化为 数组 或 单个值。

     

     

    4 因为是数组公式,数组要精确,不能随便的用 a:a 这种,而是要精确到数组

    • 因为数组公式,处理数组,必须要精确
    • 如  a:a 表示整个A列数组
    • 而a4:a18只是这一段精确的数组

     

    5 注意EXCEL中位数问题

    • 中位数,奇数个还是偶数个
    • 如果数组元素是偶数个,EXCEL的median返回的是 中间2个数的均值。。。

     

     

    6 例子2:求1列中,大于10,但是小于20之间的多个数的median,sum

     

    • MEDIAN(IF((A2:A16>=10)*(A2:A16<=20),A2:A16))
    • SUM(IF((A2:A16>=10)*(A2:A16<=20),A2:A16))

     

    展开全文
  • 大数据求中位数(插值计算)

    千次阅读 2020-06-15 11:48:24
    在学数学时我们学到过求中位数的方法,在数据个数为偶数时找最中间的两个数然后平均数如果数据个数为奇数时则只需找数据个数一半的那位上的数字即可代表中位数(前提是数组是有序的) java代码如下: public ...

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

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

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

    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以及中位数区间的频率i1
    		int 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();
    	}
    

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

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

    展开全文
  • 在所有的N位数,有多少个数中偶数个数字3(说明,0是偶数)? 【输入格式】 读入一个N 【输出格式】 输出有多少个数中偶数个数字3。 【输入样例】 2 【输出样例】 73(由于 位数 比较大的情况下,导致输出数据...

    在所有的N位数中,有多少个数中有偶数个数字3(说明,0是偶数)?
    【输入格式】 读入一个数N
    【输出格式】 输出有多少个数中有偶数个数字3。
    【输入样例】 2
    【输出样例】 73(由于 位数 比较大的情况下,导致输出数据可能越界,因此,输出个数 % 12345 的结果)
    【数据规模】 1<=N<=1000
    分析
    任何位的数中,根据3的个数不同,分为两类
    或者偶数位的3,或者包含 奇数位的3
    1位数中(共10个数)
    0,1,2,3,4,5,6,7,8,9,
    包含0个3的数有 9个
    包含1个3的数有1个
    2位数中(90个 10~99)
    包含偶数个3的数有 0个3+2个=89+11=72
    包含奇数个3的数有 1个3= 9*1
    在所有的2位数字,包含0个3的数有72个,包含2个3的数有1个,共73个
    【算法分析】
    前i位有偶数个3,必须满足以下条件:
    前i-1位有偶数个3, 则 第i位不能取3
    前i-1位有奇数个3,则第i位必须取3
    可以用f[i][0]表示前i位取偶数个3有几种情况,
    f[i][1]表示前i位取奇数个3有几种情况。
    则递推公式可以表示为:
       f[i][0] =f[i-1][0]*9+f[i-1][1]; (9:除3 外的每一个数字)
    f[i][1] =f[i-1][0] + f[i-1][1]*9; (9:除3 外的每一个数字)
    边界条件: f[1][1]=1;f[1][0]=9;
    说明:如果i 是最高位, 由于最高位不能是数字0 ,则将9改为8;

    #include<iostream>
    using namespace std;
    int main(){
    	int f[1001][2];
    	int n,x;
    	cin>>n;
    	f[1][1]=1;
    	f[1][0]=9;
    	for(int i=2;i<=n;i++){
    		x=9;
    		if(i==n)
    			x--;
    		f[i][0]=(f[i-1][1]+f[i-1][0]*x)%12345;
    		f[i][1]=(f[i-1][0]+f[i-1][0]*x)%12345;
    	}
    	cout<<f[n][0];
    	return 0;
    } 
    
    展开全文
  • 【算法】无序数组中求中位数

    千次阅读 2017-10-05 11:23:31
    一个无序数组的中位数。 如:{2,5,4,9,3,6,8,7,1}的中位数为5。 要求:不能使用排序,时间复杂度O(n)。 分析因为题目指定不能使用排序算法,而且要求时间复杂度O(n),也就是要求一次遍历就得给出结果。所以排序...
  • 偶数个3【递推公式

    千次阅读 2015-10-28 20:55:39
    在所有的N位数,有多少个数中偶数个数字3? 输入 第一行为一个整数T,代表有T组数据。(T) 接下来T行,每行一个正整数N。(1) 输出 每行输出一个整数,即方案(由于结果可能很大,你只需要输出这个答案...
  • 中位数

    千次阅读 2013-03-19 10:23:57
    中位数(Medians)统计学名词,是...当N为偶数时,中位数则为处于中间位置的2个变量值的平均数。 中位数的作用  中位数的作用与算术平均数相近,也是作为所研究数据的代表值。在一个等差数列或一个正态分布数列中,中
  • VBA中位数函数

    千次阅读 2019-08-29 21:16:52
    最近在做财务分析方面的开发,遇到了中位数据的问题,中位数在Excel中使用非常的方便,有现成的函数【Median】,直接拿来用就可以了,但在Access中该怎么操作呢? 首先,我们先要了解一下什么是中位数,百度词条中是...
  • 两个等长有序数组的中位数

    千次阅读 2015-01-02 12:00:57
    设两个有序数组的长度均为n,它们组成的2n长的数组的中位数。 首先说明下中位数的定义: 统计学名词,当变量值的项数N为奇数时,处于中间位置的变量值即为中位数;当N为偶数时,中位数则为处于中间位置的2个...
  • //获取一个二进制序列所有的偶数位和奇数,分别输出二进制序列。  首先需要了解一个知识点:获取二进制n的对应i位置的二进制,只需(n &gt;&gt; i)&amp; 1  解题思路:  1&gt; ...
  • C语言:两个有序数组的中位数

    千次阅读 2019-05-07 15:27:21
    尤其是链接中的 割 的思想 求中位数最大的问题是数组个数的奇数偶数问题 length/2 +1(length为奇数) mid={ length/2+1的值+length/2的值 除以2 (length为偶数) 割的思想: 例子 有数组 1,2,3,4 ...
  • 中位数(又称中值,英语:Median)

    千次阅读 2013-09-05 10:46:50
    如果观察值有偶数个,则中位数不唯一,通常取最中间的两个数值的平均数作为中位数。 一个数集中最多有一半的数值小于中位数,也最多有一半的数值大于中位数。如果大于和小于中位数的数值个数均
  • java 计算中位数方法

    千次阅读 2019-10-08 10:20:51
    最近工作需要 要求把python的代码写成java版本,python中有一个np.median()求中位数的方法,java决定手写一个 先说说什么是中位数中位数就是中间的那个数, 如果一个集合是奇数个,那么中位数就是按大小排列...
  • 汇编-数组所有偶数的和

    千次阅读 2016-04-19 20:58:11
    程序重点:使用test命令来判断一个是不是偶数,而不是使用除2余数。 使用除2余数的方法太占寄存器了,设置被除需要使用eax,设置除数需要一个寄存器,假定使用ebx,两者的商会存放到eax,同时把余数存放到...
  • 1问题 QQ群里的提问 ...3 实际上数组公式我不太懂(下面是百度到的,稍后学下) https://baijiahao.baidu.com/s?id=1610563904907045859&wfr=spider&for=pc =IFERROR(INDEX($A$2:$D$21,SMALL(IF($C$...
  • 均值 描述:一组数据的平均值 公式:u = 1/n ∑[n,i=1]Xi = 1/n(X1 + X2 + ......如果数据总个数为偶数中位数就是中间两个数据的平均值 众数 描述:数据中出现次数最多的数 一组数据中,可能存在多个众数,也可能不
  • 也是看了一篇很好的博客,思路很清晰,只是有些地方感觉博主没有详细解释...请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。示例 1:nums1[1,3]nums2[2]中位数:2.0示例 2:nums1[1,2]nums2[...
  • 中位数

    千次阅读 2013-09-06 22:52:28
    中位数指的是一列数按照从小到大排列,然后取中间的那个(如果数列个数是奇数,取中间的,如果是偶数,取中间两个的平均数)。 给定的是无序的数组,如何快速的找到中位数? 分析:首先给数组进行排序,可以快排...
  • 带权中位数

    2012-11-06 18:37:12
    这类问题实际上就是带权中位数位置问题。  一、带权中位数问题 中位数是统计学中的一个名词,把一组数据按大道小顺序排列,处在最中间闻之的那个数就叫做中位数中位数,将数据分成前后两个部分,用来表
  • 给定一段连续的整数,出他们所有偶数的平方和以及所有奇数的立方和。  Input 输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成。  Output 对于每组输入数据,输出一行,应包括两个整数x...
  • 已知有两个等长的非降序序列S1, S2, 设计函数S1与S2并集的中位数。有序序列A​0​​,A​1​​,⋯,A​N−1​​的中位数指A​(N−1)/2​​的值,即第⌊(N+1)/2⌋个数(A​0​​为第1个数)。 输入格式: 输入分三行。...
  • 中位数是指将数据按大小顺序排列起来,形成一个数列,居于数列中间位置的那个数据。中位数用Me表示。  从中位数的定义可知,所研究的数据中有一半小于中位数,一半大于中位数中位数的作用与算术平均数相近,也...
  •  中位数:分类数据组的中间值(如果数据个数为偶数,则是两个中间数值和的一半)  众数:数据组中出现次数最多的值(或者一组值)   异常值:比几乎其他所有数字都要 大/小 很多的数值   加权平均值:对变量在...
  • 两个有序数组求解下中位数

    千次阅读 2015-09-07 23:32:49
    问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回下中位数)。 解题思路是利用了二分的思想,假设两个数组存在中位数mid,然而一定有(len(num1)+len(num2))/2个数小于...
  • 数据挖掘中的中位数

    千次阅读 2013-07-01 17:14:44
    在数据挖掘的学习中,遇到了中位数的概念,一GOOGLe之下,其实发现以前的课本等是没学习到的,但现在的中小学生都有学了,现在复习一下  中位数的含义 中位数是将数据按大小顺序排列起来,形成一个数列,居于数列...
  • 1:n个元素组成的集合,第i个顺序统计量,就是该集合中第i小的元素...如果n是偶数中位数有两个,分别位于n/2和(n/2) + 1。    2:选择问题,就是选择第i个顺序统计量的问题。如果利用排序的话,那最快可以在O(n
  • 海明码的步骤,第一步就是先要确定海明码的校验的位数,设n为有效信息的位数,k为校验的位数,则信息n和校验k应满足:n+k&lt;=2^k-1,如果要校验两错,就需要增加一校验公式是怎么来的呢...
  • P1494杨辉三角形偶数 Accepted 标签:curimit[显示标签] 背景 curimit最近心情特别不好,尤其是看到偶数。 描述 某天,curimit在玩耍时,发现了一个纸头...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,408
精华内容 6,563
关键字:

偶数求中位数公式