精华内容
下载资源
问答
  • 算法 - 求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
    
    */
    

     

    展开全文
  • 中位数

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

    问题描述
    中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数或最中间两个数据的平均值(如果这组数的个数为奇数,则中位数为位于中间位置的那个数;如果这组数的个数为偶数,则中位数是位于中间位置的两个数的平均值).
    给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数)
    输入
    该程序包含多组测试数据,每一组测试数据的第一行为N,代表该组测试数据包含的数据个数,1 <= N <= 15000.
    接着N行为N个数据的输入,N=0时结束输入
    输出
    输出中位数,每一组测试数据输出一行
    输入示例

    4
    10
    30
    20
    40
    3
    40
    30
    50
    4
    1
    2
    3
    4
    0

    输出示例

    25
    40
    2

    提示
    这是也一道经典的算法问题,在企业面试里出现概率很高,是“找到第K大的数”的变种。先排序再找中位数自然是很直接的做法,但排序本身很慢。我们只想找到第n/2大的数,对于其他数的顺序我们并不关心。那么怎么在不排序的前提下找到第n/2大的数呢?
    源码

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        int numGroup = 0;
        vector<int> numAve;
        while(1)
        {
            int N = 0;
            cin >> N;       
            if (N == 0)
            {
                break;
            }
            else
            {           
                vector<int> sample(N);
                for (int i = 0; i < N; i++)
                {
                    cin >> sample[i];
                }
                if (N%2 != 0)
                {
                    int k = N/2 +1;
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = i; j < N; j++)
                        {
                            if (sample[j] > sample[i])
                            {
                                int temp = sample[j];
                                sample[j] = sample[i];
                                sample[i] = temp;
                            }
                        }
                    }
                    numAve.push_back(sample[k-1]);
    //              cout << sample[k-1] << endl;
                } 
                else
                {
                    int k = N/2 +1;
                    for (int i = 0; i < k; i++)
                    {
                        for (int j = i; j < N; j++)
                        {
                            if (sample[j] > sample[i])
                            {
                                int temp = sample[j];
                                sample[j] = sample[i];
                                sample[i] = temp;
                            }
                        }
                    }
                    numAve.push_back((sample[k-2]+sample[k-1])/2);
    //              cout << (sample[k-2]+sample[k-1])/2 << endl;
                }
            }
            numGroup++;
        }
        for (int i = 0; i < numGroup; i++)
        {
            cout << numAve[i] << endl;
        }
        return 0;
    }

    ————————————————-2016/6/4———————————————–
    昨天师兄说起去面试的时候,他们让写个中值滤波的程序,想起找中位数这个问题。
    网上搜了一下,有些是借用了快排的思想做,最快的可达到最坏复杂度O(n)。
    有空要再好好看一下。

    展开全文
  • 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

    问题:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

    分析:

    数据时从一个数据流中读出来的,数据的数目随着时间的变化而增加。如果用一个数据容器来保存从流中读出来的数据,当有新的数据从流中读出来时,这些数据就插入到数据容器中。用什么样的数据结构比较合适呢?我们可以先分析下:

    一是没有排序的数组。很容易想到的是用Partition函数找到数组中的中位数。这样一来的话,插入一个数字和找出中位数的时间复杂度是O(1)和O(n)。

    二是排序的数组。但是插入操作的时间复杂度是O(n),由于是排好序的数组,所以找到中位数是一个简单的操作,只需要时间复杂度为O(1)。

    三是排序的链表。需要O(n)时间才能在链表中找到合适的位置插入新的数据。之前我们讨论过采用两个指针指向链表中间结点,那么可以在O(1)时间找到中位数。这样一来,时间效率与基于排序的数组的时间效率是一样的。

    四是二叉搜索树。可以将把插入新数据的平均时间降到O(nlogn),但是问题是当二叉搜索树极度不平衡的时候看起来像一个排序的链表,插入新数据的时间将是O(n)。为了得到中位数,可以在二叉树结点中添加一个表示子树结点数目的字段。凭借这个字段,可以在平均时间O(nlogn)时间得到中位数,但最坏的情况仍然需要O(n)时间。

    五是利用平衡的二叉树,即AVL树。AVL树的平衡因子定义是左右子树的高度差,为找到中位数,我们可以把AVL树的平衡因子定义为左右子树结点数目之差。这样一来可以在O(nlogn)时间内往AVL树添加一个新结点,同时用O(1)时间得到我们需要的中位数。可以说AVL树的效率是最高的,但在短时间内编写其代码不是件容易的事。

    六是最大堆和最小堆结合。如果数据在容器中已经排序,那么中位数可以由P1和P2指向的数得到,如果容器中数据的数目是奇数,那么P1和P2指向同一个数据。如下图所示:

    如图整个数据容器分隔成两个部分,位于容器左边部分的数据比右边的数据小,P1指向的数据是左边部分最大的数,P2指向的数据是右边部分最小的数。如果我们能够保证数据容器左边的数据都小于右边的数据,这样即使左右两边内部的数据没有排序,也可以根据左边最大数和右边最小数得到中位数。所以自然想到的是用一个最大堆实现左边的数据容器,用最小堆实现右边的数据容器。这样一来,可以在O(nlogn)时间内添加一个新结点,同时用O(1)时间得到我们需要的中位数。在分析上我们必须起码满足两个基本保证:一是保证数据平均分配到两个堆中,因此两个堆中数据的数目之差不能超过1,所以在数据总数目是偶数时把新数据插入到最小堆中或最大堆中;二是保证最大堆里的所有数据都小于最小堆中所有的数据。编写代码时,要仔细考虑。

    不同数据结构的比较如下:


    综上,采用最大堆和最小堆相结合的方案是性价比最高。

    import java.util.*;


    public class Solution{
    int count;
    PriorityQueue minHeap = new PriorityQueue();
    @SuppressWarnings("unchecked")
    PriorityQueue maxHeap = new PriorityQueue(11, new Comparator() {


    @Override
    public int compare(Object o1, Object o2) {
    // TODO Auto-generated method stub
    // PriorityQueue默认是小顶堆,实现大顶堆,需要反转默认排序器
    return ((Integer) o2).compareTo((Integer) o1);
    }
    });


    public void Insert(Integer num) {
    count++;
    if ((count & (0x1)) == 0) { // 判断偶数的高效写法


    if (!maxHeap.isEmpty() && num < (Integer) maxHeap.peek()) {
    maxHeap.offer(num);
    num = (Integer) maxHeap.poll();


    }


    minHeap.offer(num);


    } else {
    if (!minHeap.isEmpty() && num > (Integer) minHeap.peek()) {
    minHeap.offer(num);
    num = (Integer) minHeap.poll();


    }


    maxHeap.offer(num);


    }


    }


    public Double GetMedian() {
    if (count == 0) {
    throw new RuntimeException("no available number!");
    }
    // 总数为奇数时,大顶堆堆顶就是中位数
    double result;
    if ((count & (0x1)) == 1) {
    result = Double.parseDouble(maxHeap.peek() + "");
    }


    else {
    result = (Double.parseDouble(minHeap.peek() + "") + Double
    .parseDouble(maxHeap.peek() + "")) / 2.0;
    }


    return result;


    }
    }


    展开全文
  • 中位数(C语言)

    万次阅读 2017-06-19 17:50:46
    如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。 现在给出n个正整数,求他们的中位数。 Input 第一行:n——数列数字的...

    Description

    计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序排列。如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;如果数据的个数是偶数,则中间那2个数据算术平均值就是这群数据的中位数。现在给出n个正整数,求他们的中位数。

     

    Input

    第一行:n —— 数列数字的个数(1 <=n<=1000)。

    第二行:有n个正整数,每两个数中间用空格隔开(每一个正整数都小于10000)。

    Output

    求这N个正整数的中位数(保留小数点后两位有效数字)。

    Sample Input

    4
    1 2 3 4
    3
    1 2 3
     

    Sample Output

    2.50
     

    2.00

     

    题目链接:   http://ccpc.ahu.edu.cn:8080/OJ/Problem.aspx?id=734

    AC代码:

    #include <stdio.h>  
    #include <stdlib.h>  
     //递增 的快排算法
    int compInc(const void *a, const void *b)  
    {  
        return *(int *)a - *(int *)b;  
    }  
      
    int main()  
    {  
        float k;		//注意输出格式            
        int i,j,n,t;
        int a[1001];
        int len ; 
          
           while(scanf("%d ",&len)!=EOF){   //要注意输入的终止条件
        for(i=0;i<len;i++)   //输入
             scanf("%d",&a[i]);
       // printf("递增排序结果:\n");  
        qsort(a, len, sizeof(a[0]), compInc);  
         if(len%2==0) {          //奇偶取中位数的方法不一样
                k=(a[(len/2)-1]+a[(len/2)]);
             printf("%.2f\n",k/2.00);
             }
            else {
                k=a[len/2];
                printf("%.2f\n",k);//注意输出格式   
            } 
        //    break;
            
    }
        return 0;  
    }   
    

    这个题目没什么特别的地方。

     

    首先是排序,按照递增或递减都可以。

    把排好序的数存放在一个数组中方便后面调用。

    看存放在数组中的数的长度。取中间值(奇数直接取中间值,偶数用中间的两个数的平均值)

    注意:数组是从 a[0] 还是从 a[1] 存放的。
     

     

    展开全文
  • 文章目录算数平均数、中位数、众数和几何平均数 算数平均数、中位数、众数和几何平均数 统计数据时经常用到的几种数的比较: ...中位数是按顺序排列的一组数据中居于中间位置的数,即在这组数据中,有一半的...
  • java 计算中位数方法

    千次阅读 2019-01-04 15:51:14
    中位数就是中间的那个数, 如果一个集合是奇数个,那么中位数就是按大小排列后,最中间那个数, 如果一个集合是偶数个,那么中位数就是按大小排列后,最中间那2个数的平均数。 比如: 1,2,3,4,5 那中位数...
  • Java实现 LeetCode 480 滑动窗口中位数

    万次阅读 多人点赞 2020-03-19 10:44:44
    中位数是有序序列最中间的那个数。如果序列的大小是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) / 2 = 2.5 给你一个数组 nums,有一个大小...
  • 算数-平均数、中位数和众数平均数

    千次阅读 2015-11-10 22:42:10
    中位数(median):一列数按大小顺序排列后,处于中间的那个数。如果这列数有奇数个,那么中位数正好在数列的中间;如果这列数有偶数个,那么中位数中间两个数的平均数。众数(mode):众数是一列数中出现次数最多...
  • Java实现 LeetCode 295 数据流的中位数

    万次阅读 多人点赞 2020-03-05 17:03:42
    中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - ...
  • bfptr算法(即中位数中位数算法)

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

    千次阅读 2016-06-04 13:02:20
    mysql中位数 奇数去中间的,偶数取中间两个数的平均值SELECT avg(t1.money) as median_val FROM ( SELECT @rownum:=@rownum+1 as row_number, d.money FROM core_order d, (SELECT @rownum:=0) r WHERE 1 – ...
  • 从海量数据中找出中位数

    千次阅读 2020-03-14 18:51:32
    关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N...
  • [CQOI2009]中位数

    千次阅读 2021-02-23 23:50:43
    中位数是指把所有元素从小到大排列后,位于中间的数。 输入描述: 第一行为两个正整数n和b ,第二行为1~n 的排列。 输出描述: 输出一个整数,即中位数为b的连续子序列个数。 示例1 输入 7 4 5 7 2 4 3 1 6 输出 4 //...
  • 水题 求中位数

    千次阅读 2019-01-02 18:25:08
    中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数(或最中间两个数据的平均数). 给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数) 输入描述: ...
  • phone.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"); 152****4799 idCard.replaceAll("(\\d{4})\\d{10}(\\w{4})","$1*****$2"); 4304*****7733 ...$1、$2、……表示正则表达式里面第一个、第二个、……括号...
  • 中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。 样例 给出数组[4, 5, 1, 2, 3], 返回 3 给出数组[7, 9, 4, 5],返回 5 思路:先快排, int getMidIndex(vector &nums,...
  • 求数据流中的中位数

    千次阅读 2016-04-11 13:37:13
    如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 思路:可以建立一个大堆maxHeap用来保存较小n...
  • Java||求集合数组中的中位数

    千次阅读 2019-08-03 22:05:44
    简单解释就是最中间的那个数,如果集合是奇数个,则中位数是按大小排列最中间那个数,如果集合是偶数个,则中位数就是按大小排列最中间那两个数的平均数。 求解: 先判断这个集合是奇数还是偶数,如果是奇数那么...
  • 中位数定义为,将一个数列排序后位于中间的数值(数列长度为奇数时,取正中间的数,长度为偶数时,去中间的两个数的平均) 众数定义为,在一个数列中,出现次数最多的那个数值。 python代码实现:#计算平均数 def ...
  • python求解中位数、均值、众数

    万次阅读 2019-02-16 11:19:19
    首先定义一个数据,在这里我假定为: num=[2,3,2,5,1,0,1,2,9] 一、求中位数  中位数(又称中值,英语:Median),统计学中的专有名词...如果观察值有偶数个,则中位数不唯一,通常取最中间的两个数值的平均数...
  • SQL 如何计算每个分组的中位数

    千次阅读 2020-06-15 14:31:49
    中位数是指一组数据排序以后,位于中间位置的数据值。如果数据个数是奇数,中位数就是最中间位置那个值;如果是偶数,则是中间位置那两个数的平均值。 怎么查询出数据分组以后每个组的中位数呢? 用SQL来解决这个...
  • Java实现-中位数

    万次阅读 2017-06-18 14:48:42
    中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。 您在真实的面试中是否遇到过这个题?  Yes 样例 给出数组[4, 5, 1, 2, 3], 返回 3 给出数组[7, 9, 4, ...
  • 数值型数组的中位数是在数据排序后位于数组中间项的值。如果数组有偶数个元素,中位数就是最中间的两个数值的平均数。 中位数对于了解“我的值是否位于中间?”非常有用。比如,我在学校的最后一次考试中得了 D ...
  • 利用SQL求中位数(已修复BUG)

    万次阅读 热门讨论 2019-09-18 16:48:36
    中位数是指将集合中的元素按照升序排序后恰好位于正中间的元素。如果元素个数是偶数,则取中间两个元素的平均值作为中位数。 那么如何利用SQL求中位数呢? 将集合的元素按照大小分为上半部分和下半部分两个子集...
  • Hive自定义聚合函数UDAF(计算中位数)

    千次阅读 2019-08-24 22:30:11
    中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有...
  • [剑指Offer]- 数据流中的中位数

    千次阅读 2019-05-24 18:41:13
    如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 由于数据是从一个数据流中读出来,因而数据的...
  • 查找中位数(java 快速排序)

    千次阅读 2016-10-31 16:14:39
    对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。 java代码:import java.util.*; /** * @version 1.0 * @author ...
  • 一组数据中如果有特别大的数或特别小的数时,一般用中位数 一组数据比较多(20个以上),范围比较集中,一般用众数 其余情况一般还是平均数比较精确 一、联系与区别:  1、平均数是通过计算得到的,因此它会因...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 361,004
精华内容 144,401
关键字:

中间数中位数