我们已知一个排序后的数组(或列表),需要计算每个数值的百分比排名。
百分比排名的定义:对于一个数值,它的百分比排名等于(小于该数值的个数 + 0.5 * 等于该数值的个数)/ 总个数 * 100%
注意:这个定义是标准统计中的百分比排名(percentile rank),它考虑了相同值的情况。
步骤:
- 首先,我们需要统计每个数值出现的频率,并记录每个数值在排序后的位置。
- 然后,对于每个数值,计算小于它的数值个数(即它前面的所有数值的个数)和等于它的数值个数(即它自身的频率)。
- 使用公式:百分比排名 = (小于该数值的个数 + 0.5 * 等于该数值的个数) / 总个数 * 100
但是,我们也可以不预先排序,而是先排序,然后遍历排序后的数组,同时统计每个值的排名。
由于题目中已知一个数值组(130个数值),我们可以这样做:
- 对数组进行排序(从小到大)
- 然后,对于每个数值,我们计算小于它的数值的个数(即排序后它前面的元素个数)和等于它的个数(在数组中出现的次数)
但是注意:在排序后的数组中,相同的数值会相邻。因此我们可以遍历排序后的数组,同时记录每个数值第一次出现的位置和出现的次数。
然而,我们也可以使用另一种方法:先统计每个数值出现的频率,然后计算累积分布。
具体步骤:
- 对数组进行排序(升序)。
- 创建一个字典来记录每个数值的频率。
- 计算每个数值的百分比排名:对于数值x,首先找到它在排序后第一次出现的位置(即第一个等于x的索引),那么小于x的个数就是该索引(因为前面都是比x小的)。同时,等于x的个数就是频率。
- 但是注意:排序后,相同数值会连续出现,所以我们可以遍历排序后的数组,同时记录当前数值以及它的起始位置。
然而,我们可以更高效地一次遍历完成:
方法:
排序数组:sorted_arr
初始化一个空字典来存储每个数值的百分比排名(因为相同数值的排名相同)
然后,我们遍历排序后的数组,同时记录当前数值和它出现的次数(或者我们可以提前统计频率,然后遍历时跳过重复值)
另一种做法:
先统计每个数值的频率,然后计算累积频率(小于当前数值的累积个数),然后对于每个数值,用累积频率(即小于该数值的个数)加上0.5倍的该数值的频率,再除以总数,乘以100。
具体步骤:
步骤1:对数组排序
步骤2:统计每个数值的频率(可以用字典