海量用户积分排名算法

用户网站,用户拥有积分,积分可能会在使用过程中随时更新,设计一种算法,在用户登录时显示其当前基本排名,积分为非负整数,且小于100万。

海量用户积分排名算法:

1. 利用数据库,创建表结构为用户ID和积分的表,用SQL查询得到排名。优点是简单,利用SQL功能,无需复杂查询逻辑,不引入额外的存储结构。缺点也明显,每次全表扫描,如果积分更新的锁定会影响查询效率。

2.均匀分区设计。将数据库分成几张表,表结构是from_score, to_score, count。优点避免全表扫描。缺点:积分非均匀分布使得性能提升不理想

3. 树形分区设计。采用分级分区:一级分区:分成两个区间;二级分区:把一级区间分成多个子区间。以此类推,直到叶子节点。这就成为了一个平衡二叉树结构。每次更新用户积分,则更新此排名树。每次更新是log n级别。缺点是算法相对复杂。

4. 积分排名数组:用户积分从s变成s+n,积分小于s的和大于s+n的都没有变化,区间[s,s+n)内的用户排名下降一位。用数组表示所有用户积分的排名。查询的复杂度为O(1),更新排名的复杂度是O(n)。优点是算法简单,在积分变化不大的情况下非常高效。缺点是当n比较大时,需要更新大量的元素,效率不如树形分区。

from《码农.算法》

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、付费专栏及课程。

余额充值