论坛首页 Java企业应用论坛

迅雷的一个面试题

浏览 54833 次
精华帖 (8) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2012-05-10  
你们怎么会把这个题跟什么数据库联系在一起了呢,对这种大规模数据的,用数据库肯定是不行的
score是一个有限的数据吧?每个月户的分怎么也不会多于100万吧???
那就直接做hash啊,做一个数组
unsigned int *a= new unsigned int[1000000];
然后记录每个分值有多少个用户,例如分值为10的用户有100个,则a[10]=100;
然后就很简单了,100分的用户的排名就是a[0]+a[1]+...+a[9]+1;
这个是普通的方法,要循环地加一次,更强的就是记录10分以下的有多少人,比如a[10]=90;
表示分在10以下的有90人,那么直接可以得到分值为10的用户排名为91
有人会问那用户的分值会持续不断更新,后面的方法可能对于更新某一个用户的分值可能会造成连片数组元素的修改
为了应对这种动态数据更新,那就用前一种模型,即a[n]表示分值为n的用户数,然后统计该用户排名的时候使用一种叫树状数组的东西,有兴趣的可以查查树状数组,它的核心概念就是连续数组的任意区间之和可以在log(n)复杂度内完成,它的更新也可以在log(n)复杂度完成
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics