竞技场往往是游戏中不可缺少的系统,根据不同的需求类型,竞技场排行榜的类型可以有如下划分:
1.按照排名更新的方式划分:依靠积分进行排行的竞技场,当玩家完成挑战后根据一定的规则进行双方积分的增减,依据新的积分进行重新排名;不依靠积分进行排行的竞技场,只有当排名较低玩家战胜了排名较高玩家时,会交换双方排名。前者一次积分变化会导致较多的玩家排名发生变动,后者一次最多只会影响两名玩家的排名,但要考虑相同玩家同时被挑战的情况。
2.按照排行是否严格划分:并列排行榜允许积分相同的玩家处于同一名次,严格排行榜需要处理玩家相同积分情况下决定排名的规则。
此处我们只讨论积分排行榜。
积分排行榜的关键在于对于一个有序数据结构的维护更新,而对于该数据结构的实现主要有两种思路:
1.自己使用语言实现有序的数据结构
2.借助现成的工具,如MySQL,Redis实现有序排序
自己制定数据结构的方法
1.有序列表
按照积分大小将列表进行排序。
查询TopN:只需获取列表前TopN个元素,时间复杂度O(1)。
查询指定玩家排名:计算积分大于该玩家的人数,时间复杂度O(n)。
更新排名:玩家积分发生变化,需要将旧元素删除,把积分变化后的新元素插入列表中并进行重新排序,若使用快速排序,则时间复杂度为O(n²)。不过大多数情况下列表是基本有序的,比起对单纯打乱的列表进行排序会好很多。
排行榜较小,对效率没有极端要求的时候可以使用这种方法。
2.数组
构建大小为M的数值rank[],此时积分s对应的排名为rank[s]。