我需要与数百万个元素(数据库ID)建立n个数组的交集。 这段代码工作得很完美,但很慢(有很大的数组)。我怎样才能改善它?
[[1,2,3,4],[2,4,6,8],[4,5,8]].inject([]){|c,v| c = v if c.size==0; c = c&v if c.size>0; c }
答案 0 :(得分:5)
[1,2,3,4] & [2,4,6,8] & [4,5,8] #=> [4]
intersection method使用哈希值,因此它应该很快。
答案 1 :(得分:3)
Ruby提供了一个交集opperator。
我建议你试试这个:
> [[1,2,3,4],[2,4,6,8],[4,5,8]].reduce{ |accum, arr| accum & arr }
=> [4]
修改强>
这可以写得更简洁一点,但它有可读性。
[[1,2,3,4],[2,4,6,8],[4,5,8]].reduce(:&)