Php 项目排名,使用Reddit排名算法按置信度排序
我感兴趣的是,根据作者的一篇文章,对我拥有的具有上升票和下降票的表进行排序。我有一个非常类似于Stack Overflow的向上/向下投票系统的系统,用于我正在处理的一个事件站点,通过使用这个排名类,我觉得结果会更准确。我的问题是如何按函数“hotness”排序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)
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”表进行任何操作(读、写、排序、比较等)都非常快,因此依赖数据库是“最快的”非临时数据存储的替代方案(内存/会话速度更快,但逻辑上不能用于存储此信息) 您应该更担心构建一个好的排名算法来提供您想要的结果(您提出了两个不同的系统,提供了不同的结果),并致力于使整个代码和代码数据库通信尽可能高效 原则上,具有迭代简单顺序的小代码为这种情况提供了最快速、最可靠的解决方案。例如:
我不确定您的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;