2012-01-18 82 views
2

我正在开发一个类似于Digg的web应用程序,我需要一个算法来用来按照流行度排序。例如:在第一页上,我想拥有今天最受欢迎的帖子,而且几天之前已经获得了足够的选票。我的db现在看起来像这样:投票加权算法

Table | fields 
Posts | id | ... | time 
Feedback | id | userid | time | upvote 

upvote字段是bool。如果是肯定的,则意味着用户点击了投票按钮。

我的表格可以修改,因为它们是空的。

任何帮助将不胜感激

+0

为什么不选择[KISS](http://en.wikipedia.org/wiki/Keep_it_simple_stupid)并根据最后* X *小时内的投票数排名?或者可能使用延时过滤器.... – wallyk 2012-01-18 23:05:00

回答

2

我个人喜欢采取更复杂的方法。总体思路是每5分钟计算一次cron处理器,根据您提到的标准计算每个实体的受欢迎程度,并根据用户standard deviation消除团伙投票的明显集会,以提升其社交圈内的内容。

看看劳森的答案是一个好主意,用来分解投票年龄。但考虑到根据声誉,资历等原因应用用户自己的体重可能会有所帮助。

不幸的是,这并不简单。尽管我发现它比大多数网络编程更有趣,但考虑到游戏的所有基本心理因素可能是一个非常耗时的过程,并且可能不是你想到的,除非你碰巧为Digg本身工作,或者成为严重启动。

这里的php.net标准偏差:http://php.net/manual/en/function.stats-standard-deviation.php

虽然我觉得这个苏答案是更重要的一点:z-Scores(standard deviation and mean) in PHP

代码样本可能是好的,但我们需要一些数据做所以即使这样,这可能会变得相当复杂。但它绝对有趣。特别是当你的代码发现人们试图游戏系统。

5

如果我理解正确的话,你想投的价值是成反比它的年龄。 (投票越早,它就越不会影响您的人气指数。)

实现此目的的一个简单方法是将投票转换为受欢迎程度单位(PU),并且不只是简单投票,而是总和。 PU的构建可以简单到使其等于1 /(投票的年龄以天或小时为单位)。一天的投票价值1 PU,而2天的投票则价值一半。