我正在开发一个讨论板,它根据热度/排名列出所有主题(比如reddit)。所以我采用了reddits算法并开始尝试。我用了这个例子:http://blog.sodhanalibrary.com/2014/04/reddit-ranking-algorithm-implementation.html
function score($ups,$downs){
return $ups - $downs;
}
function epoch_seconds($timestamp){
$epoch = new DateTime("1970-01-01 00:00:00");
$unix = new DateTime($timestamp);
$td = $epoch->diff($unix);
$days = $td->format('%a');
$hours = $td->format('%h');
$minutes = $td->format('%i');
$seconds = $td->format('%s');
$age = ($days * 86400) + ($hours * 3600) + ($minutes * 60) + $seconds;
return $age;
}
function calculateRank($ups,$downs,$date){
$s = score($ups,$downs);
$order = log10(max(abs($s), 1), 10);
if($s > 0) {
$sign = 1;
} elseif($s < 0) {
$sign = -1;
} else {
$sign = 0;
}
$seconds = epoch_seconds($date) - 1134028003;
return round($order + (($sign * $seconds)/45000), 7);
}
示例:
echo calculateRank(1,0,"2015-02-14 12:00:00"); // = 6441.9377111
我不明白的是,如果分数(赞成票和反对票之间的差)是0,那么排名就是0。这意味着,一篇+1/-1的全新文章将被列为涅盘。
echo calculateRank(1,1,"2015-02-14 12:00:00"); // = 0
此外,如果分数为负数,则排名为负数。这意味着,一篇得分为+1/-2的全新文章的排名将比涅盘更靠前。
echo calculateRank(1,2,"2015-02-14 12:00:00"); // = -6441.9377111
Select Query看起来像这样:
SELECT * FROM articles ORDER BY rank DESC
根据我给你看的结果,这意味着一篇10年前得分为正的文章(例如:1张赞成票/0张反对票)的排名会更高,然后是每一篇得分为0或负的文章,无论日期如何。这不可能是正确的,让我困惑。
我要找的是类似的东西。我已经通过不允许0分的成绩摆脱了零级。然而,负分(例如:0张赞成票/2张反对票)应该会降低分数,而不是颠倒分数。
非常感谢您的帮助!谢谢
我根据自己的需要调整了算法。我想到了以下内容:
if($score >= 0) {
$sign = 1;
} elseif($score < 0) {
$sign = -1;
}
return round( ($sign * $order) + ($seconds / 45000) , 7);
这样,分数为负的文章只会降低排名,而不是颠倒排名。(例如,分数为-1的惩罚不应该是:"去涅盘!")