我如何根据喜欢和时差(帖子的年龄)对帖子中的红宝石进行排名。是否有适合此任务的算法。
以下是算法
的代码@rank = 0.00
s = post.likers(User).count
order = Math.log10([s.abs, 1].max)
if s > 0
sign = 1
elsif s < 0
sign = -1
else
sign = 0
end
td = (Time.now - post.created_at)
td2 = td.days * 86400 + td.seconds + ((1000000*(td.seconds)).to_f)/1000000
seconds = td2 - 1134028003
@rank = (sign * order + seconds / 45000).round(7)
post.update_attributes(popularity: @rank)
post.save!
答案 0 :(得分:1)
How Reddit ranking algorithms work。如果只有喜欢的帖子,也就是说,如果喜欢的数量总是正数,您可以通过删除y
来简化该等式。
<强>更新强>
ruby实现链接算法
def hot(ups, downs, date)
s = ups - downs
order = Math::log([s.abs, 1].max, 10)
sign = if s > 0 then 1 elsif s < 0 then -1 else 0 end
seconds = date.to_f - 1134028003
(sign * order + seconds / 45000).round(7)
end
请注意,他此处不使用Time.now
。在此实现中,帖子越旧,时间差越小(seconds
),因此将其视为奖励(添加它)是有意义的。
在您的实施中,seconds
是现在和创建后时间之间的差异,因此您应该将其视为惩罚,方法是减去seconds / 45000
或将td
计算为{{1没关系。
您不需要post.created_at - Time.now
。
此外,如果您想使用td2
的实现,请记住,您可能需要偶尔运行一个脚本来更新数据库中的所有记录。