精华内容
下载资源
问答
  • python中获取中位数种方法

    千次阅读 2021-01-11 22:06:18
    普通方法:对列表进行排序,然后根据长度为奇数或者偶数的不同情况计算中位数def huahua(x):length = len(x)print(length)x.sort()print(x)if (length % 2)== 1:z=length // 2y = x[z]else:y = (x[length//2]+x...

    普通方法:

    对列表进行排序,然后根据长度为奇数或者偶数的不同情况计算中位数

    def huahua(x):

    length = len(x)

    print(length)

    x.sort()

    print(x)

    if (length % 2)== 1:

    z=length // 2

    y = x[z]

    else:

    y = (x[length//2]+x[length//2-1])/2

    return y

    l = [1,2,3,7,5,6,4,9,8,10]

    print(huahua(l))

    最佳方法:

    采用取反的方式来求中位数,排序后结果为l=[1,2,3,4,5,6,7,8,9,10],长度为10,half=10//2=5,x[5]为列表的第六位数,5的取反数为-6,x[-6]实际上是对列表进行反向查找,为列表中的第五位数,长度为偶数10时中值5+6/2=5.5。

    当结果为l=[1,2,3,4,5,6,7,8,9]时,长度为9,half=9//2=4,x[4]为列表的第五位数,4取反为-5,x[-5]在列表中是正向反向查找中的第五位数,所以x[4]==x[-5],中位数就为x[4]或者x[-5]。

    def median(data):

    data.sort()

    half = len(data) // 2

    return (data[half] + data[~half])/2

    l = [1,2,3,7,5,6,4,9,8,10]

    if __name__ == '__main__':

    print(median(l))

    展开全文
  • 大数据查找中位数

    千次阅读 2020-12-28 21:24:25
    题目在一大文件中100亿32位整数,乱序排列,要求找出中位数;内存限制为512M;请写出算法设计思路;2. 基本知识b --> bit 比特,位(二进制中的位)B --> Byte 字节,1字节=8位,1B=8bitK --> K...

    前两天同学面试遇到的一道题,大数据怎么找出中位数。大数据 --> 所有数据不能一下子读入内存

    中位数 --> 需要遍历所有数据

    1. 题目

    在一个大文件中有100亿个32位整数,乱序排列,要求找出中位数;内存限制为512M;请写出算法设计思路;

    2. 基本知识b --> bit 比特,位(二进制中的位)

    B --> Byte 字节,1个字节=8位,1B=8bit

    K --> KB 千字节,1KB = 1024B

    M --> MB 兆字节,1M = 1024KB = 1024*1024B

    G --> GB 1GB = 1024MB

    问题分析:

    100亿个32位整数,那么占用内存为:100亿*32 b = 100亿*32/8 B = 100亿*32/8/1024 KB = 100亿*32/8/1024/1024 MB = 38146.9727 MB > 512M

    所以肯定不能一次全部载入内存。

    那么512M可以装多少个32位整数呢?512M=512*1024K=512*1024*1024B=512*1024*1024*8b=4294967296b

    可存储32位整数:4294967296b/32b=134217728个,是1亿多个。

    3. 设计思路

    中位数需要遍历数据才能找出来,512M是我们可用的内存限制,每次只能载入1亿多个数据,100亿个数据,我们可以分成100次进行载入遍历。

    那么遍历的时候我们需要记录哪些信息呢,因为要求中位数,我们可以考虑将数据划分区间,计算每个区间我们的数据落进去的数目,就可以大致知道数据分布了。

    所以整体的数据区间是多少呢?一个有符号的32位整数,他的取值范围是:

    ,总共有4294967296个整数值,我们把它划成100000组,那么每组的数据是43000个,最后一组少点。

    所以第一个区间

    的取值范围是

    ,第二个区间

    的取值范围是

    ,以此类推。

    我们分一百次载入数据,每次载入1亿个,遍历这一亿个数据,数据落入哪个区间,则那个区间的统计值+1。100次载入完成之后,我们便得到了每个区间的统计值,我们用

    来代表数据落入

    区间的统计值。那么肯定有

    现在我们需要寻找中位数落入哪个区间,100亿个数据的话,中位数应该等于第50亿大和第50亿+1大的数据的平均。所以我们需要知道这两个数,落在哪个区间了。

    我们从

    开始累加,一直累加到

    使得总和大于50亿+1,(等于的情况比较特殊,这里假设不等于。)那么关系到中位数计算的两个数应当落在区间

    里。

    到这里我们可以得到中位数的区间,我们计算一下上面的过程所需内存情况:载入1亿个数据需要内存32*1亿/8/1024/1024=381.5M,100000个数据组的统计值需要内存8*100000/1024/1024=0.76M 总和小于512,是可行的。

    现在我们知道涉及中位数计算的两位数的区间是

    ,而

    里有43000个数据,在

    之前的区间中的数据总数为

    ,下面我们需要找到第50亿个以及第50亿+1这两个数到底是多少。

    我们需要再次遍历数据,对落在

    区间的数都加以关注,统计

    区间内数字

    出现的频词

    再次分100次载入数据,对落在

    区间的数进行关注,为

    区间内的每一个整数

    都设计一个统计值

    区间有43000个数据,所以有43000个统计量。

    全部载入完成之后,我们再在

    的基础上累加

    ,如果加上

    大于50亿了,那么第50亿大的数据就是

    ,第50亿+1大的数同理。这样我们就可以计算中位数了。

    再次对上面的过程进行内存分析,每次载入1亿个数据需要内存381.5M,43000个统计量需要内存肯定小于上面100000个统计量的情况,所以内存也是足够的。哦还有个

    需要内存,但是8位,不值一提。

    设计思路以上。

    4. 总结数据量过大,分次载入

    一共需要两次完全遍历数据。

    5. 类似题目

    大量数据寻找topK,

    解决思路:数据多次载入,进行堆排序,每次载入都获得堆的topK,最后将这些topK再进行排序。

    加油,一件事竟然决定去做了,就请做好他。耐住性子,慢慢来。

    展开全文
  • 力扣 寻找两个正序数组的中位数 C++

    千次阅读 2021-10-26 18:16:32
    请你找出并返回这两个正序数组的中位数。 题目说明: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 关于这个题目我先给出自己的解法,因为现在我自己的段位不高很难...

    题目:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

    题目说明:

    输入:nums1 = [1,3], nums2 = [2]

    输出:2.00000

    解释:合并数组 = [1,2,3] ,中位数 2

    关于这个题目我先给出自己的解法,因为现在我自己的段位不高很难想到什么高效的算法来解决这道题但是自己的解法也能解决这道题,只不过自己的解法比较暴力所以耗时也比较浪费空间,我也不甘堕落学习了别人高效的代码在下面也会给大家分享我对别人高效代码的理解。

    自己的解法思路:首先先将两个数组中的一个数组(我们这里就选择nums2)中的值一次赋值到一个动态数组中(该动态数组是我们在堆区申请的一块内存内存的大小要和两个数组总长度一样长,因为该动态数组是由nums2赋值得到的所以现有的长度nums2一样长),接下来就要将nums1中的值依次和动态数组中的值进行比较然后插入到动态数组中(元素插入到动态数组中会存在数组中的元素移动,从插入位置截止让最后一个元素开始向后移动一个位置),这样就可以的到一个完整的有序的数组。如果nums2的长度为0就直接找出nums1中的中位数并将其返回,如果nums1的长度为0就直接找出nums2中的中位数,代码中还有很多的细节请自己阅读代码大致的思路已经说明白。

    代码:

    float project(vector<int>& nums1, vector<int>& nums2) {
    	int* p = new int[nums1.size() + nums2.size()+2];
    	memset(p, 0, sizeof(int) * (nums1.size() + nums2.size() + 2));
    	for (auto i = 0;i < nums2.size();i++) {
    		p[i] = nums2[i];
    	}
    	int c = nums2.size();
    	for (auto i = 0;i < nums1.size();i++) {
    		for (auto j = 0;j < c;j++) {
    			if (nums1[i] < p[j]) {
    				for (int e = c-1;e >= j;e--) {
    					int b = p[e];
    					    p[e+1] = b;
    					if (e == j) {
    						p[j] = nums1[i];
    						c++;
    						break;
    					}
    				}
    			}else 
    			if (nums1[i] >= p[c-1]) {
    				p[c] = nums1[i];
    				c++;
    				break;
    			}
    			else {
    				continue;
    			}
    			break;
    		}
    	}
    	if (c == 0) {
    		if (nums1.size() % 2 == 0) {
    			int q = nums1.size() / 2;
    			return (nums1[q] + nums1[q - 1]) / 2.0;
    		}
    		else {
    			int q = nums1.size() / 2;
    			return nums1[q] * 1.0;
    		}
    	}
    	if (c % 2 == 0) {
    		int q = c / 2;
    		return (p[q] + p[q - 1]) / 2.0;
    	}
    	else {
    		int q = c / 2;
    		return p[q]*1.0;
    	}
    }

    接下来为大家分享别人的代码:

    归并算法!

    思路:在写这个题之前我没有学过归并算法要不解题就变得很简单了!现在就说一下归并算法,什么是归并算法呢?归并算法就是将两个数组合并为一个数组可以合并有序数组也可以和并无序数组但是合并出来的数组都是有序的,这个题不用合并无序数组因为所给的数组都是有序的。先定义一个数组该数组的长度和两个数组的总长度一样长这样就可以保存两个数组中的元素,因为两个数组是有序的这样归并起来也是一个有序的数组,那是怎么归并的呢?其实很简单先给出代码然后再进行讲解。

        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int m = nums1.size(), n = nums2.size(), k = 0, i = 0, j = 0;
            vector<int> sub(m + n,0);//定义一个容器将容器长度设置为m+n,并将里面的元素的值都赋值为0
            while (i < m && j < n)
                sub[k++] = nums1[i] < nums2[j] ? nums1[i++] : nums2[j++];
            while (i < m) sub[k++] = nums1[i++];
            while (j < n) sub[k++] = nums2[j++];
            return k % 2 ? sub[k / 2] : (sub[k / 2] + sub[k / 2 - 1]) / 2.0; // 判断奇偶
        }

    比较两个数组中的值从数组中的位置0开始比较如果nums1[0]<nums2[0]那么就先将nums1[0]保存在sub[0]的位置,再将nums2[0]与nums1[1]比较如果nums2[0]<nums1[1]就将nums2[0]保存在

    sub[1]的位置,依次这样循环下去就可以将两个数组中的元素入保存在sub数组中。

    那么这两段代码是用来干什么的呢?

      while (i < m) sub[k++] = nums1[i++];
      while (j < n) sub[k++] = nums2[j++];

    这两段代码是用来处理极端情况和两个数组的长度不是一样长的时候根据我们的循环条件(  while (i < m && j < n))当有一个数组遍历完就会退出循环,如果nums1[1,2,3,4]而nums2[5,6,7,8,9]这样nums1中的值都保存在数组sub中以后nums2中的第一个值都还没有保存在sub中,这样就会遍历下面的两个循环,将剩余数组中的值都保存在sub数组中,这种算法是不是很高效也省内存。

    再给大家分享一种算法:

    双指针!

    什么是双指针呢?现在就说以下双指针其实双指针就是一种思想现在就针对这道题说一下,在这个题中我们就定义两个整数用来遍历两个数组这两个整数就相当于两个指针,根据这两个整数在数组中的下标位置就可以索引到数组中的值。直接上代码进行讲解。

    代码:

       double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            // 定义 i j 2个指针分别指针2个数组
            int m = nums1.size(), n = nums2.size(), i = 0, j = 0, l = 0, r = 0;
            for (int x = 0; x <= (m + n) / 2; x++) {
                l = r;
                r = (i < m && (j >= n || nums1[i] < nums2[j])) ?
                    nums1[i++] : nums2[j++];
            }
            return (m + n) & 1 ? r : (l + r) / 2.0;
        }

    其实逻辑也很简单!只要上面归并算法实现的核心代码理解了现在双指针的实现就不难理解了,就是定义两个整数用做数组的下标用来索引数组中的值,还是从nums1[0]和nums2[0]依次进行比较哪个大就将那个值赋值给 r 而 l 是用来保存 r 前面的值,现在比较难理解的就是判断条件 (i < m && (j >= n || nums1[i] < nums2[j]) )当nums1没有遍历完的时候 i < m 这个判断条件一直都在执行,而(j >= n || nums1[i] < nums2[j])这个判断条件中j >= n 这个条件只有在nums2遍历完以后才执行,所以在nums1.nums2没有遍历完时一直都执行的是(i < m && nums[i] < nums[j])这个判断条件哪个数组中对应的值小就定位到哪个数组中的值并将该值赋值给 r ,当nums1遍历完直接j就遍历nums2,那么如果在nums1遍历完之前nums2就遍历完执行的判断条件是(i < m && j >= n)这样一直遍历的是nums1,直到循环执行到两个数组总长度的中间位置就可以退出循环就可以定位到中位数。

    说实话这两种算法都很牛逼!!!

    展开全文
  • JAVA求数组的平均数,众数,中位数

    千次阅读 2021-07-03 13:55:48
    中位数中位数是指把一组数据从小到大排列,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数。 众数:众数是指一组数据中出现...

    目录

    1、名称解释

    2、实例代码 

    (1)求平均数

    (2)求中位数

    (3)求众数


    1、名称解释

    平均数:是指一组数据之和,除以这组数的个数,所得的结果就是平均数。

    中位数:中位数是指把一组数据从小到大排列,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以2,所得的结果就是中位数。

    众数:众数是指一组数据中出现次数最多的那个数,众数可以是0个或多个。

    2、实例代码 

    (1)求平均数

    public static double mean(int[] arr) {
    		int sum = 0;
    		for (int i = 0; i < arr.length; i++) {
    			sum += arr[i];
    		}
    		return (double) sum / arr.length;
    	}

    (2)求中位数

    public static double median(int[] arr) {
    		// 先排序
    		Arrays.sort(arr);
    		// 如果是偶数,则为中间两个数的和除以2
    		if (arr.length % 2 == 0) {
    			return (double) ((arr[arr.length / 2 - 1] + arr[arr.length / 2])) / 2;
    		}
    		// 否则就是中间这个数
    		return arr[arr.length / 2];
    	}

    (3)求众数

    public static List<Integer> mode(int[] arr) {
    		Map<Integer, Integer> map = new HashMap<>();
    		Set<Map.Entry<Integer, Integer>> set = map.entrySet();
    		List<Integer> list = new ArrayList<>();
    		// 结果
    		List<Integer> res = new ArrayList<>();
    		// 统计元素出现的次数,存入Map集合
    		for (int item : arr) {
    			map.put(item, map.getOrDefault(item, 0) + 1);
    		}
    		// 将出现的次数存入List集合
    		map.forEach((k, v) -> {
    			list.add(v);
    		});
    		//集合排序
    		Collections.sort(list);
    		// 得到最大值
    		int max = list.get(list.size() - 1);
    		// 根据最大值获取众数
    		for (Map.Entry<Integer, Integer> entry : set) {
    			if (entry.getValue() == max) {
    				res.add(entry.getKey());
    			}
    		}
    		return res;
    	}

    展开全文
  • matlab两个数中的较小值

    千次阅读 2021-05-08 03:31:13
    在EXCEL表,如何取一组数据两个最大两个最小数?用什么函数?=large(a1:a15,1)第一大=large(a1:a15,2)第二大=small(a1:a15,1)第一小=small(a1:a15,2)第二小matlab 随机取问题可以这样随机生成一个af:0--...
  • Python如何获取列表(List)的中位数

    千次阅读 2020-12-28 21:57:00
    前言中位数是一可将数值集合划分为相等的上下部分的一数值。如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数;如果列表数据的个数是偶数,则列表中间那2数据的算术平均值就是列表数据的...
  • 前言中位数是一可将数值集合划分为相等的上下部分的一数值。如果列表数据的个数是奇数,则列表中间那个数据就是列表数据的中位数;如果列表数据的个数是偶数,则列表中间那2数据的算术平均值就是列表数据的...
  • 文章目录数据流中的中位数★★★滑动窗口中位数★★★寻找两个正序数组的中位数★★★ 数据流中的中位数★★★ LeetCode 剑指 Offer 41. 数据流中的中位数 【题目】如何得到一个数据流中的中位数?如果从数据流中...
  • 4. 寻找两个正序数组的中位数           两种方法都能通过,但是排序的复杂度肯定不满足题目要求的。第二种我不知道是不是满足了复杂度要求,代码有点多,不过也还容易能看懂喽 class ...
  • 位数两位数计算题-云簿杜同学

    千次阅读 2020-12-23 07:49:56
    导读:本次分享的是云簿杜同学的学习经验,关于三位数两位数计算题,主要为:三位数两位数计算题,...2、一位数除以一个两位数,商可能是()位数,也可能是()位数。3、()的10倍是200;用80去除480,结果是(...
  • 计算机关于小数点的一点疑问.老师说过“计算机不能存小数点,约定‘定点’来存储.”设置了固定的小数点位置,...一般地说,小数点可约定固定在任何数位之后,但常用下列种形式: ①定点纯小数:约定小数点位置固...
  • PostgreSQL中计算百分位数和中位数

    千次阅读 2021-05-11 21:38:40
    PostgreSQL9.4版本之后很容易对一组值计算百分位数,主要是用有序...更精确,包括两个输入值直接的(带小数)。 下面通过示例进行讲解,首先我们准备一个示例表和数据。 create table thing ( value int ); ins
  • [CQOI2009]中位数

    千次阅读 2021-02-23 23:50:43
    给出1~n的一个排列,统计该排列多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。 输入描述: 第一行为两个正整数n和b ,第二行为1~n 的排列。 输出描述: 输出一个...
  • //十位数时间戳 long start = 1611298952; long end = 1611299007; long diffSeconds = end - start; Double min = diffSeconds / 60; Double hour = diffSeconds / (60 * 60); //时间戳为
  • 【单选题】钩虫病最简单可靠的实验诊断方法是()【填空题】Python无穷循环while True: 的循环体可用___________语句退出循环。【多选题】下列属于一汽-大众先进涂装技术的是()【单选题】蛔虫感染引起并发症主要是...
  • 【数组】- 如何求C++数组的中位数

    千次阅读 2021-01-01 11:27:02
    中位数指的是一组数,如果按照大小排序排好后最中间的那个数的值,如果偶数个元素,那么就是最中间两个数的平均数。 比如:2 5 8 1 6,排序后的结果为1 2 5 6 8,那么这组数的中位数就是5。 再比如:8 9 1 2 3 0,...
  • 二分 - 寻找两个有序数组的中位数 - Leetcode 4 给定两个大小分别为 m 和 n 的正序(从小到大)数组 A 和 B。请你找出并返回这两个正序数组的 中位数 。 示例 1: 输入:A = [1,3], B = [2] 输出:2.00000 解释:...
  • 4. 寻找两个正序数组的中位数 题目链接点此 思路:将两个数据拼接起来后,排序。然后判断长度是奇数还是偶数就可以了 class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -&...
  • #计算方差 sdev = 0.0 for num in numbers: sdev = sdev + (num - mean)**2 return pow(sdev / (len(numbers)-1), 0.5) def median(numbers): #计算中位数 numbers = sorted(numbers) #sorted(numbers) size = len...
  • 产生20个两位随机整数

    千次阅读 2021-04-18 07:52:55
    20 - 6 = 18 - 8 = 19 - 6 = 15 - 7 = 15 - 3 = 11 - 8 = 20 - 2 = 20 - 7 = 18 - 8 = 15 - 8 = 17 - 9 = 19... (2)每10个数作为一组,出其中至少2个数 相同的组m及试验总次数n; (3)求得概率的近似值m/n. 例3.....
  • 如果简单点就int i=123;int k,s;k=i%10;位数s=(i-100)/10;...//各位数上的数字printf("请输入一位数:");scanf("%d",&a);b=a/100;//百位c=(a-b*100)/10;//十位d=a%10;//位printf("百位:%d...
  • 请你找出并返回这两个正序数组的中位数。 进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗? 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数2 ...
  • # python输入一水仙花数(三位数) 输出百位十位位"""从控制台输入一位数num,如果是水仙花数就打印num是水仙花数,否则打印num不是水仙花数""""""任务:1、定义变量num用于存放用户输入的数值2、定义变量gw、...
  • var findMedianSortedArrays = function(nums1, nums2) { let num1 = null let list = [...nums1 , ...nums2] ... let middlenum = Math.floor(otherlist.length / 2) // 取中间 if(otherlist.length % 2
  • 均值、中位数中位数的概念以及优缺点对比。偏态分布难点分析,以及偏度、峰度计算公式。文末附相关学习链接。
  • 写一个函数,输入一个4数字,要求输出这4个数字字符,但每两个数字中间空一个空格(C语言) 题目要求:如输入1990,应输出“1 9 9 0” 以下是具体代码: #include <stdio.h> int main() { void function...
  • Java方法一:二分查找(官方解法) 解题思路 给定两个有序数组,要求找到两个有序数组的中位数,最直观的思路以下两种: 使用归并的方式,合并两个有序数组,得到一个大的有序数组。大的有序数组的中间位置的元素,...
  • 四分位数的种计算方法

    千次阅读 2020-12-29 20:16:54
    关于四分位数的种求法 在数据导论课上,我们学习了如何求解四分位数的方法,其实操作起来也不难先用 (n+1) / 4 * i 计算出四分位数的位置,再求出该位置上的的值即可。如一组数据 【1,3,6,8,10】 根据公式先...
  • python实现两个数互换的四种方法

    千次阅读 2021-01-15 21:41:47
    实现两个整数的互换,即输入a=x b=y 得a=y b=x 方法一:占位法 将数据单独放入一个新的变量,进行调换。 #占位法(普通方法) print("请输入两个整数:") a = int(input("第一个整数:")) b = int(input("第二...
  • 字节由几二进制组成

    千次阅读 2021-07-03 05:36:14
    聊到几,我们许多人都了解,人问一字节由几多二进制组成,还有朋友想问一字节由几二进制构成,这到底怎么回事呢?事实上在计算机字节由几二进制构成呢,小编为各人带来一字节由几二...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,791,105
精华内容 716,442
关键字:

中位数有两个怎么办