处理评级系统的最佳方式

时间:2013-02-20 07:29:48

标签: algorithm database-design

我正在尝试实施比较评级系统,但我很难找到处理此问题的最佳方法,尤其是从数据库的角度来看。

让我们以食物为例。

用户将获得两种不同食物的照片,并选择他喜欢哪种食物。然后他会再展示两种食物(一种可能是相同的,或者两者都可能不同),用户再次选择。他一遍又一遍地继续这样做,并且在这样做的过程中,应用程序会告诉用户他最喜欢的食物是什么,完全基于他比他人更喜欢哪些,并比较所有这些比较并显示结果。

我想过只跟踪每个项目的总喜欢/不喜欢,我也考虑过追踪大型数据库中的每一个选择。我确信我忽略了一种对这种系统有效的方法。

基本上我不仅要寻找有效的算法,还要将其存储在数据库中。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我只保留一个与每个选项对应的三元组(user_id, preferred_id, dispreferred_id)的数据库。

编辑:有一点时间玩这个。对于数以百万计的评级而言,以下情况会很慢,并且会吞噬内存,但可能会给你一些想法。如果你这样做,你应该从crontab异步运行,而不是按需运行。

require 'set'                                                                                                                                                                                                                    

choices = [
  [1, 4],
  [1, 5],
  [2, 3],
  [2, 4],
  [3, 1],
  [4, 2],
  [4, 3],
  [5, 1],
  [6, 7],
  [8, 4],
]

dominates = Hash.new { |hash, key| hash[key] = Set.new }
choices.each do |p, d|
  dominates[p].add(d)
end

prev_dominates = nil
while dominates != prev_dominates
  prev_dominates = Hash.new
  dominates.each { |big, smalls| prev_dominates[big] = smalls.clone }
  prev_dominates.each do |big, smalls|
    smalls.each do |small|
      if prev_dominates.include?(small)
        prev_dominates[small].each do |smaller|
          if smaller != big and !prev_dominates[smaller].include?(big)
            dominates[big] << smaller
          end
        end
      end
    end
  end
end

top = dominates.max_by { |big, smalls| smalls.size }[0]

puts dominates.inspect
puts "BEST: #{top}"

顶级节点最终占据了大多数其他节点。但是,假设图形可以是循环的,如果另一个节点更早完成循环,我们就会缩短周期。

相关问题