找到许多连接的交集(图算法?)

时间:2014-07-03 15:54:42

标签: ruby algorithm graph

说我有3个(或更多)人的连接列表。称他们为Max,Jeff和Steve。

例如,每个都有一个连接列表。

最大 - >弗兰克,苏

杰夫 - >苏,杰瑞,卡罗琳

史蒂夫 - >卡罗琳,爱丽丝,鲍勃

鉴于这些列表,我想要返回任何出现的交叉点。

所以我会回来[苏,卡罗琳],因为马克斯和杰夫在苏和杰夫相交,史蒂夫和卡罗琳相交。

我在Ruby编程,因此可能有自己很酷的,特殊的方式来做这样的事情,或者我将不得不编写自己的算法来获取这些。我把它想象成如下图所示。

graph of explained connections

那么找到这些交叉点的​​好方法是什么,我将它们列在列表中?是否有一种很好的红宝石方式可以说:Max.connections& Jeff.connections& Steve.connections或者制作图表并对它们进行排序会很好。

谢谢!

1 个答案:

答案 0 :(得分:1)

假设你有:

h = {
  "Max" => ["Frank", "Sue"],
  "Jeff" => ["Sue", "Jerry", "Caroline"],
  "Steve" => ["Caroline", "Alice", "Bob"],
}

其中h中的每个数组都不包含重复项。然后,要查找数组中的重复项,您可以执行以下操作:

h.values.flatten.group_by{|e| e}.values.select{|a| a.length > 1}.map(&:first)
# => ["Sue", "Caroline"]