PHP Reddit排名算法 - 计算排名

时间:2015-02-14 12:29:25

标签: php mysql algorithm ranking reddit

我在讨论板上工作,根据它的热门/等级(如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

我不明白,事实是,如果得分(upvotes和downvotes之间的差异)为0,那么等级为0.这意味着,一个全新的文章+ 1 / -1会被列入涅ana。

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 upvote / 0 downvotes),排名会更高,然后每篇文章得分为0或者为负数得分,无论约会。这可能不对,让我困惑。

我正在寻找的是类似的东西。我已经通过不允许得分为0来摆脱零排名。然而,负分数(例如:0 upvotes / 2 downvotes)应该降低分数而不是反转分数。

非常感谢任何帮助! 感谢。

1 个答案:

答案 0 :(得分:1)

我根据自己的需要调整了算法。 我想出了以下内容:

if($score >= 0) {
    $sign = 1;
} elseif($score < 0) {
    $sign = -1;
}
return round( ($sign * $order) + ($seconds / 45000) , 7);

这样,具有负分数的文章只会降低排名而不是反转它。 (例如,对于得分为-1的惩罚不应该是:“去涅ana!”)