积分无上限排行榜设计


需求如下:

对玩家的等级,战斗力,宠物等级建立排行榜, 排行榜显示排名前200的玩家, 而最大显示排名为3000.


方案一: 直接排序

数据结构:
记录玩家属性数据table roleData:
{uid = 1, level = 1, combat = 1, petLevel = 1, rankIndex = {} }
其中rankIndex用于记录玩家在每个榜的位置, key为榜的索引,value为排名.

记录所有玩家属性数据哈希table roleDataHash
key为玩家唯一id,value为roleData.

用于排序的数组table sortTbl, roleDataArray, 同样所有玩家的属性数据roleData
都插入到这里,与roleDataHash共享.

记录每个榜单每个位置对应的玩家id table, rankInfo,
key为榜的索引,value为array table, key为排名,从1开始,value为玩家id.

记录上次排序与这次排序之间发生变化的玩家数据记录table roleDataChangeHash,
key为玩家uid,value为修改的数据的键值对数据,即roleData的 level, combat, petLevel其中的一个或多个.

排序过程:
定时器一小时触发全榜重排一次

  1. 首先将roleDataChangeHash中有修改的数据同步到玩家自身的roleData中, 同时清空roleDataChangeHash.
  2. 重排每个榜, 对roleDataHash根据榜单对应的key进行排序,得到降序的新表,遍历这个表,
    更新记录每个榜每个位置对应的玩家id(index ==> uid), 更新记录每个玩家在该榜的位置(uid ==> rankIndex).

排序时间复杂度: o(n的平方)

好处:

  1. 算法简单,有修改的数据先缓存到roleDataChangeHash, 排序前再一次性更新数据.
  2. 玩家查询自己的排名信息时间复杂度为o(1).

缺点:

  1. 排序 时间复杂度为n的平方, 玩家账号一旦上规模排序耗时较长,排序时候可能会造成延迟服务,
    排序时长有待实际测试.

建议:

  1. 这种直接排序操作可以单独用一个线程去做, 服务器第一次启动先把所有要排序的玩家数据同步到排行榜线程, 之后有修改的数据先缓存,定时或数据量达到一定程度后再发送到排行榜线程排序.

======================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ACM/ICPC比赛成绩会按照一定的规则计算各位参赛者的名次并实时显示排行榜,计算规则主要参考解题的数量及罚时,解题数量越多,罚时越少,则排名越高。 解题数量很容易计算,只需考察比赛中标记为“Accepted”的题数即可。罚时计算则相对复杂,对于提交到竞赛系统中的每道题目,系统会给出一个罚时,为从比赛开始到该题提交的代码第一次被“Accepted”的时间。请注意,只是第一次“Accepted”。对于“Accepted”之前的每次提交,都有20分钟的罚时,但如果该题目最终未解出,则不计罚时。 先在有一个比赛的题目通过情况记录,请生成该比赛的排行榜。 示例输入: 2008-04-25 18:00:00 2008-04-25 23:30:00 1000 1001 1002 1003 1004 38 602203621 1002 Accepted 756K 30MS C++ 2008-04-25 18:04:59 37 liheyuan 1002 Wrong_Answer 768K 10MS C++ 2008-04-25 18:28:05 36 ftest 1000 Accepted 888K 10MS C++ 2008-04-25 21:30:32 35 ftest 1000 Accepted 904K 10MS C++ 2008-04-25 21:30:55 34 gaojianwei 1000 Accepted 768K 10MS C 2008-04-25 22:15:58 33 gaojianwei 1001 Wrong_Answer 904K 10MS C 2008-04-25 22:18:01 32 gaojianwei 1004 Accepted 768K 10MS C 2008-04-25 22:24:23 31 lzz 1000 Accepted 904K 10MS C++ 2008-04-25 23:29:27 30 lzz 1001 Wrong_Answer 904K 10MS C++ 2008-04-25 23:30:17 示例输出: Rank Name Solved 1000 1001 1002 1003 1004 Penalty 1 gaojianwei 2 4:15:58 -1 0 0 4:24:23 8:40:21 2 602203621 1 0 0 0:04:59 0 0 0:04:59 3 ftest 1 3:30:32 0 0 0 0 3:30:32 4 lzz 1 5:29:27 0 0 0 0 5:29:27 5 liheyuan 0 0 0 -1 0 0 0:00:00

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值