排名算法

看到《海量用户积分排名算法探讨》,文章提出了三种实现思路:

第一种是利用sql语句,select count(*) from user_score where score>@score @score就是要查询用户的积分;

第二种是利用均匀分布方法,开了一个新表,存放每个区间段的用户数,统计排名时,先统计大于这个区间段的用户数,再统计用户当前所在区间数的排名,相加即是最终结果;

第三种是利用树结构,本质上和第二种方法差不多,但是它解决了用户积分不均匀分布的问题。

 

关于这题,我有自己的一点想法,可以用位图法实现。

思路如下:

积分上限是k,初建一个长度为k的数组 int[] data=new int[k], data[n] 表示的是积分等于n的人数

那么,如果一个用户积分是m,他的排名就是data[m+1] + data[m+2] + data[m+3] + …… + data[s]

一个用户的积分从m增加了c,那么 data[m]做-1操作,data[m+c]做+1操作.

需要注意的是,对data的维护会涉及到多线程并发控制。

 

后来看文章评论,有同学提示了更好的实现:

同样是创建一个k长度的数组,rank[k], rank表示的是 积分>= k的人数;

那么,如果一个用户积分是m,他的排名就是rank[m+1],不需要做任何额外的计算操作,这个比我的灵活多了!

一个用户的积分从m增加了c,那么 data[m+1]到data[m+c] 之间的所有数做+1操作.

 

不知道后面还能不能看到更好的实现~~

posted on 2012-03-01 22:32  飞鸟无痕  阅读(266)  评论(0编辑  收藏  举报

导航