首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用二维数组中的最大元素数查找非空交叉点

问使用二维数组中的最大元素数查找非空交叉点
EN

Stack Overflow用户
提问于 2019-06-04 18:15:44
回答 4查看 144关注 0票数 3

我有一个二维数组:

代码语言:javascript
复制
   keys = [[:reference],
     [:parent_ref, :kind],
     [:kind, :parent_ref, :reference],
     [:parent_ref, :kind, :status]]

假设我想要所有这些数组的交集。我可以这样做:

代码语言:javascript
复制
keys.reduce{|arr, acc| arr & acc}

这将导致[],因为没有通用的公共密钥。现在,假设我想使用数组中的最大元素数找到一个“非空交集”。例如,使用此“方法”的交集将是:parent_ref,:kind,因为它是

代码语言:javascript
复制
[[:parent_ref, :kind],
         [:kind, :parent_ref, :reference],
         [:parent_ref, :kind, :status]]

我们只需要把[:reference]放在一边。

您将如何处理/创建这样的算法。

EN

回答 4

Stack Overflow用户

发布于 2019-06-04 20:17:26

蛮力,使用排列:

代码语言:javascript
复制
keys.combination(2).map { |a, b| a & b }.max_by(&:size)
#=> [:parent_ref, :kind]

找到所使用的元素,也是蛮力:

代码语言:javascript
复制
res = [:parent_ref, :kind]
keys.select { |e| e.sort & res.sort == res.sort }
#=> [[:parent_ref, :kind], [:kind, :parent_ref, :reference], [:parent_ref, :kind, :status]]
票数 0
EN

Stack Overflow用户

发布于 2019-06-04 21:09:24

假设二维数组是一个字符串数组,其中每个字符串都是一个字符数组。假设我们有这样的字符串:

代码语言:javascript
复制
CDB
BC
CBA
FDE
EDBC

首先按升序对每个字符串进行排序。

代码语言:javascript
复制
BCD
BC
ABC
DEF
BCDE

然后对字符串进行排序。

代码语言:javascript
复制
ABC
BC
BCD
BCDE
DEF

对于每个元素,查找出现在连续字符串的最长序列中的元素。在我们的示例中,它将是B和C。它们的连续字符串是具有非空交集的最大数量的字符串。

票数 0
EN

Stack Overflow用户

发布于 2019-06-04 22:01:51

我相信你的问题与this one有关,这个answer是相关的。

您可以将输入转换为较短的名称以提高可读性:

代码语言:javascript
复制
matrix = [[:a], [:b, :c], [:c, :b, :a], [:b, :c, :d]]

您可以遍历这些值,并保留一个包含每个值所在的所有集合的Hash:

代码语言:javascript
复制
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中...

然后,您可以将这些集组合在一起:

代码语言:javascript
复制
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]。

最后,您可以选择具有最多集合或具有最多元素的交叉点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56441863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档