我正在一个类似digg的网站上工作,用户可以提交“故事”。
我记录了每一项得到多少“选票”和“相似的添加”。相似的添加定义为两个用户添加相同的“链接”。
下面是算法的一部分(本质上是最重要的):
y = day number
sy = number of adds on day y
∑ y[1:10] sy / y因此,基本上计算指定一天的“相似添加”的数量,除以内容发布后的秒数。在过去的10天里这样做(举个例子)。
但是,我不知道如何实现这一点,以便它能够很好地执行。我能想到的每一种方法都会很慢。
我唯一能想到的实现这一点的方法是,通过计算过去10天内提交的每一项的添加数,将花费很长时间。(因此,在过去的10天中,一个带有组日期的sql命令执行了10次--很明显,这个方法很糟糕)。
即使我保留了一个每天更新一次的表(并在后台运行上面的sql ),但一旦数据库变大,这仍然会非常缓慢。此外,评级将“过时”,因为它不是现场直播(例如,突发新闻“项目”永远不会到达顶端)。
有没有人有做这件事的经验?
发布于 2008-12-15 14:40:59
试试这个:每个人都有一票。你投的票坚持你投的最后一票。时间问题将来自于用户的行为。
发布于 2010-05-18 15:55:44
有一个对数加权平均值,你可以做。这样做的好处是,您只需要存储“当前值”和加权平均值。在您的例子中,“当前值”可以是当天的票数,并且您可以每天重新计算加权平均数。
const float WeightFactor = 0.70; //for example
float PreviousAverage = GetPreviousAverage();
float CurrentValue = GetVoteCountToday();
float NewAverage = (WeightFactor * CurrentValue) + ( (1-WeightFactor) * PreviousAverage);只有当你有一个在设定频率上发生的新值时,这才能真正发挥作用。如果你想在任何时候重新计算你的选票,那么这是行不通的。
发布于 2008-12-15 14:21:49
不需要执行SQL 10次才能得到结果,您可以在一次执行中得到这样的结果:
select sum(dayval)
from
( select count(*) / (current_date-day+1) dayval
from votes
where story_id = 123
and day >= current_date - 9
group by (current_date-day+1)
)(实际代码因所使用的DBMS而异)。
不过,我并不认为这会有好成绩!
也许是一种折衷方案:计算并将“开始一天”的值存储在每天的批处理过程中,然后为当天收到的每一次投票增加1的存储值?
https://stackoverflow.com/questions/368369
复制相似问题