【问题标题】:From a set of pairs, find all subsets s.t. no pair in the subset shares any element with a pair not in the subset从一组对中,找到所有子集 s.t.子集中没有对与不在子集中的对共享任何元素
【发布时间】:2014-09-30 04:15:43
【问题描述】:

我有一对。每对都表示为[i,1:2]。也就是说,ith 对是ith 行中第一列和第二列中的数字。

我需要将这些对分成不同的组,s.t.在jth 组中的任何对中没有任何元素在任何非j 的组中。例如:

示例 1:数据

> col1 <- c(3, 4, 6, 7, 10, 8)
> col2 <- c(6, 7, 3, 4, 3,  1)
> 
> dat <- cbind(col1, col2)
> rownames(dat) <- 1:nrow(dat)
> 
> dat
  col1 col2
1    3    6
2    4    7
3    6    3
4    7    4
5   10    3
6    8    1

对于所有对,无论数字是在第 1 列还是第 2 列,都应该将这些对分类为组 s.t.每个组中的每一对中的每个数字只存在于一个组中。所以解决的例子应该是这样的。

  col1 col2 groups
1    3    6      1
2    4    7      2
3    6    3      1
4    7    4      2
5   10    3      1
6    8    1      3

第 1、3 和 5 行被组合在一起,因为 1 和 3 包含相同的数字,并且 5 共享数字 3,所以它必须与它们组合在一起。 2 和 4 共享相同的不同数字,因此它们被组合在一起,而 6 具有唯一的数字,因此它被单独留下。

如果我们稍微改变数据,请注意以下几点。

示例 2:新数据

注意当我们添加一行与第 6 行和第 5 行共享一个元素时会发生什么。

  col1 col2 groups
1    3    6      1
2    4    7      2
3    6    3      1
4    7    4      2
5   10    3      1
6    8    1      1
7    1   10      1

第 7 行中的 10 将其连接到第一个组,因为它与第 5 行共享一个元素。它还与第 6 行(数字 1)共享一个元素,因此第 6 行将位于第 1 组中。

问题

有没有一种简单的方法来组建小组?向量操作?排序算法?如果您尝试使用循环来执行此操作,它很快就会变得非常讨厌,因为每个后续行都可以更改先前行的成员资格,如示例中所示。

【问题讨论】:

  • @MrFlick - 我不一定会称它为重复项。它非常相似,但略有不同。
  • 看起来完全相同的 igraph 代码可以工作。我可能错过了什么。
  • @MrFlick - 几乎是这样,尽管这个问题希望将结果分配给成对的案例而不是每个单独的案例。因此需要一些合并才能获得预期的结果。反对票也可能有点苛刻(不确定是不是你)。我从经验中知道,如果您一开始不了解图结构,这是一个很难搜索的主题。
  • @thelatemail 好的,如果你觉得它有很大的不同,我已经删除了我的近距离投票。我没有投反对票;我不认为这是一个坏问题,只是认为它已经有了答案。

标签: r algorithm sorting vector vectorization


【解决方案1】:

要利用旧答案:identify groups of linked episodes which chain together,它为每个单独的值分配一个组,您可以尝试为每个链接对分配一个组:

library(igraph)
g <- graph_from_data_frame(dat)
links <- data.frame(col1=V(g)$name,group=components(g)$membership)
merge(dat,links,by="col1",all.x=TRUE,sort=FALSE)

#  col1 col2 group
#1    3    6     1
#2    4    7     2
#3    6    3     1
#4    7    4     2
#5   10    3     1
#6    8    1     3

【讨论】:

    【解决方案2】:

    您的元素可以被视为无向图中的顶点,您的元素对可以被视为边,然后(假设您想要找到最小大小的组 - 如果您不这样做,那么例如整个集合对可以标记为“组 1”)您要查找的组是此图中的 connected components。它们都可以通过深度优先或广度优先搜索在线性时间内找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多