【问题标题】:Generate standard competition rankings from a list of scores从分数列表生成标准比赛排名
【发布时间】:2011-08-01 16:00:30
【问题描述】:

给定分数列表(例如 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 获得排名第一(“第一”),B 获得 排名第 2(“并列第二”),C 也获得排名第 2 (“并列第二”)和 D 获得排名第 4(“第四”)。在这种情况下, 没有人会获得排名第 3(“第三”),这将被保留为 一个缺口。

任何语言的代码都会很有帮助。

顺便说一句,我很想看看其他排名类型的算法(修改后的竞争排名、密集排名、序数排名和分数排名)。

【问题讨论】:

  • 你的参数列表排序了吗?
  • @Vakimshaar - 是的,分数按降序排列

标签: algorithm ranking


【解决方案1】:

这是怎么做的:

  • ranking[0] 设置为1。
  • 对于score 列表中的每个索引i
    • 如果score[i] 等于score[i-1] 他们应该有相同的ranknig:
      • ranking[i] = ranknig[i-1]
    • 否则排名应等于当前索引:
      • ranking[i] = i + 1
        + 1 由于 0-based indeces 和 1-based 排名)

以下是 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]

【讨论】:

    【解决方案2】:

    这里有一些 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      相关资源
      最近更新 更多