Php 项目排名,使用Reddit排名算法按置信度排序

Php 项目排名,使用Reddit排名算法按置信度排序,php,algorithm,sorting,ranking,Php,Algorithm,Sorting,Ranking,我感兴趣的是,根据作者的一篇文章,对我拥有的具有上升票和下降票的表进行排序。我有一个非常类似于Stack Overflow的向上/向下投票系统的系统,用于我正在处理的一个事件站点,通过使用这个排名类,我觉得结果会更准确。我的问题是如何按函数“hotness”排序 private function _hotness($upvotes = 0, $downvotes = 0, $posted = 0) { $s = $this->_score($upvotes, $downvotes)

我感兴趣的是,根据作者的一篇文章,对我拥有的具有上升票和下降票的表进行排序。我有一个非常类似于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);
}

但是我不想在sql中进行这种计算,因为我觉得如果我在多个页面上使用这种代码,这会很混乱,很难改变。等等。

访问相应的“Posts”表进行任何操作(读、写、排序、比较等)都非常快,因此依赖数据库是“最快的”非临时数据存储的替代方案(内存/会话速度更快,但逻辑上不能用于存储此信息)

您应该更担心构建一个好的排名算法来提供您想要的结果(您提出了两个不同的系统,提供了不同的结果),并致力于使整个代码和代码数据库通信尽可能高效

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

  • 排名函数(如您提出的第一个或任何 另一个是建立在你想要的排名规则之上的)每次 投票结果已给出。它会写入中的相应列 “Posts”表(查询越简单越好:您可以创建一个 排名系统尽可能复杂,但请尝试使用PHP 而不是查询)

  • 每次需要对帖子进行比较时,都会通过简单的选择来读取“帖子”表,并按排名对记录进行排序 (您可以有各种“评估栏”(例如,向上投票, 否决票,进一步考虑);但最好有一个 最终排名)


  • 我不确定您的DB和模式是否可能,但是您是否考虑编写UDF进行自定义排序?


    stackoverflow的一篇帖子谈到了如何做到这一点

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

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

    <>你应该考虑至少将部分计算保存到数据库中。当然,订单应该进入数据库。最好每次保存/更新时计算某个内容并保存一次,而不是每次显示时计算。试着通过计算保存/更新时的顺序,而不是每次计算热度,来测试您将节省多少时间。好的是,除非有人向上/向下投票,否则顺序永远不会改变,不管怎样,您都会将其保存到db中,符号也是如此

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

    我会看看它有什么不同,在什么地方会有不同,并且每x个时间段使用CLI脚本计算热度,仅适用于那些关键的脚本,每y个时间段使用CLI脚本的热度差异较小


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

    看看这个,它可能会对您有所帮助。
    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;