arr = [
[:reference],
[:parent_ref, :kind],
[:kind, :parent_ref, :reference],
[:parent_ref, :kind],
[:parent_ref, :kind, :status],
[:kind, :parent_ref, :kind]
]
Обратите внимание, что я изменил keys
, приведенный в примере, чтобы включить два типа дубликатов.
require 'set'
h = arr.each_with_object(Hash.new { |h,k| h[k] = [] }) { |a,h| h[a.to_set] << a }
#=> {#<Set: {:reference}>=>[[:reference]],
# #<Set: {:parent_ref, :kind}>=>[[:parent_ref, :kind],
# [:parent_ref, :kind], [:kind, :parent_ref, :kind]],
# #<Set: {:kind, :parent_ref, :reference}>=>[[:kind, :parent_ref, :reference]],
# #<Set: {:parent_ref, :kind, :status}>=>[[:parent_ref, :kind, :status]]}
g = h.each_key.with_object({}) do |k,g|
g[k] = h[k].dup
h.each { |kk,v| g[k].concat(v) if k < kk }
end
#=> {#<Set: {:reference}>=>[[:reference], [:kind, :parent_ref, :reference]],
# #<Set: {:parent_ref, :kind}>=>[[:parent_ref, :kind], [:parent_ref, :kind],
# [:kind, :parent_ref, :kind], [:kind, :parent_ref, :reference],
# [:parent_ref, :kind, :status]],
# #<Set: {:kind, :parent_ref, :reference}>=>[[:kind, :parent_ref, :reference]],
# #<Set: {:parent_ref, :kind, :status}>=>[[:parent_ref, :kind, :status]]}
a = g.max_by { |k,v| v.size }
#=> [#<Set: {:parent_ref, :kind}>, [[:parent_ref, :kind], [:parent_ref, :kind],
# [:kind, :parent_ref, :kind], [:kind, :parent_ref, :reference],
# [:parent_ref, :kind, :status]]]
[a.last.first, a.last.drop(1)]
#=> [[:parent_ref, :kind], [[:parent_ref, :kind], [:kind, :parent_ref, :kind],
# [:kind, :parent_ref, :reference], [:parent_ref, :kind, :status]]]
Показывает, что массив [:parent_ref, :kind]
при преобразовании в набор является подмножеством следующих других элементов array
после преобразования в наборы:
[[:parent_ref, :kind], [:kind, :parent_ref, :kind],
[:kind, :parent_ref, :reference], [:parent_ref, :kind, :status]]
и что ни один другой элемент arr
(после того, как все элементы arr
преобразованы в наборы) не имеет большего числа надмножеств.
Обратите внимание, что при желании вычисления g
и a
могут быть объединены в цепочку.
См. Set # <</a>.
Если ни arr
, ни какой-либо элемент arr
не могут содержать дубликаты, вычисления, конечно, упрощаются.
arr = [
[:reference],
[:parent_ref, :kind],
[:kind, :parent_ref, :reference],
[:parent_ref, :kind, :status]
]
require 'set'
sets = arr.map(&:to_set)
#=> [#<Set: {:reference}>, #<Set: {:parent_ref, :kind}>,
# #<Set: {:kind, :parent_ref, :reference}>, #<Set: {:parent_ref, :kind, :status}>]
h = sets.each_with_object(Hash.new { |h,k| h[k] = [] }) { |s,h|
sets.each { |ss| h[s] << ss if s < ss } }
#=> {#<Set: {:reference}>=>[#<Set: {:kind, :parent_ref, :reference}>],
# #<Set: {:parent_ref, :kind}>=>[#<Set: {:kind, :parent_ref, :reference}>,
# #<Set: {:parent_ref, :kind, :status}>]}
k, v = h.max_by { |_,v| v.size }
#=> [#<Set: {:parent_ref, :kind}>,
# [#<Set: {:kind, :parent_ref, :reference}>, #<Set: {:parent_ref, :kind, :status}>]]
[k.to_a, v.map(&:to_a)]
#=> [[:parent_ref, :kind],
# [[:kind, :parent_ref, :reference], [:parent_ref, :kind, :status]]]