0

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

让我们以食物为例。

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

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

基本上,我不仅在寻找一种有效的算法,而且还在寻找将其存储在数据库中的最佳方式。

谢谢您的帮助。

4

1 回答 1

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}"

顶部节点是最终支配大多数其他节点的节点。然而,鉴于图可以是循环的,如果另一个节点会更快地完成循环,我们将切断循环。

于 2013-02-20T07:33:22.567 回答