Ale*_*lex 8 php sorting algorithm ranking
我有兴趣使用这个排名类,根据Evan Miller撰写的一篇文章来排名我有赞成票和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);
}
Run Code Online (Sandbox Code Playgroud)
我想每次用户投票我都可以在我的表中有一个列,其中包含为新投票重新计算的热度数据,并按主页上的该列排序.但我有兴趣在运行中加入上述功能,我不确定这是否可行.
来自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;
Run Code Online (Sandbox Code Playgroud)
但我宁愿不在sql中进行这种计算,因为我觉得这很麻烦,如果我在多个页面上使用这个代码,很难改变这一行.etc.
你是对的,这样的查询相当混乱且昂贵。
动态混合 PHP/MySQL 是一个坏主意,因为您必须为所有帖子选择值并计算热度,然后选择最热的列表。极其昂贵。
您应该考虑将至少部分计算保存到数据库中。绝对订单应该进入数据库。最好计算某些内容并在每次保存/更新时仅保存一次,而不是每次显示时都进行计算。尝试通过计算保存/更新的顺序而不是每次计算热度来对您将节省多少时间进行基准测试。好的事情是,除非有人赞成/反对,否则顺序永远不会改变,您无论如何都会将其保存到数据库中,对于标志也是如此。
即使您将符号保存到数据库,由于发布的时间戳参数,您仍然无法避免动态计算。
我会看看它有什么区别以及它在哪里产生差异,并每隔 x 时间使用 CLI 脚本计算热度,仅对于那些至关重要的脚本,每隔 y 时间计算热度,而它产生的差异较小。
采用这种方法,您将仅在必要时重新计算热度。这将使您的应用程序更加高效。