我有一个二维数组:
keys = [[:reference],
[:parent_ref, :kind],
[:kind, :parent_ref, :reference],
[:parent_ref, :kind, :status]]假设我想要所有这些数组的交集。我可以这样做:
keys.reduce{|arr, acc| arr & acc}这将导致[],因为没有通用的公共密钥。现在,假设我想使用数组中的最大元素数找到一个“非空交集”。例如,使用此“方法”的交集将是:parent_ref,:kind,因为它是
[[:parent_ref, :kind],
[:kind, :parent_ref, :reference],
[:parent_ref, :kind, :status]]我们只需要把[:reference]放在一边。
您将如何处理/创建这样的算法。
发布于 2019-06-04 20:17:26
蛮力,使用排列:
keys.combination(2).map { |a, b| a & b }.max_by(&:size)
#=> [:parent_ref, :kind]找到所使用的元素,也是蛮力:
res = [:parent_ref, :kind]
keys.select { |e| e.sort & res.sort == res.sort }
#=> [[:parent_ref, :kind], [:kind, :parent_ref, :reference], [:parent_ref, :kind, :status]]发布于 2019-06-04 21:09:24
假设二维数组是一个字符串数组,其中每个字符串都是一个字符数组。假设我们有这样的字符串:
CDB
BC
CBA
FDE
EDBC首先按升序对每个字符串进行排序。
BCD
BC
ABC
DEF
BCDE然后对字符串进行排序。
ABC
BC
BCD
BCDE
DEF对于每个元素,查找出现在连续字符串的最长序列中的元素。在我们的示例中,它将是B和C。它们的连续字符串是具有非空交集的最大数量的字符串。
发布于 2019-06-04 22:01:51
我相信你的问题与this one有关,这个answer是相关的。
您可以将输入转换为较短的名称以提高可读性:
matrix = [[:a], [:b, :c], [:c, :b, :a], [:b, :c, :d]]您可以遍历这些值,并保留一个包含每个值所在的所有集合的Hash:
matrix.each.with_index(1) do |row, i|
row.each do |value|
grouped_values[value] << i
end
end
p grouped_values
# => {:a=>[1, 3], :b=>[2, 3, 4], :c=>[2, 3, 4], :d=>[4]}因此:a出现在集合1和3中,b出现在集合2、3和4中...
然后,您可以将这些集组合在一起:
grouped_sets = Hash.new{|h, k| h[k] = []}
grouped_values.each do |value, sets|
grouped_sets[sets] << value if sets.size > 1
end
p grouped_sets
# => {[1, 3]=>[:a], [2, 3, 4]=>[:b, :c]}因此,集合1和3的交集是[:a],而集合2、3和4的交集是[:b, :c]。
最后,您可以选择具有最多集合或具有最多元素的交叉点。
https://stackoverflow.com/questions/56441863
复制相似问题