PHP 编程 / 开发思想 · 2012/09/28 4

基于用户投票的排名算法的PHP实现之 Reddit 篇

本文算法参考: 基于用户投票的排名算法(二):Reddit 实现

Reddit是美国最大的网上社区,它的每个帖子前面都有向上和向下的箭头,分别表示”赞成”和”反对”。用户点击进行投票,Reddit根据投票结果,计算出最新的”热点文章排行榜”。
该社区的算法特点是最受欢迎(支持远超反对)的post排在前段, 正反观点相近的post排中间, 大量反对的post排后面.同时参考了时效性, PHP代码如下:

<?php
//获得赞成票
$vote = 100;
//获得的反对票
$devote = 99;
//投票差额
$voteDiff = $vote - $devote;
//投票方向
if($voteDiff > 0) {
    $pos = 1;
} elseif($voteDiff < 0) {
    $pos = -1;
} else {
    $pos = 0;
}
//帖子的争议度(赞成/否定)
$voteDispute = $voteDiff != 0 ? abs($voteDiff) : 1;

//项目创建时间
$fund = strtotime('2012-09-01');
//数据创建时间
$created = strtotime('-3 days');
//考虑时间因素, 用来拉低比较老的post的分数
$time = $created - $fund;
//详细算法
$socre = log10($voteDispute) + $pos * $time / 45000;
echo $socre, "\n";

注: log10($voteDispute) 计算的是以10为底的的对数, 争议程度会影响得分, 但是争议度很大的时候对整体得分的影响不是很明显,避免了一些争议很大的老的post会给新的post带来排名压力