使用喜欢和时差实现帖子排名算法

时间:2015-08-19 13:15:26

标签: ruby-on-rails algorithm

我如何根据喜欢和时差(帖子的年龄)对帖子中的红宝石进行排名。是否有适合此任务的算法。

以下是算法

的代码
@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!

1 个答案:

答案 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的实现,请记住,您可能需要偶尔运行一个脚本来更新数据库中的所有记录。