给定分数列表(例如 5、5、4、2、2、0),我希望返回标准竞赛排名(1、1、3、4、4、6)。
From 维基百科的排名页面 http://en.wikipedia.org/wiki/Ranking,这里是SRC的总结:
标准竞赛排名(“1224”排名)
在比赛排名中,比较相同的项目获得相同的奖励
排名数字,则排名数字之间留有差距。这
此间隙中被遗漏的排名数少了一个
比比较相等的项目数。等价地,每个
项目的排名编号为 1 加上排名在其之上的项目数量。
这种排名策略在比赛中经常采用,因为
意味着如果两个(或更多)竞争者在竞争中并列一个位置
排名,所有排名低于其的人的位置不受影响
(即,如果只有一个人得分,则参赛者只能获得第二名)
比他们好,第三,如果正好有两个人得分比他们好,
第四,如果正好有三个人得分比他们好,等等)。
因此,如果 A 排名领先于 B 和 C(比较相等),则两者都是
排名领先于 D,则 A 获得排名第 1(“第一”),B 获得
排名第 2(“并列第二”),C 也获得排名第 2
(“并列第二”),D 获得排名 4(“第四”)。在这种情况下,
没有人会获得排名第 3(“第三”),这将被保留为
一个沟。
任何语言的代码都会非常有帮助。
顺便说一句,我有兴趣了解其他排名类型的算法(修改的竞争排名、密集排名、序数排名和分数排名)。
操作方法如下:
- Set
ranking[0]
to 1.
- For each index
i
in the score
-list
- If
score[i]
equals score[i-1]
they should have same ranknig:
ranking[i] = ranknig[i-1]
- else the ranking should equal the current index:
-
ranking[i] = i + 1
(+ 1
由于基于 0 的索引和基于 1 的排名)
下面是 Java 中的示例实现:
// Set up some sample scores.
int[] scores = { 5, 5, 4, 2, 2, 0 };
// Initialize a ranking array
int[] rankings = new int[scores.length];
// Fill in each position
rankings[0] = 1;
for (int i = 1; i < rankings.length; i++)
rankings[i] = scores[i] == scores[i-1] ? rankings[i-1] : i + 1;
// rankings = [1, 1, 3, 4, 4, 6]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)