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操作.

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

  • 相关阅读:
    python中取列表的后半部分元素
    python中列表分片
    python中统计列表中元素出现的次数
    python中range()函数用法
    pyhton中实现列表元素顺序颠倒
    python中列表元素求交集和并集
    python中编写抽奖小游戏
    python中删除列表元素
    python中列表的去重复和取重复
    欲为Java技术大牛所需的25个学习要点
  • 原文地址:https://www.cnblogs.com/tianlanliao/p/2376330.html
Copyright © 2011-2022 走看看