zoukankan      html  css  js  c++  java
  • 排名算法

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

    第一种是利用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操作.

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

  • 相关阅读:
    SqlServer:创建索引
    SqlServer:使用视图 View
    SqlServer:修改和删除数据
    网络管理:SNMPv1
    《剑指 Offer》学习记录:题 9:用两个栈实现队列
    《剑指 Offer》学习记录:题 27:二叉树的镜像
    团队冲刺9
    团队冲刺8
    团队冲刺7
    团队冲刺6
  • 原文地址:https://www.cnblogs.com/tianlanliao/p/2376330.html
Copyright © 2011-2022 走看看