我有兴趣创建一种算法,该算法根据3个重要性加权的动作提供用户排名。例如:
然后,我希望时间衰减时提供者在行动时提供最大值,并在一段时间内衰减到0(日/周/月/年)。
有关从哪里开始的建议,如何实施这样的算法?
根据Jim的评论进行更新:
答案 0 :(得分:2)
有关从哪里开始的任何建议
显而易见的解决方案是跟踪每个事件以及该事件的时间戳。其余的只是数学。但是,这可能需要更多的存储空间,并且计算时间要比预期的要多。
所以我的建议是使用binning。如果整个时间衰减期是一天,那么使用12个两小时的垃圾箱。例如,在午夜,清除第一个仓(代表00:00 am到02:00 am时间段)。然后在凌晨2:00之前发生的任何事件都会更新该bin中的ABC计数器。垃圾箱的重量一直持续到凌晨2点,之后它会减轻重量,直到午夜再次清理。
如果时间段是一周,请使用7个每日垃圾箱或14个半日垃圾箱。在一个月的时间内,使用15个两天的垃圾箱,或10个三天的垃圾箱。一年,使用12个月的垃圾箱。
答案 1 :(得分:2)
尝试提供高水平的设计。
用户得分改变的原因只有两个:
时间的相互作用导致线性衰减 † 。
您正在尝试根据对操作A,B和C的贡献生成的分数对用户进行排名。让我们首先概述当发生分数变化的两个原因之一时软件将执行的操作。< / p>
当用户执行操作时:假设用户不再提交进一步操作并将其放入用户对象内的队列中,则在剩余时间内生成用户的分数。队列的前面将告诉用户的当前分数。
当一个时间单位通过时:只需将正面从其得分队列中取出。
在我看来,传统的数据结构 - 数组,树,哈希映射 - 甚至是通常的增强数据结构 - 链接的Hashmap,红黑树 - 都不足以计算这种评分模型的排名。您需要移动一个级别以获得正确的数据结构,以便从此评分系统生成排名。
我可以想象一种多重链接的Hashmap。看起来有点像这样:
因此,在上图中,我们有一个包含所有用户对象的公共存储。然后我们在用户存储中有多个单/双链接索引。这样,当用户的分数发生变化时,与用户对象关联的所有索引都将是可更新的。
最后,可以允许排名不一定从1开始。可以更新sorted-concurrent-hashmap并且可以保持负排名。由于地图是排序的,因此最负排名将是第一排名,并且可以通过排序地图的遍历来获得更多排名。当最低等级接近下溢限制时,可以将等级归一化为从一些高正数开始。
这是一个非常大的问题。我想到了更多的想法和优化。在这里提及所有这些都是太大的任务。如果您有特定问题,我可以尝试回答。
† 时间的相互作用导致线性衰减。所以我假设计算从用户当前得分到下一个(比方说)100分的时间衰减得分很简单。需要计算多少未来分数将取决于您认为是一个单位时间。