Web排行榜相关排序算法总结
资讯、成就值排序算法
1、通用的排序算法
(1)单位时间的交互数(每小时更新一次)
(2)总交互数
(3)评论数加权
(4)按时间排序
设计带权score函数,涉及:交互数、点赞数、点踩数、评论数、浏览数、时间,点赞很容易 权值应该小,写评论往往不多 权值应该稍大(比如微博点赞很多 发博人稍少 写博客的更少 所以权值不能相同)
实现算法:找出参与排序的元素,利用Redis里面的sortedset(有序队列) 利用jedis.zadd和jedis.zrange等方法就可以选出排名前多少的对象。
排序线程定时触发计算score分数(优化计算score分数 重新排序,优化的话不用计算所有实例的分数,可以计算近3天的,也可以计算上次排序到这次排序之间发生变化的实例)
2、经典开源排序算法
(1)Hacker News
http://news.ycombinator.com (科技新闻的资讯网站)
排序算法:
Score=(p-1)/(t+2)G
P:投票数(点赞数),-1是先把自己投的赞给过滤掉
T:发布资讯到现在的时间间隔(小时),+2防止除数太小。
G:重力加速度,指数增大时间参数的影响,时间越久score越低(G=2 时间T从2到3那么分母就从16到25,指数增长很快)
从业务角度Hacker News是科技新闻资讯网站,偏实时性,分母时间是个指数形式,默认g=1.8,那么过15个小时左右 score就会大幅度降下来。
(2)Reddis
http://www.reddis.com Alexa排名全世界22网站流量大,新闻资讯网站,资讯可赞可踩,
计算过程
T=A-B (A发帖时间 B网站成立时间)
X=U-D (U点赞数 D踩的数)
X>0 y=1;x<0 y=-1 x=0y=0;
Z=|x|
F(t,y,z)=log10(z) + (yt)/45000
因为流量数很大z很大 所以用log将其收敛,一天的时间权重86400/45000=1.92,而10^1.92=83,也就是说赞踩差要涨到83倍才可以与一天前分数相同。透露这样一种思想,前10个点赞很有效,但是从100到1000个可能是跟风点赞导致,并没有前十个那么有依据。时间最重要的流量比较大,所以高赞文章有优势,适合新闻类排序。
(3)StackOverflow
浏览数容易上涨,通过log将其平滑下来,
(4)IMDB 电影打分
加权排名(WR)=(v/(v+m))*r + (m/ (v+m))*c
R=电影投票的平均分
V=有效投票人数
M=最低投票人数,1250
C=所有电影的平均值
投票人越多,偏向于用户打分值,防止冷门电影小数人高分导致的高分,v是有效投票人数可以防止水军刷票(比如 某批人只给一个电影打过分)