从分数列表中生成标准竞赛排名

时间:2011-08-01 16:00:30

标签: algorithm ranking

给出一个得分列表(例如5,5,4,2,2,0),我希望返回标准比赛排名(1,1,3,4,4,6)。

Wikipedia's ranking page开始,这里是SRC的摘要:

  

标准比赛排名(“1224”排名)

     

在比赛排名中,比较相等的项目会相同   排名数字,然后在排名数字中留下差距。该   在这个差距中遗漏的排名数量少一个   比相等的项目数量。等价地,每个   item的排名是1加上排名高于它的项目数。   这种排名策略经常被用于竞赛,因为它   意味着如果两个(或更多)竞争者在一个位置上占据一席之地   排名,排名低于他们的所有人的位置不受影响   (即,只有一个人得分,竞争者才会获得第二名   比他们好,第三,如果恰好有两个人得分比他们好,   第四,如果恰好三个人得分比他们好,等等。)

     

因此,如果A排在B和C之前(比较相等),则两者都是   排在D之前,然后A得到排名第1(“第一”),B得到   排名第2(“联合第二”),C也排名第2   (“联合秒”)和D得到排名第4(“第四”)。在这种情况下,   没有人会得到排名第3(“第三”),这将留下   差距。

任何语言的代码都非常有用。

另外,我有兴趣看到其他排名类型的算法(修改后的竞争排名,密集排名,序数排名和小数排名)。

2 个答案:

答案 0 :(得分:8)

以下是如何操作:

  • ranking[0]设为1。
  • 对于i - 列表中的每个索引score
    • 如果score[i]等于score[i-1],他们应该具有相同的ranknig:
      • ranking[i] = ranknig[i-1]
    • 否则排名应该等于当前索引:
      • 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]

答案 1 :(得分:1)

这是一些PHP代码:

$scores = array(5,5,4,2,2,0);

for($i = 0, $j = 0,
  $stop = count($scores),
  $last_score = -1; $i < $stop; $i++){
    if($scores[$i] != $last_score){
        $j = $i+1;
        $last_score = $scores[$i];
    }
    $scores[$i] = $j;   
}

// Now scores = [1,1,3,4,4,6]

如果您知道自己的分数已经有序,则可以删除rsort