Ruby Array - 快速计算重叠的方法

时间:2012-01-04 11:11:51

标签: mysql ruby-on-rails ruby intersection overlap

我正在使用我的一个模型中的序列化数组字段,特别是计算每个数组的共享成员数。

现在,根据我的项目的性质,我需要进行大量的重叠计数..所以我想知道是否有一种超快速,切割方式来做到这一点。

目前,我正在使用'&'方法,所以我的代码看起来像这样

(user1.follower_names & user2.follower_names).count

工作得很好......但我希望有更快的方法可以做到。

2 个答案:

答案 0 :(得分:4)

设置更快。

require 'benchmark'
require 'set'
alphabet = ('a'..'z').to_a
user1_followers = 100.times.map{ alphabet.sample(3) }
user2_followers = 100.times.map{ alphabet.sample(3) }
user1_followers_set = user1_followers.to_set
user2_followers_set = user2_followers.to_set

n = 1000
Benchmark.bm(7) do |x|
  x.report('arrays'){ n.times{ (user1_followers & user2_followers).size } }
  x.report('set'){ n.times{ (user1_followers_set & user2_followers_set).size } }
end

输出:

              user     system      total        real
arrays    0.910000   0.000000   0.910000 (  0.926098)
set       0.350000   0.000000   0.350000 (  0.359571)

答案 1 :(得分:1)

上述的替代方法是在数组上使用' - '运算符:

user1.follower_names.size - (user1.follower_names - user2.follower_names).size

基本上,这会获得列表1的大小,并且在没有交集的情况下减少联合列表的大小。这不如使用集合那么快,但比单独使用与数组的交集

要快得多