查找2人之间的最大连接数

时间:2015-02-25 23:34:48

标签: python r

假设我有以下数据:

p1 <- c('a','a','a','a','a','b','b','b','b','c','c')
p2 <- c('b','c','d','e','f','c','a','e','d','e','f')
connections <- data.frame(p1, p2)

p1p2是人,每行代表一个连接。

问题:如何编写一个函数来查找2个人之间的最大公共连接数? (例如a&amp; b有3个共同连接:c,d,e)

2 个答案:

答案 0 :(得分:5)

在Python中,您可以使用collection.Counter()个对象及其交集:

>>> from collections import Counter
>>> p1_conns = Counter(('a','a','a','a','a','b','b','b','b','c','c'))
>>> p2_conns = Counter(('b','c','d','e','f','c','a','e','d','e','f'))
>>> p1_conns & p2_conns
Counter({'c': 2, 'a': 1, 'b': 1})
>>> sorted(p1_conns & p2_conns)
['a', 'b', 'c']
>>> len(p1_conns & p2_conns)
3

长度是公共连接的数量。如果您只使用设置交叉点,那么最后一个值也可用:

>>> p1_set = {'a','a','a','a','a','b','b','b','b','c','c'}
>>> p2_set = {'b','c','d','e','f','c','a','e','d','e','f'}
>>> p1_set & p2_set
set(['a', 'c', 'b'])
>>> len(p1_set & p2_set)
3

但是计数器(多组)也说明了他们的计数。

答案 1 :(得分:4)

您似乎想要找到从一个顶点到另一个顶点的最大长度为2的路径数。我不确定这是非常有效的,但你可以用R

来做
library(igraph)
gg <- graph.data.frame(connections, directed=F)
ln <- sapply(V(gg), function(x) V(gg)[nei(x)])
max(combn(ln,2, function(x) sum(x[[1]] %in% x[[2]])))
# [1] 3

这里我们使用适当的图形库来连接节点。然后我们查看重叠的邻居集来计算两步路径的数量。

plot(gg)

enter image description here