项目排名,使用Reddit排名算法自信地排序

时间:2013-03-10 00:49:46

标签: php algorithm sorting ranking

我有兴趣使用这个ranking class,基于Evan Miller的一篇文章来排列我有赞成和反对的表。我有一个非常类似Stack Overflow的上/下投票系统的系统,用于我正在处理的事件网站,通过使用这个排名类,我觉得结果会更准确。我的问题是我如何通过功能'hotness'订购?

private function _hotness($upvotes = 0, $downvotes = 0, $posted = 0) {
    $s = $this->_score($upvotes, $downvotes);
    $order = log(max(abs($s), 1), 10);

    if($s > 0) {
        $sign = 1;
    } elseif($s < 0) {
        $sign = -1;
    } else {
        $sign = 0;
    }

    $seconds = $posted - 1134028003;

    return round($order + (($sign * $seconds)/45000), 7);
}

我想每次用户投票时我都可以在我的表中有一个列,其中包含为新投票重新计算的热度数据,并按主页上的该列排序。但是我有兴趣在运行中加入上述功能,我不确定这是否可行。

来自Evan Miller,他使用:

SELECT widget_id, ((positive + 1.9208) / (positive + negative) - 
                   1.96 * SQRT((positive * negative) / (positive + negative) + 0.9604) / 
                          (positive + negative)) / (1 + 3.8416 / (positive + negative)) 
       AS ci_lower_bound FROM widgets WHERE positive + negative > 0 
       ORDER BY ci_lower_bound DESC;

但是我宁愿不在sql中进行这个计算,因为我觉得如果我在多个页面上使用这个代码,这很麻烦并且很难改变它。等等。

3 个答案:

答案 0 :(得分:3)

访问相应的“帖子”表格(阅读,写作,排序,比较等)非常快,因此依赖数据库是非临时的“最快速”替代方案数据存储(内存/会话仍然更快,但从逻辑上讲,不能用于存储此信息)。

你应该更担心的是建立一个良好的排名算法,提供你想要的结果(你提出两个不同的系统,提供不同的结果),并努力使整个代码和代码 - 数据库通信尽可能高效。

原则上,具有迭代简单顺序的小代码为这种情况提供了最快和最可靠的解决方案。例如:

  1. 排名功能(就像你提出的第一个或任何一个 另一个建立在你想要的排名规则上每次调用一次 投票给出。它写入到相应的列中 “帖子”表(查询越简单越好:你可以创建一个 排名系统尽可能复杂,但尝试依赖PHP 而不是查询)。

  2. 每次需要比较帖子时,都会使用简单的SELECT读取“帖子”表,按排名排序记录 (你可以有各种“评估栏目”(例如,向上投票, 降票,进一步考虑);但最好还是有一个 最终排名)。

答案 1 :(得分:1)

你是对的,像这样的查询也相当混乱和昂贵。

混合使用PHP / MySQL是一个坏主意,因为您必须为所有帖子选择值并计算热度,然后选择最热门的列表。非常昂贵。

您应该考虑将至少部分计算保存到数据库中。绝对订单应该去数据库。计算某些内容总是更好,每次保存/更新只保存一次,而不是计算每次显示时间。尝试通过计算保存/更新的顺序而不是每次计算热度来对节省的时间进行基准测试。好的是订单永远不会改变,除非有人投票/ downvotes你保存到数据库无论如何,同样的标志。

即使您将符号保存到数据库,由于发布的时间戳参数,您仍然无法避免动态计算。

我会看到它有什么区别,它会产生什么不同,并且每隔x个时间用CLI脚本计算热度,这对于那些至关重要的脚本来说,每隔一段时间它就会减少差异

采用这种方法,您将仅在必要时重新计算热度。这将使您的应用程序更加高效。

答案 2 :(得分:0)

我不确定您的数据库和架构是否可以,但是您是否考虑过编写UDF进行自定义排序?

stackoverflow的帖子讨论了如何执行此操作here.