精华内容
下载资源
问答
  • 希望你也加入人工智能的队伍来!请点击http://www.captainbed.net /* * Created by Chimomo * * Let X[0...n-1] and Y[0...n-1] be the two arrays, each containing n numbers already in the so...

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

    /*
     * Created by Chimomo
     *
     * Let X[0...n-1] and Y[0...n-1] be the two arrays, each containing n numbers already in the sorted order.
     * Give an O(logn) time algorithm to find the median of all 2n elements in array X and Y.
     */
    
    #include <iostream>
    
    using namespace std;
    
    template<typename T>
    T median2(T *X, T *Y, int size) {
        int m = (size - 1) / 2;
        if (X[m] == Y[m]) {
            return X[m];
        } else if (X[m] > Y[m]) {
            return size == 1 ? Y[m] : median2(X, Y + size - m - 1, m + 1);
        } else {
            return size == 1 ? X[m] : median2(X + size - m - 1, Y, m + 1);
        }
    }
    
    int main() {
        int a[6] = {1, 2, 3, 7, 19};
        int b[6] = {12, 13, 25, 28, 33};
        int median = median2(a, b, 5);
        cout << median << endl;
        return 0;
    }
    
    // Output:
    /*
    12
     
    */

     

    展开全文
  • 程序设计-求N个数的中位数(C++)

    万次阅读 多人点赞 2019-02-28 10:19:02
    分享一个牛的人工智能教程。... * 对于一组有有限个数的数据来说,它们的中位数是这样的一种数:这群数据里的一半的数据比它,而另外一半数据比它。 * 计算有限个数的数据的中位数的方法是:把所有的同类...

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击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
    
    */
    展开全文
  • 5亿个数找中位数

    千次阅读 2015-04-20 16:05:03
    找中位数最容易想到的方法就是,先对序列进行排序,取中位数,然而5亿个数要想全部读入内存需要将近2GB空间。 一种想法是采用外部排序的方法,在排序的过程中记录数据个数,找到中位数。首先采用hash() % 100,把...

    找中位数最容易想到的方法就是,先对序列进行排序,取中位数,然而5亿个数要想全部读入内存需要将近2GB空间。

    一种想法是采用外部排序的方法,在排序的过程中记录数据个数,找到中位数。首先采用hash() % 100,把数据分到100个文件中,然后对每个文件分别在内存中进行快速排序,再将100个小文件进行合并,并在合并过程中寻找中位数,时间复杂度是O(nlogn)

     

    另外一种方法是,将数据按照数据空间分为0-9999999,10000000-999999999, ……大概50个部分,每一部分存入一个小文件,统计每个小文件中的元素个数,由于文件之间相对有序,可以容易得出中位数是位于哪一个文件之中,并可以得出中位数在该小文件中的排序次序,用相同的方法对小文件进行处理,当文件内容比较小的时候可以直接在内存中进行找中位数操作,对于n个随机数找k小元素的时间复杂度是O(n),所以总的时间复杂度为O(n)

     

    5亿个数找不存在的元素

    想法是:将这5亿个数据按照大小分为50部分,0-9999999, 10000000-99999999…并分别存入文件中,对于每一个文件,只用找出每个文件中不存在元素即可

    展开全文
  • 用快速排序找中位数

    千次阅读 2013-12-20 10:39:03
    这个很好理解, 就像前K个数一样, 这个就像前n/2个数, 不过这里说只是要中位数就没有必要完了, 于是就可以规模的剪枝;剪枝方法就是递归的时候对不可能有中位数的区间就直接减掉, 这个可是很的一个...

    这个很好理解, 就像找前K个数一样, 这个就像找前n/2个数, 不过这里说只是要中位数就没有必要找完了, 于是就可以大规模的剪枝;剪枝方法就是递归的时候对不可能有中位数的区间就直接减掉, 这个可是很大的一个剪枝, 效率急速上升

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace  std;
    const int mmax = 10000001;
    int a[mmax + 5] = {1, 2, 4, 6, 3, 7, 5, 9, 8, 11, 3};  //待排数组
    int quick_sort(int, int);
    int len;                                               //需要排多少个数
    bool ok;											   //是否已经找到中位数
    int ans;												//找到的中位数
    //寻找中位数的快拍
    void quick(int left, int right){
    	if(ok)
    		return;
    	if(left < right){                        //递归结束条件1
    		int p = quick_sort(left, right);
    		if(p == len / 2){                    //递归结束条件2
    			ok = true;
    			ans = a[p];
    			return;
    		}
    		if(left < len / 2 && right > len / 2){   //剪枝,大幅度加快找的速度
    			quick(left, p - 1);
    			quick(p + 1, right);
    		}
    	}
    }
    //正常快排
    void quick2(int left, int right){
    	if(left < right){
    		int p = quick_sort(left, right);
    		quick2(left, p - 1);
    		quick2(p + 1, right);
    	}
    }
    void swaps(int *a, int *b){
    	int *c = new int(10);
    	*c = *a;
    	*a = *b;
    	*b = *a;
    }
    //快排核心
    int quick_sort(int left, int right){
    	int i = left, j = right;
    	int x = a[left];
    	while(i < j){
    		while(i < j && a[j] >= x)
    			j--;
    		if(i < j)
    		{
    			a[i] = a[j];
    			i++;
    		}
    		while(i < j && a[i] <= x){
    			i++;
    		}
    		if(i < j)
    		{
    			a[j] = a[i];
    			j--;
    		}
    	}
    	return i;
    }
    
    //随机生成len个随机数
    void su(){
    	int len = mmax;
    	for(int i = 0; i < len; i++){
    		a[i] = rand() % 100000000;
    	}
    }
    
    int main()
    {
    	len = mmax;
    	ok = false;
    	su();
    
    	//只是找中位数的排序
    	quick(0, len - 1);
    	cout << ans << endl;
    
    	
    	//排完序后的中位数
    	//是不是发现全部排完了再来找中位数很慢
    	quick2(0, len - 1);
    	cout << a[len / 2] << endl;
    
    	return 0;
    }

    快速排序很多时候都是高速效率算法的载体

    展开全文
  • 在 O(log2 N)时间出它们的中位数.搞得略头疼.但总算还是写出了代码.思想上就是,二分查找.虽然我起初用的是顺序查找.看来我的头脑还停留在线性比较上. 新的数组,假想的这个两个数组合并了的数组.其个数为偶数个,取...
  • 从海量数据中中位数

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

    千次阅读 2018-12-30 22:56:00
    中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数 (或最中间两个数据的平均数). 给出一组无序整数,求出中位数,如果求最 中间两个数的平均数,向下取整即可(不需要使用浮点数) 输入描述: ...
  • 中位数

    千次阅读 2015-10-11 18:07:50
    中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数或最中间两个数据的平均值(如果这组数的个数为奇数,则中位数为位于中间位置的那个数;如果这组数的个数为偶数,则中位数是位于中间位置的两个...
  • 二分法找中位数

    千次阅读 2017-09-23 21:27:01
    /* Name: 中位数median Author: 巧若拙 ...所谓中位数,是指将这n个数排序之后,排在正中间的数。 输入 第一行是两个整数n和m。 第二行是用空格隔开的n个整数 输出 一个中位数 样例输入 5 10 3 7 2 5
  • 找中位数问题——分治法

    千次阅读 2015-05-29 16:25:53
    题目:设A和B都是从小到大已经排好序的n个不等的整数构成的数组, 如果把A与B合并后的数组记作C,设计一个算法出C的中位数。 解题思路: 思路一: 对将A和B合并数组成C,并且进行排序,然后直接输出中位数。 该...
  • 查找中位数(java 快速排序

    千次阅读 2016-10-31 16:14:39
    对于有限的数集,可以通过把所有观察值高低排序出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。 java代码:import java.util.*; /** * @version 1.0 * @author ...
  • 给一个无序数组array和数组长度n,出其中的中位数(这里考虑n为奇数) Sample: ***** Input: ***** @[@(500),@(120),@(7),@(220),@(3),@(8),@(4),@(200),@(100) ***** Output: ***** 100 解法一:将数组...
  • lintcode两个排序数组的中位数

    千次阅读 2017-08-31 18:41:27
    两个排序数组的中位数   描述 笔记  数据  评测 两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n))。 您在真实的面试中是否遇到过...
  • 题目:在一个文件中有 10G 个整数,乱序排列,要求中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。     ...
  • 出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) 。 示例 1: nums1 = [1, 3] nums2 = [2] 中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 中位数是 (2 + 3)/2 = 2.5 这是问题,我刚...
  • 找中位数O(n)算法

    万次阅读 2015-07-21 10:09:29
    中位数排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。 样例 给出数组[4, 5, 1, 2, 3], 返回 3 给出数组[7, 9, 4, 5],返回 5 解题思路: 利用快排划分的思想,递归...
  • USTCOJ 1359 查找中位数 不用排序

    千次阅读 2013-03-22 16:34:02
    该题要求读入n个整数,然后输出该n个整数的中位数。同时输入的数的个数是奇数的时候,中位数是唯一的;当输入的数是个数是是偶数的时候,求两个中位数的平均值,然后下取整输出。 一般来说,我们可以将这些数存在...
  • 快速找中位数的算法

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

    千次阅读 2014-02-22 10:10:38
    一组数的中位数,就是把一组数从小到大排好后位居中间的 那一个;如果有奇数个数,那么中位数就是中间的那个;如果 有偶数个数,那么中位数就是中间两个数的平均数。 那么有没有办法不用排序就可以求出中位数的方法...
  • 无序数组找中位数

    千次阅读 2015-10-18 21:16:07
    如果数组长度是奇数,中位数排序后的第(n+1)/2个元素;若是偶数,中位数排序后第n/2个元素。 思路1: 1.1 将前(n+1)/2个元素调整为一个最小堆; 1.2 对后续每一个元素和堆顶比较,如果小于等于堆顶,丢弃之,去...
  • 题目:在一个文件中有 10G 个整数,乱序排列,要求中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 关于中位数:...
  • 出无序数组中位数的方法

    千次阅读 2020-01-13 13:10:48
    今早上在LintCode上做到了这种类型的题目,题目要求找到无序数组中位数在数组的位置,一开始想到的是利用快排的思想来做,但是由于只有十五分钟的时间,就直接用最普通的方式做了,思路是...1 直接排序找中位数 直接...
  • 两个排序数组的中位数

    千次阅读 2014-08-30 21:50:02
    题目:给定两个排序的数组a,b,长度分别为m和n,出这两个数组的中位数。时间复杂度为O(log(m+n))。 比如:a=[1,2,3,4],b=[2,3,4,]中位数为3。 假定a,b长度分别大于k,现在选择第k个数(排序后的第k个)...
  • 5个数6次比较找中位数int compare6(int a,int b,int c,int d,int e){ if(a)swap(a,b); if(c)swap(c,d); if(a){swap(a,c);swap(b,d);} if(b)swap(b,e); if(b){swap(b,c);swap(d,e);}
  • 然后如果有偶数个的话,中位数就是最中间两个数的平均数 lookup lookup是根据map中的键来取出相应的值的, 如上面的 sorted.lookup(1) ,得到的结果是一个序列 Seq[Int] 如果sorted是 RDD(( 1 ,...
  • 中位数与顺序统计应用将各种数据排序 注意:想在忽略大小写的情况下比较字符串进行排序,可以使用Java类型中定义的CASE_INSENSITIVE比较器,例如:Insertion.sort(a, String.CASE_INSENSITIVE_ORDER) 排序的稳定性:...
  • java 计算中位数方法

    万次阅读 2019-01-04 15:51:14
    最近工作需要 要求把python的代码写成java版本,python中有一个np.median()求中位数的方法,java决定手写一个 先说说什么是中位数中位数就是中间的那个数, 如果一个集合是奇数个,那么中位数就是按大小排列...
  • 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 537,328
精华内容 214,931
关键字:

找中位数需要由小到大排序吗