精华内容
下载资源
问答
  • 快速中位数的算法

    万次阅读 2019-07-14 07:35:59
    众所周知,quick sort的时间复杂度为O(N*log(N)),利用quick sort的原理可以实现经典的找任意...找了一下快速计算中位数的方法,找到一篇有趣的报告:“Fast Median Search: an ANSI C implementation”。这篇报告提...

    众所周知,quick sort的时间复杂度为O(N*log(N)),利用quick sort的原理可以实现经典的找任意第K大的数的算法:时间复杂度为O(N)。不过这个算法基于快速排序,常数项很大,只是理论上很有意思的方法,但实践中很少拿来用。

    找了一下快速计算中位数的方法,找到一篇有趣的报告:“Fast Median Search: an ANSI C implementation”。这篇报告提供了几种找中位数的方法以及时间比较和实验计算的分析,并附有 C source code。这篇报告用的方法都是从没排序的数组中找第k小的数字,而找中位数只是这个问题的特殊化罢了。关键在于从不同的角度思考中位数的定义:

    The median of a list of N values has the property that in the list there are as many greater as smaller values than this element.

    对于找中位数这个特殊应用来说,这是一个很漂亮的出发点,值得学习。

    转载于:https://www.cnblogs.com/clive/archive/2009/09/14/Fast_Median_Search.html

    展开全文
  • 查找中位数(java 快速排序)

    千次阅读 2016-10-31 16:14:39
    对于有限的数集,可以通过把所有观察值高低排序后找正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。 java代码:import java.util.*; /** * @version 1.0 * @author ...

    中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
    java代码:

    import java.util.*;
    /**
     * @version 1.0
     * @author zhouxiaowu
     *
     */
    public class MedianFinder {
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            System.out.println("please input some numbers:");
            String str = sc.nextLine();
            String[] s = str.split("\\s+");
            int[] num= new int[s.length];
            for(int i=0;i<s.length;i++){
                num[i]=Integer.parseInt(s[i]);
            }
            double med=medianFinder(num);
            System.out.println("median is :"+med);
    
        }
        public static double medianFinder(int[] num){
            int mid;
            int len=num.length;
            double med;
    
            if(len%2==0){
                mid=len/2;
             med=(select(num,mid)+select(num,mid-1))/2.0;
            }
            else{
                mid=(len-1)/2;
                med=(double)select(num,mid);
            }
            return med;
        }
        public static int select(int[] num,int k){
            int low=0;
            int high=num.length-1;
            int j=0;
            int val=0;
            while(low<high){
                j=partition(num,low,high);
                if(j==k){
                    val=num[j];
                    break;
                }else if(j>k){
                    high=j-1;
                }else{
                    low=j+1;
                }
            }
            return val;
    
        }
        public static int partition(int[] num,int low,int high){
            int i=low;
            int j=high;
            int temp=num[i];
            while(i<j){
                while(i<j && temp<=num[j])
                    j--;
                if(i<j)
                    num[i++]=num[j];
                while(i<j && temp>=num[i])
                    i++;
                if(i<j)
                    num[j--]=num[i];
            }
            num[i]=temp;
            return i;
        }
    
    }
    

    测试结果:
    input:4 6 8 1 9 7 5
    output:median is :6.0
    input:4 3 6 1 9 6
    output:median is :5.0

    展开全文
  • java 计算中位数方法

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

    最近工作需要 要求把python的代码写成java版本,python中有一个np.median()求中位数的方法,java决定手写一个

    先说说什么是中位数:

    中位数就是中间的那个数,

    如果一个集合是奇数个,那么中位数就是按大小排列后,最中间那个数,

    如果一个集合是偶数个,那么中位数就是按大小排列后,最中间那2个数的平均数。

    比如:

    1,2,3,4,5  那中位数就是3

    1,2,3,4,5,6 那中位数就是 (3+4)/2 = 3.5

    知道逻辑后方法就很简单了 下面是代码

    public static void main(String[] args) {
    	List<Integer> total = new ArrayList<Integer>();
    	total.add(4);
    	total.add(2);
    	total.add(3);
    	total.add(1);
    	total.add(5);
    	total.add(6);
    	double a = median(total);
    	System.out.println(a);
    }
    private static double median(List<Integer> total) {
    	double j = 0;
    	//集合排序
        Collections.sort(total);
        int size = total.size();
        if(size % 2 == 1){
        	j = total.get((size-1)/2);
        }else {
        	//加0.0是为了把int转成double类型,否则除以2会算错
        	j = (total.get(size/2-1) + total.get(size/2) + 0.0)/2;
        }
    	return j;
    }

    1. 方法内先判断集合是奇数还是偶数,如果是奇数那么就是第n+1/2个数 ,也就是下标为n-1/2的值,

    如果是偶数 就是第n/2和n/2+1的数的平均值 也就是下标为n/2-1和n/2的平均值

    2. 该方法传入的是list集合  如果为数组  可以先用Arrays.aslist()方法转换后传入

    转载于:https://www.cnblogs.com/zhi-ming/p/10453132.html

    展开全文
  • 快速排序和寻找中位数复杂度分析

    千次阅读 2019-02-20 09:45:10
    之所以,起“快速排序和寻找中位数”这个题目,并不是因为寻找中位数的时候使用了快速排序,而是这两个算法使用了一个同一个预处理结构 —— 划分,然后都是递归解决!中位数的也是根据一个数把原来的数划分一下,...

    转载自:http://ilovers.sinaapp.com/article/快速排序和寻找中位数

    寻找中位数

    之所以,起“快速排序和寻找中位数”这个题目,并不是因为寻找中位数的时候使用了快速排序,而是这两个算法使用了一个同一个预处理结构 —— 划分,然后都是递归解决!中位数的也是根据一个数把原来的数划分一下,形成两部分。如果前半部分足够长,就在前部分找,否则在后半部分找!(这不仅适合中位数,实际上适合寻找第 k 大的数!!而 select_middle 其实不是来寻找中位数,是在寻找第 nth 大的数,如果 nth == (n+1)/2,这就是中位数!)

    select_middle(int *data, int start, int last, int nth); 说明:data 是数据,start 是起始位置,last 是最后一个数据的下一个位置,nth 指定要寻找第 nth 大的数!划分和快速排序是一模一样的,递归那部分也很简单,如果左半部分长就在左半部分找,如果右半部分长,就在右半部分找剩下的小一部分,比如 nth == 10,如果左边个数是 4,那么就在右边找第 6th 大的数!跟快速排序不同的是,递归只需要针对一部分处理!

    复杂度分析

    blog 还不能到此结束!O__O"…快速排序写起来不容易,插入排序、冒泡儿排序和简单选择排序,都很容易写出来丫,那 me 们为什么要花这么长时间写个快速排序呢?时间复杂度低?低在哪里?还有就是寻找中位数的程序,不,是寻找第 k 大数的程序,那样写有神马好处?它的复杂度能低于 O(nlogn) 吗?!基于划分的求 nth 大的数的那个程序,最坏情况是 O(n^2),平均是 O(n) ! O__O"…

    严格的分析是 me 不喜欢的,但是 me 也不希望太过于“想当然”。先看快速排序 —— 先划分再递归排序。当然有极端情况,有木有!比如 1 2 3 4 5 这样的,每次划分,一部分只有一个数据,另外一部分还是特别多,这样的话,递归要多少次呢?差不多 n 次吧?每递归一次对于数据还很多的那一部分差不多还需要 n 的重新划分吧,那么复杂度上限就是 O(n^2) 有木有!所以快速排序最坏情况的时间复杂度是 O(n^2) 。但是,最坏的情况,要么就是正向有序,要么就是逆向有序,而多数情况,可以想象(就权当是吧),每次划分,分成差不多相等的两部分,然后每一部分再处理,直到每一部分只有 1 个元素为止!如果用递推公式描述复杂度,可以用下图的第三个表示:

    T(n) = T(n/2)

    T(n) = 2T(n/2)

    T(n) = 2T(n/2) + n

    T(n) = T(n/2) + n

    如果最初是 8 个元素,第一次划分,大体是 4+4,第二次划分大体是 2+2,第三次是 1+1,递归深度是 log n 有木有!每次重新划分,就按 n 算,时间复杂度 O(nlogn) !那 O(nlogn) 是不是选择中位数的那个程序的时间复杂度呢?

    前面的四个式子,实际反应了四种情况,虽然看上去都是分治,然后递归解决!第一种情况是个神马情况呢?意思是处理 100 个数据,和处理其中 50 个数据是一样的!处理 50 个和处理其中的 25 个一样的!而这种划分,竟然没有代价,因为后面没有 + 任何东西!这样的话,想象一下,对于所有的 n,问题都可以转化为处理 1 个数据的情况,而且几乎不增加额外开销,那么复杂度就是 O(1) 丫,有木有!再看第三个式子,反映的是,需要 100 个工作量将 100 化成 50+50 的两部分,每一部分的 50 都要递归求解,所以是 2 倍丫!上面说了,复杂度是 O(nlogn),如果用式子看:T(8) = 2T(4) + 8 = 4T(2) + 2*4 + 8 = 8T(1) + 4*2 + 2*4 + 8 = 8 + 8 + 8 + 8 + 8 = 4*8,更通用有点:

    T(2^n) = 2^n + 2 (2^ n-1) + 4() + 8 () + ... + 2^n = (n+1)2^n,也就是 T(n) = (logn+1)n

    上面虽然是近似计算,但是已经能反映问题了。还有就是第二个式子和第四个式子反映的是神马情况?第二个式子反映,划分不需要代价,划分成两部分,两部分工作量再加在一起,O__O"… !给人感觉,这样的话,T(n) = n ! 有木有!比如 n = 8,T(8) = 2T(4) = 4T(2) = 8 T(1) = 8 ,这貌似是个线性时间!O__O"…

    第四个式子反映,需要 n 步将一个工作量为 n 的划分成两部分,后续只需要处理两部分中的一部分!没有 2 倍关系有木有!将递推式子迭代下去:

    T(n) = n + n/2 + n/4 + n/8 + ... + 1 = 2n !O__O"…,

    这是神马情况?!线性时间?系数是 2 ?!好吧,也就是说,如果真的能均匀划分的话,上面求中位数的程序的时间复杂度就是 O(n) ! 当然,实际上常量系数要高一些,不会仅仅只有 2 !

    寻找中位数题目因为每次划分后只需要处理其中的一半,另外一般不用管,所以应该用T(n) = T(n/2)计算时间复杂度。

    后话

    上面的程序和复杂度分析是 me 写的,而主要的算法思想等来自数据结构、算法(算法导论)和程序设计语言(c程序设计语言)。对于程序和复杂度分析,或是 blog 有其他错误的地方,不吝赐教丫,O__O"…对了,编程之美上有一道题,这里作为最后一个补充呈献上来:n 个数中,已知某个数出现的次数多于一半,请找出来这个数!为嘛留这个题了,貌似要找的数,一定是中位数有木有!!当然还有其他解法,而且复杂度可以降到 O(n),O__O"…

    展开全文
  • 给一个无序数组array和数组长度n,找其中的中位数(这里考虑n为奇数) Sample: ***** Input: ***** @[@(500),@(120),@(7),@(220),@(3),@(8),@(4),@(200),@(100) ***** Output: ***** 100 解法一:将数组...
  • SQL 如何计算每个分组的中位数

    千次阅读 2020-06-15 14:31:49
    怎么查询数据分组以后每个组的中位数呢? 用SQL来解决这个问题是很有难度的! SQL的集合是无序的,没有数据位置的概念,需要人为地造行号,但是要对各分组独立编行号也困难。后来在SQL2003标准中加入了窗口...
  • 从海量数据中找出中位数

    千次阅读 2020-03-14 18:51:32
    题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 关于中位数:...
  • 包含 Emond 和 Mason ... 在 Kemeny 公理方法下处理弱排名和部分排名时识别中位数排名的准确算法。 提交。 技术报告可在 arXiv 预印本 arXiv:1502.06498 获得,标题为:用于共识排序估计问题的快速准确的启发式算法。
  • bfptr算法(即中位数中位数算法)

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

    千次阅读 2020-06-15 11:48:24
    常规(数据量不大的情况)求中位数和基于插值计算中位数的方法 在学数学时我们学到过求中位数的方法,在数据个数为偶数时找最中间的两个数然后求平均数如果数据个数为奇数时则只需找数据个数一半的那位上的数字...
  • 快速计算32位数1的位数 Sailor_forever sailing_9806@163.com 转载请注明http://blog.csdn.net/sailor_8318/archive/2008/10/12/3059935.aspx 一语句实现x是否为2的若干次幂的判断#define is2*n(x) ((x & (x - ...
  • 题目1157:中位数快速排序思想

    千次阅读 2014-03-01 16:55:23
    题目1157:中位数 时间限制:1 秒 ...中位数定义:一组数据按从小到大的顺序依次排列...给一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数) 输入: 该程序包含
  • BFPRT(中位数中位数)算法

    千次阅读 2017-10-09 16:05:05
    BFPRT 算法又称为 “中位数中位数算法”,该算法由 Blum、Floyd、Pratt、Rivest、Tarjan 在1973年提出,最坏时间复杂度为 O(n) TOP-K问题
  • Python实现求中位数

    2020-08-25 16:22:35
    使用python的内置方法list.sorted()对序列进行排序取中位数 实现 设数据为test: #作者:FarryNiu test = [5,5,6,4,5,4,7,1,10,2,11,10,10] #对test进行升序排列 print(sorted(test)) #偶数 if len(test)%2 == 0: ...
  • 大数的中位数问题

    千次阅读 2015-04-06 21:21:32
    腾讯面试题:10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。 题目和基本思路都来源网上,本人加以整理。 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写思路即可...
  • 改良中位数无滞后滤波算法

    千次阅读 2016-11-16 22:44:21
    改良中位数无滞后滤波算法,如果一个信号中既快速又有脉冲干扰,还希望滤波结果在没有脉冲干扰时没有滞后或滞后较小,那应该选哪种滤波算法呢?
  • 突然有一天我想到可以使用快速排序可以查找中位数,当然,我所说的并不是让快速排序将一个数组排好序再去找中位数,而是 向着中位数所在的位置去排序 ,例如有个数组 [4,3,7,8,5,4,2,5,65] ,我们知道如果排序好之后...
  • 基于中位数回归分析方法, 利用变量选择降维技术(正则化估计), 提出了一种稳健、有效的特征提取(变量选择)新方法, 并具体给了估计算法, 该算法具有快速计算的特点。实验结果表明, 新方法能够有效地对高维数据...
  • 说明:这是武汉理工大学计算机学院【算法设计与分析】课程的第一次实验第一题:分治法与中位数问题 >>点击查看WUTer计算机专业实验汇总 谨记:纸上得来终觉浅,绝知此事要躬行。 一、问题描述 输入任意一...
  • 海量数据中寻找中位数

    千次阅读 2012-09-10 11:34:29
    题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。  关 于中位...
  • 对于有限的数集,可以通过把所有观察值高低排序后找正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。 然后这个题答案: 内存足够的情况: 可以使⽤用类似quick ...
  • 100亿个数中寻找中位数

    千次阅读 2015-10-17 16:56:05
    在一个大文件中有100亿个32位整数,乱序排列,要求找出中位数;内存限制为512M;请写算法设计思路; 基本分析: (1)中位数的定义:一个给定排序好的序列,奇数个的话,我们就取中间的一个;偶数个的话,我们...
  • 加权中位数这是算法导论9-2的习题大概意思是有一个无序集合,这个集合中的所有元素都带有有一个权重,权重之和为1。例如权重集合为w[]={0.1,0.35,0.05,0.1,0.15,0.05,0.2};元素集合为x[]={4,3,12,8,7,6,5.2}; 所谓...
  • 如何快速算出一个的n次方?

    千次阅读 2021-07-20 00:15:48
    投稿作者 OIer,目前对计算机及算法的了解主要在信息学竞赛方面。本文主要讲解平方求幂(快速幂)相关,凡涉及大整数,都会进行对定值取模等处理,所以存储越界导致的错误、位数过多导致的单次运算...
  • 海量数据中查找中位数

    千次阅读 2011-01-27 23:07:00
    海量数据 查找 中位数
  • 二维邮局选址问题-带权中位数

    千次阅读 2013-03-13 09:28:40
    算法设计练习作业,邮局选址问题,将自己写的分享,有问题请指正,希望共同学习。... *邮局选址问题,带权中位数 *输入的坐标不能相同,即x或y各自是n个不同的数,该程序为不同的整型数 *输入在文件input中,第一行

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 279,408
精华内容 111,763
关键字:

如何快速算出中位数