假设我有以下数据:
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)
p1
和p2
是人,每行代表一个连接。
问题:如何编写一个函数来查找2个人之间的最大公共连接数? (例如a&amp; b有3个共同连接:c,d,e)
答案 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)