<brabuhr / gmail.com>:
>>> Here's my not-fast solution:
Benoit Daloze <eregontp / gmail.com>:
>> I must admit is a very elegant solution.
<brabuhr / gmail.com> wrote:
> Here's a fresh non-elegant solution:

The last half of the previous one can be applied directly to the input
array of arrays of items instead of to the intermediate array of
arrays of object ids:

def distinct_sets(sets)
sets = sets.dup
values = sets.flatten.sort.uniq
flag = true
while flag
flag = false
sets = values.map{|v|
sets.select{|s|
s.include?(v)
}.tap{|s|
flag = true if s.size > 1
}.flatten.sort.uniq
}.uniq
end
sets
end

Easier code, but generally scales more poorly than the previous more
complex version:

ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]
user     system
total        real
elements * sets: 1 * 5 => 1 * 1           0.000000   0.000000
0.000000 (  0.001928)
elements * sets: 1 * 5 => 2 * 1           0.000000   0.000000
0.000000 (  0.002136)
elements * sets: 2 * 5 => 3 * 1           0.000000   0.000000
0.000000 (  0.003218)
elements * sets: 2 * 5 => 4 * 1           0.000000   0.000000
0.000000 (  0.003926)
elements * sets: 2 * 5 => 5 * 1           0.010000   0.000000
0.010000 (  0.007761)
elements * sets: 3 * 5 => 6 * 1           0.010000   0.000000
0.010000 (  0.012438)
elements * sets: 3 * 5 => 7 * 1           0.010000   0.000000
0.010000 (  0.009863)
elements * sets: 3 * 5 => 8 * 1           0.010000   0.000000
0.010000 (  0.015234)
elements * sets: 4 * 5 => 9 * 1           0.020000   0.000000
0.020000 (  0.022202)
elements * sets: 4 * 5 => 10 * 1          0.020000   0.000000
0.020000 (  0.025353)
elements * sets: 18 * 255 => 1 * 51       0.400000   0.120000
0.520000 (  0.514576)
elements * sets: 35 * 255 => 2 * 51       0.970000   0.180000
1.150000 (  1.280102)
elements * sets: 52 * 255 => 3 * 51       1.690000   0.210000
1.900000 (  2.260107)
elements * sets: 69 * 255 => 4 * 51       2.310000   0.390000
2.700000 (  2.888354)
elements * sets: 86 * 255 => 5 * 51       3.220000   0.460000
3.680000 (  4.250457)
elements * sets: 103 * 255 => 6 * 51      4.090000   0.590000
4.680000 (  4.723892)
elements * sets: 120 * 255 => 7 * 51      5.200000   0.600000
5.800000 (  6.258614)
elements * sets: 137 * 255 => 8 * 51      6.330000   0.700000
7.030000 (  7.694748)
elements * sets: 154 * 255 => 9 * 51      7.470000   0.870000
8.340000 (  8.730147)
elements * sets: 171 * 255 => 10 * 51     8.970000   0.820000
9.790000 (  9.871180)
elements * sets: 34 * 505 => 1 * 101      1.720000   0.250000
1.970000 (  2.331276)
elements * sets: 68 * 505 => 2 * 101      3.620000   0.750000
4.370000 (  4.983125)
elements * sets: 102 * 505 => 3 * 101     6.110000   0.920000
7.030000 (  7.258356)
elements * sets: 135 * 505 => 4 * 101     8.730000   1.460000
10.190000 ( 10.912860)
elements * sets: 169 * 505 => 5 * 101    12.130000   1.630000
13.760000 ( 14.714311)
elements * sets: 203 * 505 => 6 * 101    15.280000   2.040000
17.320000 ( 17.556731)
elements * sets: 236 * 505 => 7 * 101    19.090000   2.490000
21.580000 ( 22.005613)
elements * sets: 270 * 505 => 8 * 101    23.430000   2.620000
26.050000 ( 26.366511)
elements * sets: 304 * 505 => 9 * 101    28.090000   3.020000
31.110000 ( 32.421622)
elements * sets: 337 * 505 => 10 * 101   33.270000   3.550000
36.820000 ( 39.281699)

per
set set user     system      total        real
10, 1  0.000000   0.000000   0.000000 (  0.000338)
10, 10  0.010000   0.000000   0.010000 (  0.006647)
10, 100  0.320000   0.000000   0.320000 (  0.326307)
10, 1000 (>3 minutes)
user     system      total        real
1, 10  0.000000   0.000000   0.000000 (  0.000311)
10, 10  0.010000   0.000000   0.010000 (  0.006137)
100, 10  0.290000   0.020000   0.310000 (  0.305198)
1000, 10 77.240000   8.000000  85.240000 ( 90.868828)
10000, 10 (>3 minutes)
user     system      total        real
1, 1  0.000000   0.000000   0.000000 (  0.000052)
10, 10  0.000000   0.000000   0.000000 (  0.006212)
100, 100 84.440000   1.080000  85.520000 ( 91.856640)
1000, 1000 (>3 minutes)