我正在寻找一种算法来按受欢迎程度对网站结果进行排序.. 就像 Reddit 一样,帖子越旧,它的投票/分数就越少。
这是 reddit 使用的普遍接受的解决方案:
t = (time of entry post) - (Dec 8, 2005)
x = upvotes - downvotes
y = {1 if x > 0, 0 if x = 0, -1 if x < 0)
z = {1 if x < 1, otherwise x}
rank = log(z) + (y * t)/45000
我已经研究过 Reddit 的算法,虽然它适合一种情况,但我真正需要的是两种算法,一种用于热门帖子,另一种用于即将发布的帖子:
- 热门帖子
- 即将发布的帖子
受欢迎程度会减慢,给稍旧的帖子更多的权重,即将发布的帖子将更多地关注今天的热门帖子,在 N 小时/天/等之后急剧下降。
我正在使用 Sphinx 表达式编写此代码,因此我无法编写非常复杂的算法,并且我只能访问以下函数:
http://sphinxsearch.com/docs/current.html#numeric-functions
所以我每个帖子都有以下数据:
- 以秒为单位发布年龄
- 发表分数
这是我目前的解决方案:
Exponent = 0.01 (Popular), 0.5 (Upcoming)
SecondsSincePublised = abs(CurTimeInSecondsSinceDate-PubTimeInSecondsSinceDate)
Rank = (log10(PostScore)*10000) / pow(SecondsSincePublised,Exponent)
尽管此解决方案确实有效,但它并不理想。在过去的几个小时内,一篇新的热门帖子通常在热门和即将发布的帖子中都排名靠前,这并不是我真正想要的。
谁能建议另一种算法,我可以修改指数分量来调整衰减?