第90百分位数的概念与计算

题目描述:

在这里插入图片描述

思路:

知乎上的讨论

  今天做了道题,刚开始没读懂题,网上搜了一下关于第95百分位的解释,大家各有说法,各有自己的理解。但是看了很多人的评论也是,表示基本都看不懂。

  从维基百科上可以找到这么一段话:

There is no standard definition of percentile, however all definitions yield similar results when the number of observations is very large and the probability distribution is continuous.

  可见对于百分位并没有十分标准的定义。所以仅在此简单总结一下第xth百分位的计算,以便日后查看,也希望大家能少走弯路,至于具体含义大家可以去维基百科查看。

  既然网上没找到实现代码,就想到了Excel可能有相应的函数,果不其然。

r e s = P E R C E N T I L E ( a r r a y , p ) res = PERCENTILE(array,p) res=PERCENTILE(array,p)

  其中:array为你的序列存储位置,比如A1:A12(在excel里的位置对应题目测试样例的array[0:11]),p为百分位值(以题目为例,p=0.9)

  然后查了下它的实现原理:

  首先将你的输入数组进行从小到大排序,然后计算:

( n − 1 ) ∗ p = i + j (n-1)*p = i + j (n1)p=i+j

  其中n为数组元素的个数,将计算结果的整数部分用i表示,小数部分用j来表示。则最终的percentile值为:

r e s = ( 1 − j ) ∗ a r r a y [ i ] + j ∗ a r r a y [ i + 1 ] res = (1-j) * array[i] + j * array[i+1] res=(1j)array[i]+jarray[i+1]

  因为题目给的数组是排好序的,所以我们计算(n-1)*p = (12-1)*0.9 = 9.9,则整数部分 i=9,小数部分j=0.9。查找数组得知,array[i] = array[9] = 7;array[i+1] = array[10] = 8。

  因为,我们可以得到测试样例的结果为:

r e s = ( 1 − j ) ∗ a r r a y [ i ] + j ∗ a r r a y [ i + 1 ] = ( 1 − 0.9 ) ∗ 7 + 0.9 ∗ 8 = 7.9 res = (1-j) * array[i] + j * array[i+1] =(1-0.9)*7+0.9*8 = 7.9 res=(1j)array[i]+jarray[i+1]=(10.9)7+0.98=7.9

代码实现:
import java.util.*;

public class Main {

	public static double getPercentile(int[] A, double p) {
		if (A == null)
			return 0;
		double res = 0;
		Arrays.sort(A); // 从小到大排序
		double x = (A.length - 1) * p;
		int i = (int) x; // 取出整数部分
		double j = x - i; // 还没找到最精确的取double数的小数部分的方法,有可能会有误差
		res = (1 - j) * A[i] + j * A[i + 1];
		return res;
	}

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		double p = 0.9;
		double res;
		int[] A = new int[n];
		for (int i = 0; i < n; i++) {
			A[i] = in.nextInt();
		}
		res = getPercentile(A, p);
		System.out.println(res);
	}
}

------至所有正在努力奋斗的程序猿们!加油!!
有码走遍天下 无码寸步难行
1024 - 梦想,永不止步!
爱编程 不爱Bug
爱加班 不爱黑眼圈
固执 但不偏执
疯狂 但不疯癫
生活里的菜鸟
工作中的大神
身怀宝藏,一心憧憬星辰大海
追求极致,目标始于高山之巅
一群怀揣好奇,梦想改变世界的孩子
一群追日逐浪,正在改变世界的极客
你们用最美的语言,诠释着科技的力量
你们用极速的创新,引领着时代的变迁

——乐于分享,共同进步,欢迎补充
——Treat Warnings As Errors
——Any comments greatly appreciated
——Talking is cheap, show me the code
——诚心欢迎各位交流讨论!QQ:1138517609
——CSDN:https://blog.csdn.net/u011489043
——简书:https://www.jianshu.com/u/4968682d58d1
——GitHub:https://github.com/selfconzrr

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BugFree_张瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值