第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可能有相应的函数,果不其然。

res=PERCENTILE(array,p)res = PERCENTILE(array,p)

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

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

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

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

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

res=(1j)array[i]+jarray[i+1]res = (1-j) * array[i] + j * array[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。

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

res=(1j)array[i]+jarray[i+1]=(10.9)7+0.98=7.9res = (1-j) * array[i] + j * array[i+1] =(1-0.9)*7+0.9*8 = 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

发布了73 篇原创文章 · 获赞 226 · 访问量 33万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 点我我会动 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览